gpt4 book ai didi

assembly - 如何在Assembly中字节数的2位之间交换

转载 作者:行者123 更新时间:2023-12-01 23:02:50 29 4
gpt4 key购买 nike

*我正在使用程序集 8086 (x86-32)

交易很简单,我在寄存器 AL(8 位)中有一个字节大小的数字,
现在,我需要在寄存器 AL 中的数字的第 1 位(右起第二个)和第 4 位(右起第五个)之间进行交换。

例如:如果 Al 有这个数字:00010000B 现在它将有 00000010B。

谢谢!

最佳答案

一到两个指令回答:

and eax, $255; // mask off extra bits  -- perhaps not needed, if upper bits are 
mov al, look_up_table[eax] // guaranteed to be zero

单独使用 al 的三个指令。
test al, $0x12
jpe skip ;; parity was even (aka the bits are the same)
xor al, $0x12 ;; toggle both bits
skip:

操作原理:比特只有在不同时才需要交换。
通过与 1 异或,0 变为 1,1 变为 0。
两个位同时受到影响。

如果有条件 cmovpo 或 cmovpe,则可以避免跳转。但在这种情况下,该序列至少需要 4 条指令(取决于已知某个寄存器包含零还是位掩码)。

或者,如果 & 掩码只有一位设置,则可以选择测试。这是用表达式 (a== (a&-a))

关于assembly - 如何在Assembly中字节数的2位之间交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13207434/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com