黄仁义 原创作品 转载请注明出处
《Linux内核分析》MOOC课程:在线课程链接http://mooc.study.163.com/course/USTC-1000029000
第一讲 计算机是如何工作的? 课堂笔记
@2015.03
------------------------------------------------------分割线--------------------------------------------------------------
1 基本理论
1.1 计算机结构
现在计算机结构为冯诺依曼体系结构,即存储程序计算机;由cup通过总线从内存中读取指令或数据。
1.2 通用寄存器
AX(AccumulateRegister)
BX(BaseRegister)
CX(CountRegister)
DX(DataRegister)
BP(Base Pointer)堆栈基指针
SP(StackPointer)堆栈顶指针
以上为16位,32位计算机在寄存器前加E,64位计算机在寄存器前加R
1.3 计算机指令(AT&T汇编风格,适用于Linux内核)
1.3.1 指令基本格式
格式:指令 源地址,目标地址
1.3.2 常见计算机汇编指令
mov、sub、and、add、ret
在每个指令后面紧跟“b,w,l,q”中的一个字母,分别代表8位、16位、32位、64位
1.3.4 内存寻址方式
寄存器寻址:使用寄存器名字,数据在寄存器所在的地址存取。例如,%ebx
立即数寻址:该数字表示数值,该数值做相关存取。例如,$0x12
直接寻址:该数字表示地址,数据在该地址里做相关存取。数据前面没有标志。
间接寻址:使用寄存器里的数据为地址,在该地址做相关存取。例如,(%ebx)
变址寻址:在寄存器中数据为地址的基础上进行地址偏移。例如,4(%ebx)
1.3.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 |
enter | pushl %ebp |
movl %esp,%ebp | |
Leave | movl %ebp,%esp |
popl %ebp |
Ip(Instruct Pointer)指令指针只能用伪指令,不能直接用指令赋值
2 实验操作
2.1 实验中的C代码
2.2 实验使用的Linux指令
2.3 汇编代码
3 代码分析
以2.3汇编代码前的标号为代码地址,且相邻两个地址的差为一个字。栈的基地址为100。
以下红色线为基地址指针所指地址,青色为栈顶指针地址。左侧小方框为寄存器中的数值。