【问题标题】:Assembly return in 64 bits a sum of two numbers of 32 bits [closed]程序集以 64 位返回两个 32 位数字的总和 [关闭]
【发布时间】:2016-01-12 15:00:33
【问题描述】:

A + B(均为 32 位)。 该函数将返回一个 64 位的值 我该怎么办?

【问题讨论】:

  • 我必须做什么? 指定架构并展示你所得到的。一般来说,将操作数扩展为 64 位并添加它们。
  • 这是我的问题。我如何将操作数扩展到 64 位?架构是 x86
  • 2 个 32 位数字会导致最坏情况下的 33 位数字,只需从那里扩展符号即可。 32 位加法的进位标志将向您显示在其他 32 位中放入的内容,无论是全一还是全零。这可能会击败我打赌导致添加的练习,然后是带有进位的添加......
  • 您的代码是 32 位还是 64 位?你看过指令集参考吗?你的号码是签名还是未签名?你用的是哪个汇编器?
  • 我的密码是32,无符号数!在 NASM 中

标签: assembly x86 sum nasm


【解决方案1】:

假设堆栈上的输入并按照正常约定得到edx:eax

xor edx, edx       ; high dword
mov eax, [esp + 4] ; 1st arg
add eax, [esp + 8] ; add 2nd arg
adc edx, 0         ; handle carry
ret

【讨论】:

  • 或者用adc edx, edx保存一个字节,因为它已经归零了。不过,更难阅读源代码。或者setc dl 在 Intel CPU 上可能更快(adc 解码为两个微指令),但前提是您不立即使用 edx(pre-haswell 的部分寄存器惩罚)。
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2017-04-07
  • 2014-11-01
  • 2019-08-17
  • 2012-11-07
相关资源
最近更新 更多