• 清华操作系统实验--80x86汇编基础


    前言

    80x86架构里,因为历史原因字是16位的,因此在汇编指令中用后缀-b,-w,-l来表示操作数是字节 字 或是双字

    C声明 Intel数据类型 汇编代码后缀 大小(字节)
    char 字节 b 1
    shrot w 2
    int 双字 l 4
    long int 双字 l 4
    long long int -- -- 4
    char * 双字 l 4
    float 单精度 s 4
    double 双精度 l 8
    long double 扩展精度 t 10/12

    指令寄存器PC指向下一条指令的地址
    EIP(x86-32)或RIP(x86-64)

    将C程序编译成汇编

    C程序

    int sum(int x,int y){
        int t=x+y;
        return t;
    }
    

    编译指令

    gcc -O2 -S code.c -m32 -fno-omit-frame-pointer

    -O2 表示优化的级别
    -S 表示在编译时生成汇编代码后就停止
    -m32 表示生成32位汇编代码
    -fno-omit-frame-pointer 表示不进行栈指针的优化

    生成的汇编代码

    ESP一直指向栈顶的指针,而EBP只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。

    _sum:
            pushl   %ebp            ;保存栈基址
            movl    %esp, %ebp      ;将栈顶作为新的栈基址
            subl    $16, %esp
            movl    8(%ebp), %edx   ;取参数
            movl    12(%ebp), %eax
            addl    %edx, %eax      ;相加
            movl    %eax, -4(%ebp)
            movl    -4(%ebp), %eax
            leave
            ret
    

    第一条汇编指令

    int t = x+y;
    
    addl 8(%ebp) %eax
    

    类似于

    int eax;
    int *ebp;
    eax += ebp[2]
    

    %eax是目的寄存器

    8086寄存器

    CS和IP寄存器指示了CPU当前要读取的指令的地址.
    任意时刻,CPU将CS:IP执行的内容当作指令执行
    指令地址计算方法:将CS左移4位+IP
    1234:45 指向的地址为0x12340+0x45=0x12385

    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    百度判断手机终端并自动跳转uaredirect.js代码及使用实例
    php 即点即改
    Thinkphp 3.2 去掉index.php
    php获取数组中指定值的下标
    tp5 查询本年、本月、本周的方法
    《数字集成电路静态时序分析基础》笔记⑨
    《数字集成电路静态时序分析基础》笔记⑧
    《数字集成电路静态时序分析基础》笔记⑦
    《数字集成电路静态时序分析基础》笔记⑥
    《数字集成电路静态时序分析基础》笔记⑤
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/7354254.html
Copyright © 2020-2023  润新知