.section __TEXT,__text,regular,pure_instructions
: 定义一个新的段(section),名为__TEXT,__text
,用于存放正文(代码);regular
和pure_instructions
是段的属性,表示该段包含普通的指令集和纯指令(无数据)。
.build_version macos, 13, 0 sdk_version 13, 3
: 声明编译的版本信息,表示此程序的目标操作系统版本为 macOS 13.0,使用的 SDK 版本为 13.3。
.globl _add
: 声明全局符号 _add
,用于表示函数add
的入口。
.p2align 4, 0x90
: 确保下一个指令的地址在16字节对齐位置上。
_add:
: 函数add
的标签,表示函数的入口。
.cfi_startproc
: 声明函数的开始,用于生成调试信息。
pushq %rbp
: 将寄存器%rbp
的值压入栈中,保存之前的栈帧指针。
.cfi_def_cfa_offset 16
: 定义栈帧指针偏移,将栈帧大小设置为16字节。
.cfi_offset %rbp, -16
: 定义寄存器%rbp
的位置在栈的偏移量为-16。
movq %rsp, %rbp
: 将当前栈指针%rsp
的值赋给栈帧指针%rbp
,建立新的栈帧。
.cfi_def_cfa_register %rbp
: 定义新的栈帧指针寄存器为%rbp
。
movl %edi, -4(%rbp)
: 将函数的第一个参数(整型)移动到栈帧中的位置,偏移量为-4。
movl %esi, -8(%rbp)
: 将函数的第二个参数(整型)移动到栈帧中的位置,偏移量为-8。
movl -4(%rbp), %eax
: 将栈帧中的第一个参数加载到通用寄存器%eax
中。
addl -8(%rbp), %eax
: 将栈帧中的第二个参数与%eax
寄存器的值相加。
popq %rbp
: 弹出保存的栈帧指针。
retq
: 返回函数,将栈帧指针弹出到程序计数器,并跳转到调用函数的位置。
.cfi_endproc
: 声明函数的结束,停止生成调试信息。
.globl _main
: 声明全局符号 _main
,用于表示函数main
的入口。
.p2align 4, 0x90
: 确保下一个指令的地址在16字节对齐位置上。
_main:
: 函数main
的标签,表示函数的入口。
.cfi_startproc
: 声明函数的开始,用于生成调试信息。
pushq %rbp
: 将寄存器%rbp
的值压入栈中,保存之前的栈帧指针。
.cfi_def_cfa_offset 16
: 定义栈帧指针偏移,将栈帧大小设置为16字节。
.cfi_offset %rbp, -16
: 定义寄存器%rbp
的位置在栈的偏移量为-16。
movq %rsp, %rbp
: 将当前栈指针%rsp
的值赋给栈帧指针%rbp
,建立新的栈帧。
.cfi_def_cfa_register %rbp
: 定义新的栈帧指针寄存器为%rbp
。
subq $16, %rsp
: 在栈上分配16字节的空间,为本地变量的使用而预留。
movl $0, -4(%rbp)
: 初始化栈帧中的一个本地变量,将值0存储在偏移量为-4的位置。
movl %edi, -8(%rbp)
: 将函数的第一个参数(整型)移动到栈帧中的位置,偏移量为-8。
movq %rsi, -16(%rbp)
: 将函数的第二个参数(整型)移动到栈帧中的位置,偏移量为-16。
movl $1, %edi
: 将值1存储在寄存器%edi
中,准备作为第一个参数传递给_add
函数。
movl $2, %esi
: 将值2存储在寄存器%esi
中,准备作为第二个参数传递给_add
函数。
callq _add
: 调用函数_add
,将参数传递给它,并开始执行该函数。
movl %eax, %ecx
: 将_add
函数的返回值(存储在寄存器%eax
中)移动到寄存器%ecx
中,准备作为参数传递给printf函数。
leaq L_.str(%rip), %rdi
: 将字符串L_.str的地址(存储在相对寻址中)加载到寄存器%rdi
中,作为printf函数的第一个参数。
movl $1, %esi
: 将值1存储在寄存器%esi
中,准备作为printf函数的第二个参数。
movl $2, %edx
: 将值2存储在寄存器%edx
中,准备作为printf函数的第三个参数。
movb $0, %al
: 将值0存储在寄存器%al
中,准备作为printf函数的第四个参数。
callq _printf
: 调用printf函数,将之前准备好的参数传递给它,开始执行打印操作。
xorl %eax, %eax
: 将寄存器%eax
与自身进行异或操作,将结果存储回%eax
,相当于将其清零。
addq $16, %rsp
: 释放之前预留的16字节的栈空间。
popq %rbp
: 弹出保存的栈帧指针。
retq
: 返回函数,将栈帧指针弹出到程序计数器,并跳转到程序的结束点。
.cfi_endproc
: 声明函数的结束,停止生成调试信息。
.section __TEXT,__cstring,cstring_literals
: 定义一个新的段(section),名为__TEXT,__cstring
,用于存放c字符串字面量。
L_.str: .asciz "%d + %d = %d"
: 定义一个c字符串字面量"%d + %d = %d"
,并使用标签L_.str
进行引用。
.subsections_via_symbols
: 告诉编译器按照符号(symbol)来生成子段(subsections)。