zoukankan      html  css  js  c++  java
  • 清华操作系统实验--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
    发布时间:
    原始链接:
  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/7354254.html
Copyright © 2011-2022 走看看