Assembly 在不到4行的AT&;汇编中编写此练习;T

Assembly 在不到4行的AT&;汇编中编写此练习;T,assembly,inline-assembly,att,Assembly,Inline Assembly,Att,我们从一个32位代码开始,例如:“AA BB CC DD”(little endian) 我们希望“AA DD CC BB”作为最终结果(big endian)。 我已经设法用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 a

我们从一个32位代码开始,例如:“AA BB CC DD”(little endian)

我们希望“AA DD CC BB”作为最终结果(big endian)。 我已经设法用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

我不确定att语法,但您可以这样做

bswap ebx    ; AA BB CC DD -> DD CC BB AA     Swap byte order
ror ebx, 8   ; DD CC BB AA -> AA DD CC BB     Roll right 8 bits

是的,有三个说明可以做到这一点。但我不想成为虐待狂。我既不希望你们贬低你们的同学,也不希望你们过早地放弃学习。“集会很有趣”。学习
x86
assembly的说明,您可能会找到更好的解决方案。在这里你会发现一个很好的答案。也许我误读了这个问题,但我不明白AA-DD-CC-BB是如何成为AA-BB-CC-DD的大端形式的。迈克尔·佩奇:你看不到,因为它不在那里。它由一个字节的大端数转换为小端数。@zx485:在3条指令中实现bswap非常简单,16位和32位旋转,但我不知道如何在不使用
bswap
(因为这将是2个INSN)的情况下,用3个总INSN实现bswap+ROR。有没有可能只是旋转?您是否需要第二个寄存器用于
shrd ebx、eax、16
/
mov bx、ax
或其他东西(看不出有什么帮助)?我假设
movd
/
pshufb xmm0,[mask]
/
movd
也不允许。您可以使用
以AT&t语法在一行上编写多条指令作为分隔符<代码>ror$16,%eax;例如,ror$8,%ax
。很明显,你是想问一些说明,而不是台词。你从中获得了乐趣。尽管如此,我还是要给你投票。很高兴能帮上忙:)哦!那不是讽刺。我很高兴阻止任何不是以“当然,你在现实生活中永远不会这样做,因为有一个方便的
bswap
指令。我不得不重新培训太多CS学生,重新实施快速排序,而不是使用经过测试的库。。。