汇编程序:将3行转为1

时间:2016-07-09 20:22:24

标签: assembly x86

问题(我的问题在于B):

假设DX = 0XDB00

A)在这些命令之后DH的价值是什么:

SHR DX, 1
OR  DH,DL
XOR DL, DL

B)写1行代替上面3行

这就是我所要做的:

enter image description here

起初我想,也许它的“SHR AH,1”但是这会让MSB 0而不是1。 我也尝试过查看DEC和HEX值而没有找到模式的运气。

注意:我开始认为问题写得很糟糕,他们的意思是如何在DX为0XDB00的特定情况下得到我们在A中得到的结果。虽然答案可能只是mov DX,0xED00

,但这听起来不对

2 个答案:

答案 0 :(得分:2)

答案应该是ror dh, 1吗?

dl已经为0时,它给出与序列相同的结果,但在DX保持任意16位值的一般情况下不起作用。如果你不能这样认为,我不认为这个问题是可以回答的(除非你把它作为"一行",并且只是在同一行上放置多个指令,这是至少可以在GAS和NASM语法中使用。)

这里原来如何做一个旋转(假设DL为零):

SHR总是将高位置零,并将DH的低位移到DL的高位。

OR将DH的高位设置为移位到DL的高位的位。 (如果最初DL非零,那些位将影响DH)

XOR再次将DL归零。

答案 1 :(得分:0)

ADD DX,1200将获得与上述3行相同的DX寄存器结果。 为此使用了ollydbg,打开了我的一个程序并对其进行了编辑。 首先,我测试了你给我的代码 MOV DX,0xDB00 SHR DX,1 OR DH,DL XOR DL,DL
然后我检查了DX寄存器。 一旦我有了价值,我就需要使用十六进制计算器。