X86_64 Linux ASM

汇编结构

.data 段

在.data 段中使用以下格式声明和定义初始化数据

<变量名称> <类型> <变量值>

数据类型

类型长度名称
db8bitByte
dw16bitWord
dd32bitDouble World
dq64bitQuad Word

.bss 段

bss 表示以符号开头的块 (Block Started by Symbol), 用来存放未初始化的变量

<变量名称> <类型> <数字>

类型长度名称
resb8bitByte
resw16bitWord
resd32bitDouble World
resq64bitQuad Word

bss 段中的变量不包含任何值, 这些值将在程序运行时被分配, 内存位置不是在编译时保留的.

.text 段

.text 段用于存放所有的操作, 并从以下代码开始执行

    global main
main: 

寄存器

通用寄存器

64位32位16位低8位高8位备注
raxeaxaxalah
rbxebxbxblbh
rcxecxcxclch
rdxedxdxdldh
rsiesisisil-
rdiedididil-
rspespspspl-基指针
rbpebpbpbpl-栈指针
r8r8dr8wr8b-
r9r9dr9wr9b-
r10r10dr10wr10b-
r11r11dr11wr11b-
r12r12dr12wr12b-
r13r13dr13wr13b-
r14r14dr14wr14b-
r15r15dr15wr15b-

低始终是最右边的位

指令指针寄存器 (rip)

处理器通过将下一条指令的地址存储在rip中来跟踪要执行的下一条指令

不应该直接修改rip的值, 而是使用跳转指令

标志寄存器 (Flag Register)

执行指令后, 程序可以检查是否设置了某个标志, 然后采取相应的动作

名称标记内容
CarryCF0先前的指令有一个进位
ParityPF2最后一个字节有偶数个 1
AdjustAF4BCD 操作
ZeroZF6上一条指令的结果为 0
SignSF8上一条指令的最高有效位等于 1
DirectionDF10字符串操作的方向(递增或递减)
OverflowOF11上一条指令导致溢出
MXCSR

xmm 和 ymm 寄存器

这些寄存器用于浮点计算和SIMD