我尝试在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
是我输入结果之间间距的方式。提前谢谢!
答案 0 :(得分:0)
div ebx
将ebx
除以eax
,并将余数放在edx
中。这是因为ebx是一个4字节除数。
你似乎期待ah
中的余数。我相信如果你使用
div bl
因为bl
是一个1字节的除数。对于1个字节的除数,结果为al
,余数为ah
。请参阅https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic。
编辑:
正如一些人所提到的那样,你必须提前清除剩余的目的地,{4}用于4字节的情况,edx
用于1字节的情况。