【发布时间】:2016-08-29 19:22:22
【问题描述】:
我尝试在 Assembly 中编写我的第一个非常简单的程序。它应该以两位数作为输入,并对其进行加减乘除。我目前不关心当您输入 5 和 5 之类的数字时程序的执行情况(其总和和乘积无法正确显示),因为我仍在学习,稍后将进一步扩展程序。现在,除了除法之外,一切都像魅力一样运作。例如,当输入 4 和 2 时,它会返回商下的字母“r”。应该这样做的代码是:
;lastly, division
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg6
mov edx, len6
int 0x80
mov ax, [num1]
sub ax, '0'
mov ebx, [num2]
sub ebx, '0'
div ebx
add al, '0'
add ah, '0' ;in case there is a remainder
mov [quot], al
mov [rem], ah
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, quot
mov edx, 1
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, spacer
mov edx, len8
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg7
mov edx, len7
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, rem
mov edx, 1
int 0x80
为了记录,msg6 只是消息:“商是:”,msg7 是消息“余数是:”。 num1 和 num2 是输入数字。 spacer 是我在结果之间输入间距的方式。提前致谢!
【问题讨论】:
-
如果您可以提供 MCVE,那么我可能会想运行您的程序并查看问题所在。在查看寄存器值的同时,您是否使用 gdb 逐行检查了每一行?
-
原谅我的无知,但我不知道MCVE和gdb是什么。正如我所说,我今天才开始学习汇编。
-
div ebx是edx:eax/ebx,商在eax,余数在edx。 -
@DavidGrayson:在 cmets 中,
[mcve]扩展为 minimal reproducible example。