【问题标题】:Assembly [ASM]: Adding without using arithmetic operators汇编 [ASM]:在不使用算术运算符的情况下添加
【发布时间】:2017-01-24 18:44:40
【问题描述】:

如果没有addadcsubsbbincdec,如何将两个寄存器相加?

【问题讨论】:

  • 你忘了说什么架构。对于 x86,您可以使用LEA
  • @Jester For x86
  • @Jester movd mm0,eax; movd mm0,ecx; paddd mm0,mm1; movd eax,mm0 怎么样?
  • x86 是(某种程度上)图灵完备的,仅使用 MOV 指令,使用内存寻址模式进行数学运算:stackoverflow.com/a/44799928/224132。 (当然LEA可以直接用地址模式语法和机器编码做加法,但不能做减法。虽然你没有提到neg,所以neg+lea可以减法。)

标签: assembly x86 add


【解决方案1】:

老实说,我只是把this answer翻译成汇编,求和的数字在axbx,而寄存器cxdx用于得到中间结果,最终结果在dx

  mov ax, 12801  ;◄■■ FIRST NUMBER.
  mov bx, 2017   ;◄■■ SECOND NUMBER.

l1:

  mov cx, ax
  and cx, bx

  mov dx, ax
  xor dx, bx

  mov ax, cx
  shl ax, 1

  mov bx, dx

  cmp ax, 0   ;◄■■ IF AX != 0 REPEAT.
  jne l1

;RESULT IN DX = 14818

【讨论】:

  • 非常复杂。 mov si, ax; lea dx, [bx+si] 怎么样(如果我们坚持没有人说的 16 位)。
  • 我非常渴望优化您在此处提供的代码,但这完全是荒谬的,因为如果您真的想要优化代码,您会使用add
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2015-02-16
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多