处理将浮点值输入到数组中,然后将它们相加并获得总和
到目前为止我有这个代码,但是我的标志检查输入是否为0以退出循环以进入浮动,继续进行(无限循环)
到目前为止,我可以读取输入并立即输出,但不知道如何存储到数组
%include "asm_io.asm"
segment .bss
array1 resd 20
segment .data
done db "That was ridiculously incredible! Bye!", 0
segment .text
extern puts, _printf, scanf, dump_line, stack_dump, geomean
global asm_main
asm_main:
enter 0,0
pusha
;Declare Array:
push 5
push 0
push array1
call read_sarray32
;call getfloat
;call putfloat
xor ebx, ebx
mov eax, 1
int 80h
mov eax, done
call print_string
popa
leave
ret
;beginning of get float
;*******************************getFLoat:*****************************
segment .bss
;
segment .data
fmt1 db "%lf", 0
enterNumber db "Enter Your Float Number: ", 0
segment .text
getfloat:
push ebp
mov eax, enterNumber
call print_string
mov ebp, esp
sub esp, 8
lea eax, [ebp-8]
push eax
push fmt1
call scanf
add esp, 8
fld qword [ebp -8]
mov esp, ebp
pop ebp
ret
;Beginning of putfloat
;************************putfloat:*****************************************
segment .bss
;
segment .data
fmt2 db 10, "The number is: %f", 10, 10
segment .text
putfloat:
push ebp
mov ebp, esp
sub esp, 8
fst qword [ebp - 8]
push fmt2
call printf
add esp, 12
mov esp, ebp
pop ebp
ret
;*********************READ array*************************************************
segment .bss
;
segment .data
prompt2 db "Do you have more inputs? (-1 = yes,0 = no)?: ", 0
segment .text
read_sarray32:
pusha
mov ebx, [esp+36] ;move starting position into ebx
mov edx, [esp+40] ;move max size into edx
mov ecx, 0
read_loop:
;mov eax, prompt2
;call print_string
;call read_int
call getfloat
inc ecx; increment counter
call print_nl
call putfloat
call print_nl
cmp eax, 0
jz Done
jmp continue_loop
continue_loop:
mov [ebx], eax ;move value into memory slot ebx
add ebx, 4 ;move to next location for db word
cmp ecx, edx ; did i reach maximum values of array size?
jz Done
jmp read_loop
Done:
call putfloat
sub ecx, 1 ;to offset the 0 that was entered to exit loop
mov [esp+44], ecx ;moves counter back to stack
popa
ret
答案 0 :(得分:2)
我不确定你的问题到底是什么(提示得到好的答案:总是说清楚你问的是什么问题)但是......
您似乎期望您的浮点数位于eax
。它为什么会在那里?那是一个整数寄存器。您的getfloat
例程将其读取的数字放在浮点堆栈上。
当输入0以响应prompt2
时,很难说你的代码在终止循环时可能出现了什么问题,因为该代码不再存在: - )。
显然这不是您的问题,但您jmp continue_loop
紧跟着continue_loop
标签。这是从早期版本的代码中遗留下来的吗?
我认为您在ebx
开头附近加载edx
和read_sarray32
的堆栈偏移是错误的;你忘记了call
将返回地址压入堆栈吗?具体来说,我认为你得到ebx
=随机废话和edx
= 0;因为你的代码相当于一个do ... while循环,它将永远运行 - 或者至少进行2 ^ 32次迭代。