汇编 初学
最简单的汇编程序
.section .data
.section .text
.globl _start
_start:
movl $1, %eax
movl $4, %ebx
int $0x80
解释:
movl $1, %eax
这是一条数据传送指令,这条指令要求CPU内部产生一个数字1并保存到eax 寄存器中。mov 的后
缀l表示long,说明是32位的传送指令。这条指令不要求CPU读内存,1这个数是在CPU内部产生
的,称为立即数(Immediate)。在汇编程序中,立即数前面要加$,寄存器名前面要加%,以便跟
符号名区分开。以后我们会看到mov 指令还有另外几种形式,但数据传送方向都是一样的,第一个
操作数总是源操作数,第二个操作数总是目标操作数。
1. int 指令称为软中断指令,可以用这条指令故意产生一个异常,上一章讲过,异常的处理和中
断类似,CPU从用户模式切换到特权模式,然后跳转到内核代码中执行异常处理程序。
2. int 指令中的立即数0x80是一个参数,在异常处理程序中要根据这个参数决定如何处理,
在Linux内核中int $0x80 这种异常称为系统调用(System Call)。内核提供了很多系统服务
供用户程序使用,但这些系统服务不能像库函数(比如printf)那样调用,因为在执行用户
程序时CPU处于用户模式,不能直接调用内核函数,所以需要通过系统调用切换CPU模式,
经由异常处理程序进入内核,用户程序只能通过寄存器传几个参数,之后就要按内核设计好
的代码路线走,而不能由用户程序随心所欲,想调哪个内核函数就调哪个内核函数,这样可
以保证系统服务被安全地调用。在调用结束之后,CPU再切换回用户模式,继续执行int
$0x80 的下一条指令,在用户程序看来就像函数调用和返回一样。
3. eax 和ebx 的值是传递给系统调用的两个参数。eax 的值是系统调用号,Linux的各种系统调用
都是由int $0x80 指令引发的,内核需要通过eax 判断用户要调哪个系统调用,_exit 的系统调
用号是1。ebx 的值是传给_exit 的参数,表示退出状态。大多数系统调用完成之后会返回用户
空间继续执行后面的指令,而_exit 系统调用比较特殊,它会终止掉当前进程,而不是返回用
户空间继续执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!