装配部门返回非数字

时间:2016-08-29 19:22:23

标签: linux assembly nasm i386

我尝试在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是消息“余数是:”。 num1num2是输入数字。 spacer是我输入结果之间间距的方式。提前谢谢!

1 个答案:

答案 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字节的情况。