Assembly 如何在不使用其他寄存器的情况下镜像字节?

Assembly 如何在不使用其他寄存器的情况下镜像字节?,assembly,x86,Assembly,X86,假设我在AL中有这个字节:0110001 应用镜像函数后,我希望字节为10000110 我想到的所有想法都必须使用其他寄存器,但我很好奇是否有一种方法可以在不使用任何其他寄存器的情况下镜像字节?通过立即数在代码中存储”变体: 编辑:关于我在问题和一般回答下的评论是否有办法 你应该先问一下数学理论。在您的情况下,您正在确定地将8位信息更改为其他8位信息结果,并且所需的最小修改步骤是“交换两位”,如果没有第三位作为临时存储,这是不可能的,因此您现在正在寻找一种无需额外寄存器(“和内存”)即可补充临

假设我在AL中有这个字节:
0110001
应用镜像函数后,我希望字节为
10000110

我想到的所有想法都必须使用其他寄存器,但我很好奇是否有一种方法可以在不使用任何其他寄存器的情况下镜像字节?

通过立即数在代码中存储”变体:


编辑:关于我在问题和一般回答下的评论是否有办法

你应该先问一下数学理论。在您的情况下,您正在确定地将8位信息更改为其他8位信息结果,并且所需的最小修改步骤是“交换两位”,如果没有第三位作为临时存储,这是不可能的,因此您现在正在寻找一种无需额外寄存器(“和内存”)即可补充临时存储的方法我确实给自己添了一些东西)

因此,如果您想镜像
al
,而不更改其他寄存器(不计算
rip
eflags
,因为这将是99%完全不可能的),您需要在别处“借用”这个额外的位

由于数字计算机是图灵式机器,您可以使用代码指令位交换寄存器/存储器中丢失的位,因此理论上可以=>QED

在那个基本的“验证”问题之后,问题只是找出,什么样的代码结构提供了额外的信息位存储和交换位

最直接的方法是按位值进行分支,即测试al,0x01;else位\u 0\u设置分支跟随(然后每个分支可以对目标位进行正确的设置/重置,使其看起来像是交换了它们)。。。我不敢这样写完整的代码(太长,太乏味),但这是上述解决方案的根源之一

解决方案的另一个根源是将此代码思想与“必须真正完成的事情”对立起来,即“在特定位置交换位”。但是,当比特已经具有相同的值=不需要交换时,这可以优化。当两位不同时,“交换”两位可以通过简单的
xor
翻转两位来实现

在我将所有这些想法列合并到一个解决方案中之后,我得到了上面几乎所有的东西,然后我只是对它进行了一点清理(比如计算出“两个位是相同的”测试可以简化为单个
测试+jpe
),并验证了它的有效性


但无论何时有疑问,只要记住图灵机器是如何工作的:))(半玩笑,我不想在图灵机器语言中编写任何中等大小的算法,即使是在使用复杂的机器/语言如x86或C++之后,即使是一个短的算法也会很恼人。但是,在基础水平上验证任务还是很好的,无论图灵是否有意义)。“其他寄存器”是否包括AH、AX、EAX和RAX作为其他寄存器?-我认为这可能需要几个操作(除非
BSWAP AL
工作?),但由于您只使用单个字节,因此可以使用AH存储AL的操作结果,从而充分利用单个寄存器(AX)@series0ne well OP说反转位,而不是反转字节基本上有两种方法……要么从额外的代码指令中“借出”存储空间,用指令中编码的立即数替换“其他寄存器”,要么使用进位标志(或其他标志)对于存储空间。起初我认为有一些ROL/RCR的组合可以优雅地利用CF,但经过一段时间的思考,到目前为止我还没有意识到这一点,而直接的变体有点明显,但编写起来很乏味(许多代码行)。无论如何,你肯定要有至少1位的额外存储空间,没有第三条带“swap”指令的指令,你不能交换两位。哦,当然256字节长的LUT(查找表)也可以工作…:D我怎么能忘记提到这个…:)(8位时代“计算”任何东西的基本方法)很好,我不经常在行动中看到对等标志真的是一个优雅的解决方案谢谢你详细的回答。太棒了!
mirror_bits:
    ; handle bits 0 and 7
    TEST    al,0x81
    JPE     bits07same
    XOR     al,0x81
bits07same:
    ; handle bits 1 and 6
    TEST    al,0x42
    JPE     bits16same
    XOR     al,0x42
bits16same:
    ; handle bits 2 and 5
    TEST    al,0x24
    JPE     bits25same
    XOR     al,0x24
bits25same:
    ; handle bits 3 and 4
    TEST    al,0x18
    JPE     bits34same
    XOR     al,0x18
bits34same:
    RET