zoukankan      html  css  js  c++  java
  • 汇编 初学

    最简单的汇编程序

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

  • 相关阅读:
    hive on hbase
    django多表操作
    django单表操作
    django模板
    django路由初识
    python 相关模块安装 国内镜像地址
    django初识
    Python中属性和描述符的简单使用
    pip安装包(python安装gevent(win))
    jQuery 事件方法
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/2957099.html
Copyright © 2011-2022 走看看