Assembly 装配NASM中分割后的无限循环

Assembly 装配NASM中分割后的无限循环,assembly,nasm,Assembly,Nasm,我试图在NASM汇编中编写一个程序,将十进制数转换为二进制数。 到目前为止,我编写了一些代码,将输入的数字除以2,然后显示余数。但我有一个问题,除法后我得到一个无限循环,事实上我在eax中总是有一个大于0的数 ; ---------------------------------------------------------------------------------------- ; nasm -felf decbin.asm && gcc decbin.o -o dec

我试图在NASM汇编中编写一个程序,将十进制数转换为二进制数。 到目前为止,我编写了一些代码,将输入的数字除以2,然后显示余数。但我有一个问题,除法后我得到一个无限循环,事实上我在eax中总是有一个大于0的数

; ----------------------------------------------------------------------------------------
; nasm -felf decbin.asm && gcc decbin.o -o decbin
; ----------------------------------------------------------------------------------------
section .data
    in_message  db  "Enter a number in decimal:",0 ;input message
    out_message db  "The binary number is:%d",10,0 ;output message
    integer times 4 db  0                  ;32bits integer
    formatin    db  "%d",0
    binary      db  2;used for div
section .text
    global  main
    extern  printf
    extern  scanf
main:
;;; Ask for integer
    push    in_message
    call    printf
    add esp,4       ;remove parameters

    push    integer     ;address of integer where number will be stored
    push    formatin    ;%d parameter, arguments are right to left
    call    scanf
    add esp,8       ;remove parameters

    mov eax,[integer]
    jmp loop
    ;;; terminate if zero
    mov al,1
    mov ebx,0
    int 80h
loop:
    xor edx,edx
    mov ebx,[binary]    ;mov binary to ebx
    div ebx
    push    edx
    push    formatin
    call    printf
    add esp,8
    cmp eax,0       ;compare the quotient with 0;
    jnz loop

一种常见的调用约定是将函数调用的返回值放入
eax
,由于
printf
返回打印的字符数,因此
%d”
格式字符串的返回值通常不为零(除非您有某种类型的输出失败)

因此,调用本身可能就是将
eax
设置为非零值的内容

要解决此问题,您需要在调用
printf
之前保存
eax
,然后通过更改以下内容来恢复:

push      edx
push      formatin
call      printf
add esp,  8
进入:


这将确保
printf
eax
所做的任何操作都是无关的,因为您自己正在保存和恢复它。

您应该进行一些调试。
push      eax        ; save here
push      edx
push      formatin
call      printf
add esp,  8
pop       eax        ; restore here