【问题标题】:Divide a Dword by a word nasm将一个 Dword 除以一个单词 nasm
【发布时间】:2018-04-21 14:15:53
【问题描述】:

我正在尝试对 DX:AX 中的 dword 进行有符号除法,假设 1234567 带有单词 [b]=10。

a dd 1234567
b dw 10
mov ax,[a]
mov dx,[a+2]
idiv word [b]

商应该是 123456,但它太大了,所以它不适合 ax。我应该怎么做才能解决这个问题?

【问题讨论】:

  • 使用 64 位除法(如果可用)。否则,请自行实施。
  • 所以我应该将 dword 转换为 qword 并将 word 转换为 dword 并进行有符号除法?
  • 是的,就是这样。
  • @Jester 所以我这样做了:mov ax,[b];顺时针;移动 [e],ax;移动斧头,[a];移动 dx,[a+2]; cdq; idiv 双字 [e] 。但这只会将 eax 除以 [e] ,因为考虑到 edx=0。
  • mov eax, [a] / cdq / mov ecx, 10 / idiv ecx。如果您有可用的 32 位操作数大小,则将所有 a 放入 eax 中,就像您通常对任何其他 32 位操作一样。然后使用 64b / 32b => 32b 除法,上半部分被除数 = 0。(cdq 符号将eax 扩展为edx:eax。要设置div 而不是idiv,请使用@987654334 @)

标签: assembly x86 nasm division extended-precision


【解决方案1】:

您显然有可用的 32 位操作数大小,因此不仅仅用于 idiv dword [b](它在 16 位 b 之外读取,因此不可能正确)。

mov eax, [a]
cdq
mov ecx, 10      ; or  movsx ecx, word [b]  to load with sign-extension
idiv ecx

您将所有a 放入eax,就像您通常对任何其他32 位操作一样。然后你使用 64b / 32b => 32b 除法和一个微不足道的上半部分(符号或零扩展)。

cdq 符号将eax 扩展为edx:eax。要设置 div 而不是 idiv,请使用 xor edx,edx 将上半部分归零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多