我需要将DX寄存器设置为-5,但仅通过使用逻辑运算符(除否外)、移位/旋转运算符和NEG,不允许任何其他指令(不分配常量)。
发布于 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:
发布于 2014-02-10 15:40:33
我认为使用任何常数都是被禁止的。
怎么样(Intel格式):
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已经生锈了)
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=-5https://stackoverflow.com/questions/21680674
复制相似问题