首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用汇编语言解决这个问题?

如何用汇编语言解决这个问题?
EN

Stack Overflow用户
提问于 2014-02-10 15:06:43
回答 2查看 161关注 0票数 1

我需要将DX寄存器设置为-5,但仅通过使用逻辑运算符(除否外)、移位/旋转运算符和NEG,不允许任何其他指令(不分配常量)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 17:21:34

除非我们假设某个寄存器包含一个非零值,否则这是不可能的。证明:

根据Intel 64和IA-32架构软件开发人员手册,2013年3月,逻辑指令(5.1.4)是AND、OR、XOR和NOT,移位和旋转指令(5.1.5)是SAR、SHR、SAL/SHL、SHRD、SHLD、ROR、ROL、RCR和RCL。根据问题陈述,不排除,但包括NEG。

对这些指令(不包括NOT )的检查表明,如果输入寄存器和进位标志都是零,则它们都不会产生非零结果,从而产生寄存器或进位标志。

我们可以合理地假设堆栈指针在任何正常ABI中都不是零。这使我们能够生产-5:

  • 如果不知道DX为零,则XOR本身将其设置为零。
  • 使用OR将堆栈指针移动到另一个寄存器。
  • 在新的登记簿上应用NEG。这就设置了CF。
  • 在DX上应用RCL (没有显式的移位量,默认为1位)。这会产生1英寸的DX。
  • 在DX上应用NEG,SHL,ROL,ROL。这会操纵钻头产生-5。
票数 2
EN

Stack Overflow用户

发布于 2014-02-10 15:40:33

我认为使用任何常数都是被禁止的。

怎么样(Intel格式):

代码语言:javascript
复制
XOR DX, DX       # DX=0
STC              # DX=0, carry flag set
RCL DX, DX       # DX=1
ROL DX, DX       # DX=2
STC              # DX=2, carry flag set
RCL DX, DX       # DX=5
NEG DX           # DX=-5

没有STC,我无法立即想出一种简洁的方法来实现这一点。您必须使用一些操作符(NOT除外)将寄存器设置为0以外的其他内容,而无需使用任何常量。我讨厌的方式应该是(我的80x86已经生锈了)

代码语言:javascript
复制
XOR AX, AX      # Now we know IP is not zero, i.e. at least one bit is 1
XOR BX, BX
OR AX, IP
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX
ROL AX, AX
OR BX, AX        # Now we know BX=0xFFFF, as the bit that was 1 has been put
                 # in each of the 16 bits
XOR DX, DX       # DX=0
RCL BX, BX       # DX=0, carry flag set
RCL DX, DX       # DX=1
ROL DX, DX       # DX=2
RCL BX, BX       # DX=2, carry flag set
RCL DX, DX       # DX=5
NEG DX           # DX=-5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21680674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档