【发布时间】:2018-08-27 09:32:35
【问题描述】:
%include "asm_io.inc"
segment .data
outmsg1 db "Input Integer: ", 0
outmsg2 db "After Operation": ", 0
segment .bss
input1 resd 1
input2 resd 1
segment .text
global asm_main
asm_main:
enter 0,0
pusha
mov eax, outmsg1
call print_string
call read_int
call print_nl
dump_regs 1
rol eax, 8
rol ax, 8
ror eax,8
mov ebx, 0
mov ebx, eax
dump_regs 2
popa
mov eax, 0
leave
ret
给定上述汇编程序,它将最高值字节与给定整数的最低值字节交换。我试图弄清楚如何让它用最低价值的 BIT 交换最高价值的 BIT。
我有点卡住了,也许你能帮帮我
【问题讨论】:
-
您可以在这里找到一种可能的解决方案:stackoverflow.com/a/42246795/4271923(虽然奇偶校验标志仅由低 8 位操作更新,因此直接使用
test + jpe + xor的这种策略,您将拥有首先将最高位移动到最低 8 位,然后返回 .. 像rol eax,1test eax,3jpe to_rorxor eax,3ror eax,1) ... 其他选择是使用更多的寄存器来分别提取每个位并重新组合背部。由于避免了分支,extract+compose 可能会更快,但会破坏更多的寄存器并且需要更多的行。 -
我不认为
rol/ror序列是字节交换。看起来你去了abcd -> bcda -> bcad -> dbca。所以你错过了交换中间两个字节。除了bswap之外,正常的方式(Reverse byte order of EAX register)是rol ax,8/rol eax,16/rol ax,8。顺便说一句,x86 没有位反转指令,但有趣的事实是:ARM 有。 (rbit)。易于硬件有效地提供此操作。在 x86 上,最好的办法是使用 SSSE3pshufb并行查找每个字节的每一半的 4 位。 -
AVX2 与我建议的内在版本:avx2 register bits reverse。如果需要 asm,请查看编译器输出。之前使用
movd xmm0, eax,之后使用movd eax, xmm0。 -
@PeterCordes 我认为字节交换版本不会“错过中间两个字节”,因为这不是故意的。 “用最低值字节交换最高值字节的程序”(仅交换低/高字节)。此外,仅对顶部和底部位请求位交换。我强烈怀疑这不是实际任务,而只是位/字节操作的练习,这对我来说似乎很好。
-
@Ped7g:哦!你是对的,我没有仔细阅读。
标签: assembly x86 bit-manipulation nasm