【问题标题】:Write this exercise in less than 4 lines assembly AT&T用不到 4 行汇编编写这个练习 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,例如。不过,显然你的意思是询问指令,而不是台词。

标签: assembly inline-assembly att


【解决方案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 学生而不是使用经过测试的库...
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多