【发布时间】:2016-04-09 15:55:18
【问题描述】:
我们从 32 位代码开始,例如:“AA BB CC DD”(小端序)
我们希望“AA DD CC BB”作为最终结果(大端)。 我已经设法将它写成 8 行,以 %ebx 作为入口,以 %ecx 作为出口。老师提到可以用不到 4 行来写这个,3 是记录。我很想知道如何缩短它。
mov %R1, %ebx
mov %bx, %cx
shl $16, %ecx
mov %cl, %dl
mov %bl, %cl
mov %bh, %dh
shr %16, %edx
and %edx, %ecx
【问题讨论】:
-
是的,可以通过三个指令来做到这一点。但我避免虐待狂。我既不希望你贬低你的同学,也不希望你过早地放弃学习汇编。 组装很有趣'。研究
x86汇编的说明,您可能会找到更好的解决方案。在这里你会找到一个很好的starting point。 -
也许我误读了这个问题,但我不明白 AA DD CC BB 是 AA BB CC DD 的大端形式。
-
@Michael Petch:你看不到它,因为它不存在。它是 big-endian 转换为 little-endian
ROR'ed一个字节。 -
@zx485:在 16 位和 32 位旋转时,在 3 条指令中实现 bswap 很简单,但我不知道如何在不使用
bswap的情况下用 3 个总 insn 实现这个 bswap + ror(因为将是2个insns)。是否可以仅旋转?您是否需要shrd ebx,eax, 16/mov bx,ax或其他东西的第二个注册(看不出有什么帮助)?我假设movd/pshufb xmm0, [mask]/movd也是不允许的。 -
您可以在 AT&T 语法中以
;作为分隔符在一行上编写多条指令。ror $16, %eax; ror $8, %ax,例如。不过,显然你的意思是询问指令,而不是台词。
标签: assembly inline-assembly att