【问题标题】:xorl %eax - Instruction set architecture in IA-32xorl %eax - IA-32 中的指令集架构
【发布时间】:2014-06-27 20:28:42
【问题描述】:

我在解释这个练习时遇到了一些困难;

xorl 在这个程序集 sn-p 中究竟做了什么?

C 代码:

int i = 0;
if (i>=55)
    i++;
else
    i--;

组装

xorl ____ , %ebx
cmpl ____ , %ebx
Jel  .L2
____ %ebx
.L2:
____ %ebx
.L3:

装配部分发生了什么?

【问题讨论】:

  • 您确定您在 asm 中正确发布了倒数第二行吗? (, 是否可能属于.L2: 上方的行?)
  • 对不起,你是对的,有错误。 ',' 不属于 bellow 或 above,删除它。
  • 在这种情况下,asm 与提供的 C 代码不匹配,因为至少缺少 1 个跳转(在第 3 个空白行和 .L2: 行之间)。或者您是否可以在一个空格中输入add 2, 之类的内容?
  • pede ajuda ao proença ;)

标签: c assembly x86 att instruction-set


【解决方案1】:

大概是:

xorl %ebx, %ebx

这是在 x86 上清零寄存器的常用习惯用法。这将对应于 C 代码中的i = 0


如果你好奇“但是为什么?”简短的回答是xor 指令的字节数比mov $0, %ebx 少。 The long answer includes other subtle reasons.

我将省略剩下的练习,因为没有任何特殊之处。

【讨论】:

【解决方案2】:

这是与您的 C 代码等效的已完成和注释的程序集:

xorl %ebx , %ebx    ; i = 0
cmpl $54, %ebx
jle  .L2            ; if (i <= 54) jump to .L2, otherwise continue with the next instruction (so if i>54... which equals >=55 like in your C code)
addl $2, %ebx         ; >54 (or: >=55)
.L2:
decl %ebx            ; <=54 (or <55, the else-branch of your if) Note: This code also gets executed if i >= 55, hence why we need +2 above so we only get +1 total
.L3:

因此,这些是对所有数字 >=55 执行的(算术)指令:

addl $2, %ebx
decl %ebx

所以对于 >=55 的数字,这等于递增。以下(算术)指令对

decl %ebx

我们跳过addl $2, %ebx 指令,所以对于数字

如果您不允许在一个空格中输入 addl $2,(因为它不仅是指令而且是参数),那么您给出的 asm 代码中可能有错误(缺少行之间的跳转) 4 和 5 到 .L3)。


另请注意,jel 显然是问题中jle 的拼写错误。

【讨论】:

  • 非常感谢ccKep的回答,我稍后再看,因为我会先尝试自己解决这个练习。
【解决方案3】:

XORL 用于将寄存器初始化为零,主要用于计数器。 ccKep 的代码是正确的,只是他增加了一个错误的值,即。 2 而不是 1。因此正确的版本是:

xorl %ebx , %ebx     # i = 0
cmpl $54, %ebx      # compare the two
jle  .L2           #if (i <= 54) jump to .L2, otherwise continue with   the next instruction (so if i>54... which equals >=55 like in your C code)

incl %ebx         #i++
jmp .DONE        # jump to exit position

.L2:
decl %ebx      # <=54 (or <55

.DONE:

【讨论】:

  • ccKep 的代码有效:它始终运行dec,因此它需要先运行add $2,然后才能通过dec 获得+1 的净变化。阅读关于dec 指令的评论。 (是的,这可能比使用jmp 跳过dec 更快。问题中的代码有一个.L3,你有.DONE,但没有插槽可以放置jmp)。
  • ccKep 回答的最后第二段甚至评论了jmp 指令缺少空间,并且jmp .L3 将允许inc 而不是add $2。由于没有为其他答案尚未涵盖的问题添加任何有用的东西,因此不得不对此投反对票。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 2021-07-06
  • 1970-01-01
  • 2020-01-04
  • 2016-12-17
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多