【问题标题】:assembly macro for adding two 64bit numbers on a 32bit machine用于在 32 位机器上添加两个 64 位数字的汇编宏
【发布时间】:2015-06-29 13:01:50
【问题描述】:

我需要编写一个宏来在 32 位机器上添加 2 个 64 位。
我想到的一种方式如下:

%macro add_double 2
mov edx, %1
add %2,edx
mov edx,%1
shl edx,31
mov eax,%2
shl eax,31
add eax,edx
add %2,eax
%endmacro

这甚至会起作用吗? 我也想知道......有一种简单的方法可以使用 [] 但是可以在宏中执行 [%1] 吗?我是组装新手,所以我不知道。

【问题讨论】:

  • 这两个 64 位值在哪里?在两个 32 位寄存器对中?如果是这样,您的宏不需要 4 个参数吗?无论如何,您当前的实现对我来说看起来不正确。我没有尝试运行它,但看起来如果你给出 1 和 0 作为参数,你会得到 0x80000001 作为结果。
  • adc 就是为此专门发明的。

标签: assembly macros x86 nasm x86-16


【解决方案1】:

要添加 32 位块中的数字,您必须使用 add 设置 CF 的事实。所以低 32 位正常添加,高位添加 adc,其中包含进位标志。

这些宏应该做的

%macro add_double 4
mov eax, %1
mov edx, %2
add eax, %3
adc edx, %4
%endmacro

%macro add_doublev 2
mov eax, DWORD [%1]
mov edx, DWORD [%1+04h]
add eax, DWORD [%2]
adc edx, DWORD [%2+04h]
%endmacro

add_double 有 4 个 32 位数字,第一个是第一个数字的低 32 位,第二个是高 32 位。其他两个号码相同,但第二个号码。要将0xff00000000 添加到0x8800000000,请将其用作add_double 0, 0ffh, 0, 88h
add_doublev 需要 2 个地址,从中获取两个 64 位数字(小端序)。把它当作

num1 dd 0, 0ffh
num2 dd 0, 088h

add_doublev num1, num2

两个宏都在EDX:EAX 中计算结果,这意味着EDX 保存高32 位,EAX 保存低32 位。

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2016-05-17
    相关资源
    最近更新 更多