我正在尝试将实数输入2个不同的数组
目前我有这个代码,但是在我将最后一个浮点值输入到array2之后就立即出现了错误,
任何想法?
segment .bss
;
segment .data
prompt1 db "Do you have data to enter? (-1 = yes,0 = no)?: ", 0
prompt2 db "Enter your Float Value: ", 0
prompt3 db "Almost done ",0
segment .text
extern readdouble,print_string, read_int
global readarray
readarray:
pusha
mov ebx, [esp+36] ;move starting position into ebx
mov esi, [esp+40] ;move max values into edx
mov edi, 0 ;initialize counter to zero
read_loop:
mov eax, prompt1
call print_string
call read_int ;read in decision for prompt
inc edi; increment counter
cmp eax, 0
jz Done_reading_array1
jmp continue_loop
continue_loop:
mov eax, prompt2
call print_string
call readdouble
mov [ebx], ecx ;move value into memory slot ebx
mov [ebx+4], edx
add ebx, 8 ;move to next location for db word
jmp read_loop
Done_reading_array1:
sub edi, 1
mov [esp+40], edi ;moves counter back to stack
jmp read_array2
read_array2:
mov ebx, [esp+68] ;move starting location of array1 into ebx
;mov esi,[esp+80] ;move number of items into esi
mov ebp, 0
continue_readarray2:
mov eax, prompt2
call print_string
call readdouble
mov [ebx], ecx ;move value into memory slot ebx
mov [ebx+4], edx
inc ebp
add ebx, 8 ;move to next location for db word
cmp ebp, edi
jz done_reading_array2
jmp continue_readarray2
done_reading_array2:
;mov [esp+72],edi
mov eax, prompt3
call print_string
popa
ret
答案 0 :(得分:0)
我不认为你应该在第二个循环中使用这样的EBP,因为你搞砸了堆栈帧 - 为什么不把ESI用作计数器呢。
答案 1 :(得分:0)
我没有看到你在readarray
中对分配的数组的长度进行任何边界检查。例如(也许是因为你的标签搞砸了),但你似乎将EBX
设置为数组的起始值,并将ESI
设置为该数组的长度。但是在read_loop
和continue_loop
内部我无法检测到您实际上是在检查ESI
的值,看看是否可以将EBX
的值增加8个字节对于从readdouble
返回的四字词。在递增EBX
之前,在该循环中的某处,您将不得不检查EBX
所指向的已分配内存数组的可用剩余长度,这是我假设您可以使用的值从传递给ESI
的信息构造(并且希望你所调用的函数都不会破坏ESI
,否则你将不得不将该值保存到堆栈或另一个callee-save寄存器中)。
希望这有帮助,
杰森