Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57602
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2016-03-14 17:05
文章分类
文章存档

2017年(15)

2016年(3)

我的朋友

分类: LINUX

2017-02-26 11:56:45

 大部分现代计算机基本模型都是以宏诺依曼计算机体系架构(“共享数据和串行执行”的计算机模型)作为基础,此类计算机由五部分组成:运算器、控制器、存储器、输入设备、输出设备组成,各部件间通过总线(数据总线、地址总线)进行信息交流。其都是以指令存储的工作方式进行工作。
    

注意:此课程(孟宁老师  Linux内核分析课程    )中未作特别说明的情况下我们都将以X86架构32位机器作为目标平台。

     
    首先,介绍一下32位X86计算机中的寄存器:

通用寄存器:

AH  AL  AX  EAX   累加器

BH  BL  BX  EBX   基地址寄存器

CH  CL  CX  ECX   计数寄存器

DH  DL  DX  EDX   数据寄存器

BP   EBP            堆栈基指针

SI  ESI   DI  EDI    变址寄存器

SP  ESP              堆栈顶寄存器

段寄存器:

CS          代码段寄存器

DS          数据段寄存器

ES          附加段寄存器

SS          堆栈段寄存器

FS          附加段寄存器

GS          附加段寄存器

CPU在实际取指令时根据CS :EIP来准确定位一个指令

每个进程都有自己的堆栈

标志寄存器(EFLAGS register :标识当前状态

指令指针寄存器(EIP

接下来,介绍一下汇编指令及几种内存寻址方式:

指令 实际效果 寻址方式
movl  %eax, %edx edx = eax 寄存器寻址
movl  $0x123, %edx edx = 0x123 立即数寻址
movl  0x123, %edx  edx=*(int32_t*)0x123 直接寻址
movl  (%ebx), %edx edx=*(int32_t*)ebx 间接寻址
movl  4(%ebx), %edx edx=*(int32_t*)(ebx+4) 变址寻址
pushl  %eax



subl  $4,%esp  
movl %eax,(%esp)




popl   %eax


movl  (%esp),%eax  
addl $4,%esp



call   0x12345

pushl %eip(*)   
movl  $0x12345, %eip(*)


ret

popl %eip(*)


      最后,任务运行所需要的堆栈做一下介绍:

下面,将以一个具体的例程来介绍32位x86架构机器中程序的执行过程
    C程序代码:

点击(此处)折叠或打开

  1. int g(int x)
  2. {
  3.     return x+3;
  4. }

  5. int f(int x)
  6. {
  7.     return g(x);
  8. }

  9. int main(void)
  10. {
  11.     return f(2013)+1;
  12. }
    其对应的汇编代码如下:


程序将从main标号开始执行
郭昌明  + 《Linux内核分析》+  MOOC课程
阅读(1858) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~