【问题标题】:Assembly division returns non-number [duplicate]装配部门返回非数字[重复]
【发布时间】: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 是消息“余数是:”。 num1num2 是输入数字。 spacer 是我在结果之间输入间距的方式。提前致谢!

【问题讨论】:

  • 如果您可以提供 MCVE,那么我可能会想运行您的程序并查看问题所在。在查看寄存器值的同时,您是否使用 gdb 逐行检查了每一行?
  • 原谅我的无知,但我不知道MCVE和gdb是什么。正如我所说,我今天才开始学习汇编。
  • div ebxedx:eax/ebx,商在eax,余数在edx
  • @DavidGrayson:在 cmets 中,[mcve] 扩展为 minimal reproducible example

标签: linux assembly nasm i386


【解决方案1】:
div   ebx

ebx 除以eax,并将余数放入edx。这是因为 ebx 是一个 4 字节的除数。

您似乎期待ah 中的剩余部分。我相信你会得到你想要的,如果你使用

div   bl

因为bl 是一个 1 字节除数。对于 1 字节除数,结果进入 al,余数进入 ah。见https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic

编辑:

正如一些人所提到的,您必须提前清除余数的目的地,edx 用于 4 字节的情况,ah 用于 1 字节的情况。

【讨论】:

  • 来自 Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2: DIV r/m32 [...] EDX:EAX 除以 r/m32 的无符号数,结果存储在 EAX 中 ←商,EDX ← 余数。
  • 我试过这样做,但现在我得到一个Floating Point Error 并且其余代码没有执行。同样,测试数字 4 和 2 的情况,所以我不明白为什么会涉及任何浮点数。
  • 正如其他人所提到的,您需要在除法之前清除股息的高部分。在div ebx 的情况下为edx,在div bl 的情况下为ah。请参阅英特尔® 64 和 IA-32 架构软件开发人员手册,其中介绍了 DIV 指令和所有其他 x86/x86-64 指令。
  • 假设我正确清除了ah 寄存器(使用mov ah, 0h),它仍然无法正常工作。虽然,我什至不认为需要清除 ah 寄存器,因为它从来没有设置在首位(除非更高的寄存器使用它并且我的理解是错误的)。
  • 值得告诉你的是,我在 .bss 部分中将quot 定义为quot resb 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2012-12-26
相关资源
最近更新 更多