第四周学习总结

第五周学习总结

学习时间:7h

参考内容:书本内容,练习及答案

一、学习过程

1.寻址方式的发展

平坦模式->分段模式->带保护的平坦模式

2.ISA的定义

机器级程序的格式和行为,定义为指令集体系结构,简称ISA

3.反汇编指令

gcc -s xx.c -o xx.s 获得

gcc -m32 -s xx.c 从64位机器上得到32位的代码

otool -d xxx 可从mac os 上进行反汇编

4. ATT和Intel格式的区别

1)Intel代码省略练指示大小的后缀

2)Intel代码省略练寄存器名字前面的‘%’符号

3)Intel代码用不同的方式来描述存储器中位置

4)在带有多个操作数的指令情况下,列出操作数的顺序相反

5.操作数指示符

立即数,常数值,用Imm表示

寄存器,E表示寄存器,R[E]表示寄存器里的内容

存储器,M[Addr],根据算出的有效地址访问存储器的某个位置

6.数据传送指令

mov传送 movs传送符号扩展的字节 movz传送零扩展的字节

movs和movz将一个较小的源数据复制到一个较大到的位置,符号位扩展,高位用源值最高位填充,零扩展就用0填充高位

不能从一个内存地址直接mov到另一个内存地址,要用寄存器中转

栈顶元素是最近被压入的元素,是所有栈中元素地址中最低的

7.算术与逻辑运算

1)加载有效地址, leal指令 2)一元运算(一个操作数,即是源又是目的) 3)二元运算(两个操作数,第一个是源,第二个是目的)

注意:第一个可以是立即数,寄存器,存储器;第二个可以是寄存器,存储器;两个不可以同时为存储器。

8.条件码

CMP只设置条件码而不更新目标寄存器,可以用于条件判断上,sub可以用作简单的算术运算

9.set类指令:根据条件码的某些组合,将一个字节设置为0或者是1。各个set类指令都适用的情况是——执行比较指令,根据t=a-b的结果设置条件码。

10.跳转指令

jmp:无条件跳转。后可接 跳转目标,或者从寄存器、存储位置中读出跳转目标。

其他有条件跳转是根据条件码组合来控制的。

11.跳转指令有几种不同编码,但最常见的都是pc相关的。它们会将目标指令的地址与紧跟在跳转指令之后的那条指令之间的差作为编码。

12.条件分支等价的goto语句——

t = test-expr;
if(!t)
    goto false;
then-statement
goto done;
false:
    else-statement;
done:

13.do-while循环:每次循环,程序会执行循环体里的语句,然后执行测试表达式。如果测试为真,则回去再执行一次循环。

等价的goto语句——

loop:
body-statement;
t = test-expr;
if(t)
    goto loop;

14.IA32程序用程序栈来支持过程调用。机器用栈来传递过程参数、存储返回信息、保存寄存器用于本地恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。

15.栈向低地址方向增长,而栈指针%esp指向栈顶元素。可以利用pushl将数据存入栈中并利用popl指令从栈中取出。

16.过程调用

1)call指令有一个目标,即指明被调用过程起始的指令地址。同跳转一样,调用可以是间接的,也可以是直接的。效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是在程序中紧跟在call后的那条指令的地址。这样当被调用过程返回的时候,执行会从此处继续。

2)ret指令从栈中弹出地址,并跳转到这个位置。

17.编译器如何产生管理栈结构的代码?参数在栈上传递给函数,可以从栈中相对于%ebp的正偏移量来访问它们。可以用push指令或是从栈指针减去偏移量在栈上分配空间。在返回前,函数必须将栈恢复到原始的条件,可以恢复所有的被调用者保存寄存器和%ebp,并且重置%esp使其指向返回地址。

17.递归过程

递归调用一个函数本身和调用其他函数是一样的。栈规则提供了一种机制,每次函数调用都有他自己私有的的状态信息存储。如果需要,它还可以提供局部变量的存储。

二、练习思考与总结

1.问题

在leal指令中,形如(%eax,%eax,4), %eax ,此时寄存器将值变为5倍,那么为什么不直接写成(%eax,5)这种情况。经观察发现练习种,括号内的常数均为偶数(2,4,8),未出现奇数,是不是这种写法中括号内一定为(2n)。

2.练习总结

练习主要与汇编所学的指令与计算有关,后面根据汇编代码补全c代码时应注意移位,逻辑运算等符号的使用。

原文地址:https://www.cnblogs.com/shadow135211/p/4870115.html