我正在尝试将实数输入两个不同的数组
目前我有这个代码,但它segfault后,我完成输入最后一个浮点值到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
我认为你不应该在第二个循环中使用这样的EBP,因为你搞砸了堆栈框架-为什么不使用ESI作为计数器
我没有看到您在readarray
中对分配的数组的长度进行任何边界检查。例如(也许是因为你的标签在这里搞砸了),但你似乎将EBX
设置为数组的起始值,并将ESI
设置为该数组的长度。但是在read_loop
和continue_loop
中,我无法检测到您实际上正在检查ESI
的值,以查看您是否可以将EBX
的值增加8个字节,以用于从readdouble
返回的四字。在这个循环的某个地方,在你增加EBX
之前,你将不得不检查由EBX
指向的分配内存数组的可用剩余长度,这是一个值,我假设你可以从传递到ESI
的信息中构建(希望你调用的函数都不会破坏ESI
,否则你将不得不将该值保存到堆栈或另一个被调用者保存寄存器)。
希望有帮助,
杰森