首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >At&t语法在程序集中?

At&t语法在程序集中?
EN

Stack Overflow用户
提问于 2021-10-05 07:59:02
回答 1查看 1.1K关注 0票数 0

我有多个非常小的问题在大会上,这也是相关的,所以我收集他们在这个问题上,而不是打开多个论坛和垃圾邮件。

所有问题都与程序集At&t语法有关:

  1. 为什么我不能写这样的东西:

cmp %eax,$0x2jg goHere

为什么不允许进行比较操作(结果没有保存在一个操作数中,所以不允许它.)注意:我知道我可以通过倒序来解决这个问题,然后做jl而不是jg

在att语法中,应该检查0x2是否大于%eax。

  1. 为什么我可以写:

mov $41 %rax

虽然我不能写:

mov (41美元),%rax

这很奇怪,有人告诉我,在装配中使用支架并不重要。

  1. 在内存中保存字符串时,让我们把地址0x100中的"ABC“作为内存的样子:

0x100 -A 0x101 -B 0x102 -C

0x100-C0x101-B0x102-A

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-05 14:08:23

对于1,我对x86的最初设计没有特别的了解,但我怀疑我们没有cmp %reg, $imm的原因是因为cmpsub之间的关系。指令cmp $imm, %reg的行为与sub $imm, %reg完全一样,只有一个例外,即对于cmp,减法的结果不是写入目标%reg,而是被丢弃。但是减法的结果仍然是由CPU在内部计算,并用于设置标志。(至少这在概念上是正确的,而且早期CPU几乎肯定完成了全部减法;现代CPU可能有一些我不知道的优化。)

因此,这意味着一旦您拥有了cmp,几乎可以免费实现sub。你可以使用几乎完全相同的电路和/或微码。但是您仍然需要对指令进行解码,因此,通过给cmp提供几乎与sub相同的编码,这也很容易,只需一位就不同了。例如,sub %reg, %reg/mem是操作码28h/29h,cmp %reg, %reg/mem是操作码38h/39h,仅在第4位有不同之处。这一位只是指示CPU是将结果写到目标操作数还是丢弃它。

这使得给cmp提供与sub完全相同的表单变得很自然。

cmp %reg, %reg.

  • 我们有sub %reg, %reg所以有sub %reg, %reg

cmp %reg, mem.

  • 我们有sub %reg, mem所以有sub %reg, mem

cmp mem, %reg.

  • 我们有sub mem, %reg所以有sub mem, %reg

cmp $imm, %reg.

  • 我们有sub $imm, %reg所以有sub $imm, %reg

  • ,甚至还有一个特殊的sub $imm, %al/%ax/%eax/%rax短编码,它有一个并行的

但是没有sub %reg, $imm编码,因为这将是胡说八道,所以cmp %reg, $imm需要一种新的编码,而这种编码不会与sub现有的编码并行。设计者大概决定不把解码晶体管和操作码空间浪费在创建晶体管和操作码空间上,因为毕竟它并没有真正提供任何新功能:cmp实际上总是与条件跳转(或后来的条件集)一起使用,在这种情况下,您可以通过使用cmp $imm, %reg并在随后的条件跳转/集中逆转测试来实现相同的目标。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69446758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档