【发布时间】:2021-11-25 12:21:14
【问题描述】:
我在汇编中有多个非常小的问题也相关,所以我将它们收集在这个问题中,而不是打开多个问题并在论坛中发送垃圾邮件。
所有问题都与Assembly At&t 语法有关:
-
为什么我不能写类似的东西:
cmp %eax, $0x2 jg goHere
为什么它不允许进行比较操作(结果没有保存在操作数之一中,所以不允许它是没有意义的......)注意:我知道我可以通过颠倒顺序来解决这个问题并使用jl 而不是jg。
在 att 语法中,这应该检查 0x2 是否大于 %eax。
-
为什么我会写作:
mov $41, %rax虽然我不会写:
mov ($41), %rax
这很奇怪,有人告诉我在汇编中使用大括号并不重要。
-
在内存中保存字符串时,假设地址 0x100 中的“ABC”,内存应该是什么样子:
0x100 - A 0x101 - B 0x102 - C
0x100 - C 0x101 - B 0x102 - A
【问题讨论】:
-
请尝试每个问题只问一个问题。至于(1),没有操作数以其他顺序排列的指令。对于 (2),括号表示从名为
$41的符号加载的内存操作数。如果要分组,请将括号放在美元符号后面,例如$(41)。 -
对于(3),字符串的第一个字节在最低地址。
-
@fuz 第一个字节来自哪个方向? for 1 我问为什么没有这样的命令? 2 你没有回答为什么它不起作用......
-
"注意:我知道我可以通过颠倒顺序并使用
jl而不是jg来解决这个问题。"jg的倒数实际上是jle或其别名jng。另外,请注意,条件位于两个操作数 in Intel order 之间。如果eax大于(有符号)2,cmp $2, %eax\jg将跳转。(Intel 订单为相同的机器代码提供cmp eax, 2。) -
@Dan 第一个字节是字符“A”。至于(1)我不知道,问8086处理器的厂商。这可能是因为这样的指令是多余的。对于(2),指令确实有效(如它汇编)。它只是做了一些超出你预期的事情,我想我已经解释了它的作用。
标签: assembly x86-64 att gnu-assembler