zoukankan      html  css  js  c++  java
  • 20169219 linux内核原理与分析第二周作业

    “linux内核分析”的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程。
    通用寄存器
    AX:累加器
    BX:基地址寄存器
    CX:计数寄存器
    DX:数据寄存器
    BP:堆栈基址针
    SI、DI:变址寄存器
    SP:堆栈顶指针

    段寄存器
    CS:代码段寄存器,指向包含程序指令的段。
    SS:栈段寄存器,指向包含当前程序栈的段。
    DS:数据段寄存器,指向包含静态数据或者全局数据段。
    ES:附加寄存器,指向附加数据段。

    IP:指令指针。CPU在实际取指令时根据CS:IP来准确定位一个指令。
    寄存器的位数不同分别用不同的字母表示,b w l q 分别代表8位,16位,32位,64位。如movl即表示32位的mov指令。

    几种寻址方式
    指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器的寻址方式称为寄存器寻址方式。
    操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
    指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
    操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
    相对应的C语言表示为:
    movl %eax,%edx edx=eax 寄存器寻址
    movl $0x23,%edx edx=0x123 立即寻址
    movl 0x123,%edx edx=(int32_t)0x123 直接寻址
    movl (%ebx),%edx edx=(int32_t)ebx 间接寻址

    其他常用指令:

    pushl 、pop、ret、enter、leave      
    
    在32位寄存器中push 压栈时地址减4,pop 出栈时地址加4。
    

    以如下代码为例做实验分析:

    int g(int x)
    {
        return x+1;
    }
    int f(int x)
    {
        return g(x);
    }
    int main(void)
    {
        return f(3)+2;
    }
    
    

    其汇编代码为:

    1 g:
    2 	    pushl	%ebp
    3              movl	%esp, %ebp
    4	    movl	8(%ebp), %eax
    5	    addl	$1, %eax
    6	    popl	%ebp
    7	    ret
    8 f:
    9      	    pushl	%ebp
    10	    movl	%esp, %ebp
    11	    subl	$4, %esp
    12	    movl	8(%ebp), %eax
    13	    movl	%eax, (%esp)
    14	    call	g
    15	    leave
    16	    ret!
    17 main:
    18	    pushl	%ebp
    19	    movl	%esp, %ebp
    20	    subl	$4, %esp
    21	    movl	$3, (%esp)
    22	    call	f
    23	    addl	$2, %eax
    24	    leave
    25	    ret
    
    
    
    

    堆栈变化如下图所示

  • 相关阅读:
    监控系统
    RocketMQ入门介绍
    Linux的虚拟内存详解(MMU、页表结构) 转
    快速排序
    如何选择分布式事务解决方案? 转
    java 基本数据类型相关思考
    互联网项目中mysql应该选什么事务隔离级别 转
    线上服务的FGC问题排查,看这篇就够了! 转
    什么是Base64? 转
    业界难题-“跨库分页”的四种方案 转
  • 原文地址:https://www.cnblogs.com/weihua2616/p/5927277.html
Copyright © 2011-2022 走看看