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