сборка nasm вводит значения с плавающей запятой в массив

работая над вводом значений с плавающей запятой в массив, затем складывая их и получая сумму

пока у меня есть этот код для него, но мой флаг, который проверяет, равен ли ввод 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

person John    schedule 14.03.2011    source источник


Ответы (1)


Я не совсем понимаю, в чем именно заключается ваш вопрос (подсказка для получения хороших ответов: всегда поясняйте, какой вопрос вы задаете), но ...

  1. Похоже, вы ожидаете, что ваше число с плавающей запятой будет в eax. Почему это могло быть там? Это целочисленный регистр. Ваша getfloat процедура помещает прочитанное число в стек с плавающей запятой.

  2. Трудно сказать, что могло быть не так в вашем коде для завершения цикла при вводе 0 в ответ на prompt2, поскольку этого кода больше нет :-).

  3. Очевидно, это не ваша проблема, но у вас есть jmp continue_loop, сразу за которым следует метка continue_loop. Это осталось от более ранней версии кода?

  4. Я думаю, что смещения стека, из которых вы загружаете ebx и edx в начале read_sarray32, неверны; вы забыли, что call помещает адрес возврата в стек? В частности, я думаю, что вы получаете ebx = случайную чушь и edx = 0; поскольку ваш код выполняет эквивалент цикла do ... while, он будет работать вечно - или, по крайней мере, для 2 ^ 32 итераций.

person Gareth McCaughan    schedule 14.03.2011
comment
Привет, спасибо за ответ, я смог понять, как читать в массиве с плавающей запятой и распечатывать их. - person John; 17.03.2011
comment
теперь я работаю над тем, как вычислить сумму значений с плавающей запятой в текущем массиве ... - person John; 17.03.2011