用不到 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的主要内容,如果未能解决你的问题,请参考以下文章

C指针原理-AT&T汇编

C指针原理-AT&T汇编

AT&T汇编语法与x86语法基本区别

英特尔 AT&T 汇编程序的逐步执行?

AT&T汇编语言及其寻址方式

为啥这个 AT&T 汇编代码会出现分段错误?