在两个不同的数组中输入两个实数



我正在尝试将实数输入两个不同的数组

目前我有这个代码,但它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_loopcontinue_loop中,我无法检测到您实际上正在检查ESI的值,以查看您是否可以将EBX的值增加8个字节,以用于从readdouble返回的四字。在这个循环的某个地方,在你增加EBX之前,你将不得不检查由EBX指向的分配内存数组的可用剩余长度,这是一个值,我假设你可以从传递到ESI的信息中构建(希望你调用的函数都不会破坏ESI,否则你将不得不将该值保存到堆栈或另一个被调用者保存寄存器)。

希望有帮助,

杰森

最新更新