“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

堆栈变化如下图所示

最新文章

  1. Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板
  2. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
  3. centos同步北京时间
  4. Unity3D The Blacksmith Demo部分内容学习
  5. oracle常用操作指令
  6. 如何更改magento后台地址
  7. 2013 Multi-University Training Contest 3
  8. JavaScript数字精度上代码。
  9. 在android.app.Application中定义全局变量
  10. _doPostBack用法总结
  11. (转)Java爬虫,信息抓取的实现
  12. 配置was7、并部署发布项目!
  13. 插头DP题目泛做(为了对应WYD的课件)
  14. Github管理自己的代码-远程篇
  15. mfc动态控件生成
  16. [STM32F103]外部中断
  17. mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。
  18. 附006.harbor.cfg配置文件详解
  19. LAMP架构
  20. Subversion 1.8.9 ( SVN Client ) 安装最新版本的svn客户端

热门文章

  1. EntityFramework 学习 一 Update Entity Graph using DbContext:
  2. C++ Const 使用总结,代码实例亲测
  3. jquery的ajax(err)
  4. 恢复delete删除的数据
  5. SetOperations
  6. List 中去除 null 方法讨论
  7. 用React写一个工大导航
  8. 关于c++中局部变量和全局变量的存储位置及内存回收机制
  9. html中Meta属性
  10. 【二叉树的递归】02二叉树的最大深度【Maximum Depth of Binary Tree】