教材学习内容总结
-
程序编码
GCC将源代码转化为可执行代码的步骤:
- C预处理器——扩展源代码-生成.i文件
- 编译器——产生两个源代码的汇编代码-——生成.s文件
- 汇编器——将汇编代码转化成二进制目标代码——生成.o文件
- 链接器——产生可执行代码文件
机器级代码
1.机器级编程的两种抽象
(1)指令集结构ISA
是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
(2)机器级程序使用的存储器地址是虚拟地址
看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
2.几个处理器:
- 程序计数器(CS:IP)
- 整数寄存器(AX,BX,CX,DX)
- 条件码寄存器(OF,SF,ZF,AF,PF,CF)
- 浮点寄存器
一条机器指令只执行一个非常基本的操作。
程序编码
书上107页的代码,需要用到反汇编器。在Linux系统中,带‘d’命令行标志的程序OBJDUMP可以充当这个角色。
数据格式
数据传送指令的三个变种:
- movb 传送字节
- movw 传送字
- movl 传送双字
访问信息
一个IA32中央处理单元(CPU)包含8个存储32位置的寄存器
操作数指示符
- 立即数
- 寄存器
- 存储器
寻址方式
(1)立即数寻址方式
格式:$后加用标准c表示法表示的整数,如$0xAFF
(2)寄存器寻址方式
如%eax,与汇编中学过的AX寄存器类比。
(3)存储器寻址方式
- 直接寻址方式
- 寄存器间接寻址方式
- 寄存器相对寻址方式
- 基址变址寻址方式
- 相对基址变址寻址方式
数据传送指令
MOV
- movb 传送字节
- movw 传送字
- movl 传送双字
MOVS
- movsbw 将做了符号扩展的字节传送到字
- movsbl 将做了符号扩展的字节传送到双字
- movswl 将做了符号扩展的字传送到双字
MOVZ
- movzbw 将做了零扩展的字节传送到字
- movzbl 将做了零扩展的字节传送到双字
- movzwl 将做了零扩展的字传送到双字
算术和逻辑操作
一、加载有效地址
加载有效地址指令——leal,是movl指令的变形。
指令形式:从存储器读取数据到寄存器。
实际:将有效地址写入到目的操作数,而目的操作数必须是寄存器;并不真实引用存储器。
二、一元操作和二元操作
1.一元操作
只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。
2.二元操作
第一个操作数可以是立即数、寄存器或者存储器位置
第二个操作数可以是寄存器或者存储器位置
但是不能同时是存储器位置。
控制
数据传送指令
MOV 不影响标志位
PUSH POP 不影响标志位
XCHG 交换指令 不影响标志位
XLAT 换码指令 不影响标志位
LEA 有效地址送寄存器指令 不影响标志位
PUSHF 标志进栈指令 不影响标志位
POPF 标志出栈指令 标志位由装入值决定
访问条件码
这个指的是SET指令,通过set与不同的条件码的组合,达到不同的跳转条件。
某些底层的机器指令可能有多个名字,我们称之为“同义名”。
跳转指令及其编码
jump分为直接跳转和间接跳转:
直接跳转:后面跟标号作为跳转目标
间接跳转:*后面跟一个操作数指示符
过程
一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
一、栈帧结构
栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
1.栈帧
为单个过程分配的那部分栈称为栈帧,通用结构见149页
所以本质上栈帧还是栈。
2.两个指针
最顶端的栈帧以两个指针界定:
寄存器%ebp-帧指针
寄存器%esp-栈指针
栈指针可移动,所以信息访问多相对于帧指针。
二、转移控制
这里用到的主要就是CALL和RET这一对指令。
1.call
call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。
CALL指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
然后就会用到ret了。
2.ret
ret指从栈中弹出地址,返回到call指令后的那条指令。
教材学习中的问题和解决过程
我无法使用gcc进行汇编QAQ,不知道为什么,我也去看别的同学的方法,cat 方法也进行了尝试,但是没法生成.o .h文件,无法进行汇编= =,这个之后去请教同学解决吧。
本周代码托管截图
那个在截图的时候虚拟机黑屏了,分了两次git,第一次有四个代码,第二次有一个代码。我的虚拟机在缩小一倍窗口后进行拖动就会黑屏,这是我第二次在进行问题截屏时发现的。
本周的个人思考问题
本周的内容主要和上个学期相关的汇编课程,因为这门课程我学的不太好,理解不深,学起来很吃力,所以这周的我还是停留在书中的内容中,还是先去吃书上的基本内容,这都是我欠下的债,到现在得还,所以我这周的学习因为我的基础就不稳,十分的吃力,但是我相信在之后的学习中,我会每周多学一点,一点一点的将之前欠下的债还清,因为现在也是大三的学生,希望能够在学习中提升自己的自身价值和竞争力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 24篇 | 350小时 | |
第一周 | 0/0行 | 1/2 | 8小时 | |
第二周 | 49/49行 | 1/3 | 10/18小时 | |
第三周 | 0/49行 | 2/5 | 10/28小时 | |
第四周 | 0/49行 | 1/5 | 0/28小时 | |
第五周 | 42/91行 | 1/6 | 15/43小时 |