【发布时间】:2018-05-02 06:16:34
【问题描述】:
当我们有
add %rbx, %rax
这是把rbx的值加到rax还是把rax的值加到rbx?
如果例如 rbx=3 和 rax=6,在添加 %rbx、%rax 之后,%rax 和 %rbx 的值是多少?
请使用 GNU x64 汇编语法!
【问题讨论】:
-
我更新了AT&T tag wiki,提供了有关 AT&T 语法的此类信息,以及指向良好规范副本的链接。
当我们有
add %rbx, %rax
这是把rbx的值加到rax还是把rax的值加到rbx?
如果例如 rbx=3 和 rax=6,在添加 %rbx、%rax 之后,%rax 和 %rbx 的值是多少?
请使用 GNU x64 汇编语法!
【问题讨论】:
x86 程序集有两种主要的“风格”:Intel 语法和 AT&T 语法(主要由 GNU 工具默认使用)。
您的 sn-p 采用 AT&T 语法(其中寄存器名称以 % 为前缀); AT&T 语法中操作数的顺序一般是source,destination,所以
add %rbx, %rax
表示“将 rbx 添加到 rax”(即,在 C 语言中为 rax += rbx)。
这与 Intel 语法相反,所以如果你在 Intel 语法中看到一些 sn-p,比如
add rbx, rax
(注意没有%)这意味着“将rax添加到rbx”(即rbx += rax)。
您可以找到一份很好的 AT&T 与 Intel 语法差异列表here。
【讨论】:
% 前缀与风味分开切换。