用不到 4 行汇编编写这个练习 AT&T
Posted
技术标签:
【中文标题】用不到 4 行汇编编写这个练习 AT&T【英文标题】:Write this exercise in less than 4 lines assembly AT&T 【发布时间】: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
,例如。不过,显然你的意思是询问指令,而不是台词。
【参考方案1】:
我不确定 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
【讨论】:
您从中获得了乐趣。不过,我必须给你一票。 乐于助人 :) 哦!那不是讽刺。我很乐意阻止任何不以“当然,你在现实生活中永远不会这样做,因为有一个方便的bswap
指令。我不得不重新培训太多重新实现快速排序的 CS 学生而不是使用经过测试的库...以上是关于用不到 4 行汇编编写这个练习 AT&T的主要内容,如果未能解决你的问题,请参考以下文章