GNU组装标签中美元符号的含义

Zac*_*ack 9 assembly gcc

gnu组件标签前的美元符号是什么意思?

例如,mov msg, %si和之间有什么区别mov $msg, %si

(有关更多上下文,我正在研究x86裸机示例:https : //github.com/cirosantilli/x86-bare-metal-examples/blob/master/bios_hello_world.S

#include "common.h"
BEGIN
    mov $msg, %si
    mov $0x0e, %ah
loop:
    lodsb
    or %al, %al
    jz halt
    int $0x10
    jmp loop
halt:
    hlt
msg:
    .asciz "hello world"
Run Code Online (Sandbox Code Playgroud)

美元($)和百分号(%)在汇编英特尔x86中代表什么?讨论了寄存器前的%和常量前的$的一般用法;但是,我不认为它几乎可以说明带有标签的$的使用如以下答案所示)

Art*_*yom 8

:解决一个常数,例如,当您使用$(美元)符号 movl $1, %eax(放1%eax注册)或处理一些变量的地址,例如,当:movl $var, %eax(这意味着采取的地址 var 标签,放入%eax寄存器)。如果您不使用美元符号,则意味着“ var 标签中获取并将其注册”。

  • 那讲得通。如果是这种情况,那么与 jmp 一起使用的标签不应该也以 $ 开头吗? (2认同)
  • 为什么不能使用“jmp $loop”(jmp with $)。它会做一些不同的事情吗?语法是否有效?如果使用“movl var, %eax”,eax 中究竟会存储什么?它甚至是有效的语法吗?它可能相当于 movl ($var), %eax 吗? (2认同)