Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly nasm将两个实数输入到两个不同的数组中_Assembly_Nasm - Fatal编程技术网

Assembly nasm将两个实数输入到两个不同的数组中

Assembly nasm将两个实数输入到两个不同的数组中,assembly,nasm,Assembly,Nasm,我正在尝试将实数输入到两个不同的数组中 目前我有这段代码,但在我将最后一个浮点值输入array2之后,它就出现了seg故障 有什么想法吗 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

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

目前我有这段代码,但在我将最后一个浮点值输入array2之后,它就出现了seg故障

有什么想法吗


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\u loop
continue\u loop
的任何地方,我都无法检测到您实际上正在检查
ESI
的值,以查看您是否可以继续将
EBX
的值增加8个字节,用于从
readdouble
返回的四字。在递增
EBX
之前,您必须检查
EBX
指向的分配内存数组的剩余可用长度,我假设您可以从传递到
ESI
的信息构造该值(最好不要调用destroy
ESI
,否则必须将该值保存到堆栈或另一个被调用方保存寄存器中)

希望这有帮助


Jason

你到底为什么用汇编语言写这个?