汇编 初学

目录

    最简单的汇编程序

    .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 系统调用比较特殊,它会终止掉当前进程,而不是返回用
    户空间继续执行。

     

     

     

    posted @   bigbigtree  阅读(245)  评论(0编辑  收藏  举报
    编辑推荐:
    · 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 让容器管理更轻松!
    点击右上角即可分享
    微信分享提示