一堆指令的执行过程- 指令的基本格式

75 阅读6分钟

一操作码 -指明动作

二操作数

2.1寻址方式分类

熟悉这些寻址方式就是当我们去分析一条指令的时候,我们会更有方向性。

隐含寻址

指令中没有明确的指出我要找的那个操作数在什么位置

立即寻址

指令中会携带操作数

直接寻址

直接寻址操作数在什么地方?在主存当中,也就是需要访存, 那就需要给出我要仿存的地址。相当于我要在指令当中指明我要找的那个数,它在主存当中的什么地址

间接寻址

间接寻址,这个相当于是我要访两次存

这种寻址方式在考题当中啊,因为它比较复杂

寄存器寻址

这个寄存器寻址就是指明一个寄存器的编号。

然后直接去寄存器里边找到想要的操作数。这个是常考的,

寄存器间接寻址

我的寄存器里边保存的并不是我要访问的那个操作数 我要访问操作数的地址。我的寄存器里边保存的是我要访问的操作树的地址。所以根据寄存器保存的地址,最终再去访存,这叫寄存器间接寻址

相对寻址

转移类指令, 凡要修改PC值的。几乎都是采用相对寻址

变址寻址

循环程序, 数组元素的起始地址加上一个偏移量。所以如果涉及到访问数组元素的话,那一般来说是变址寻址

堆栈寻址

x86汇编语言,有两个栈指针ebp指向栈底 esp指向栈顶。
如果我们要去栈当中找到数据, 我们要进行函数调用的时候,把函数调用的参数压入栈中, 同时有一些局部变量也会压到栈中,所以如果说在高级语言程序里边,可能需要访问函数调用的参数,或者需要访问某一个函数内部的局部变量。那么结合这种堆栈寻址的方式去找到函数调用的参数或者函数调用的局部变量, 那就是结合ebp esp这些函数栈的栈顶或者栈底指针去找想要的这个数据,这是常见的几种寻址方式,

最终为了辅助我们分析高级语言的机器级代码

偏移寻址包括相对寻址 基址寻址 变址寻址 ;

2.2 寻址方式要寻找什么

数据寻址(操作的数据)和指令寻址(下一条指令)

2.2 形式地址

每一条指令当中一定会有操作码,可能会有零个或者多个操作数。 而每一个操作数的寻址方式不同,具体得看这个操作数它到底是存储在寄存器还是立即数里面的,还是在在立即数里面携带的 那根据不同的寻址方式确定这个操作数,这个有效地址的方式就各不相同, 确定了它的寻址方式,我们就可以根据不同的寻址方式把形式地址转换成有效地址,

三 指令长度分类

根据指令长度是否固定
定长指令字 指令长度固定(如果是4字节) PC(指向下一条指令)+"1"(这个1就是4字节)
变长指令字 指令长度不固定(有的指令2 字节 有的指令4字节 有的指令8字节 ) PC(指向下一条指令)+"1"(这个1就是2字节+2;4字节+4;8字节加8)

定长操作吗指令格式-操作码位数固定不变 扩展操作码指令格式-操作码位数可能会改变

指令存放方式

大端存储 小端存储 在第二章

区分x86还是MIPS

x86 闭源 大学教学 CISC 指令长度不固定(指令编码)
RISC 开源MIPS属于RISC-V 精简指令集 指令长度固定 (华为MIPS

观察寄存器名指令长度是否固定以及是否有注释

image.png


jmp jje 都是跳转类指令
函数调用是堆栈保存的,当前指令使用上一层传的函数传过来的参数。它会在ebp+8 ebp+12这些位置去访问参数,
而如果要访问本层行数,本层函数内部定义的局部变量,那应该去ebp4-8-12这些位置去找。

image.png

2023

EB地址(00401079)加偏移量(09)等于目标地址 右边jmp 00401084
十六进制 逢16进1
坑: 偏移量可以往后跳 +;也可以往前跳-
偏移量是1B 8bit 有符号数 补码;
8bit补码有符号数位扩展位32位 再做计算; 例: EB地址(00401079)加偏移量(FE)等于目标地址 :
注意8bit补码 FE (1111 1110 翻译成十进制为-2)->pc-2

image.png

x86小端存储基本上 mov[a,b]

image.png

image.png

从上图可以看出是和人类视角相反存储,所以是 小端存储

image.png

当我们第一次访问19这条指令的时候,它会不会缺页呢?显然不会。因为前边的这些指令页号和第19条指令的页号是一样的,所以如果要缺页,那么访问前面这些指令的时候,肯定就已经发生过缺页,并且已经掉页了。那么,到第19条指令的时候,肯定就不会再缺页

image.png

递归求值 cmp dword ptr [ebp+8] ,1// 比较n和1大小
jle
push eax n-1 压到栈中
call 调用函数 让pc值回到函数第一句
imu1 eax ecx 分别保存n和n-1

image.png

jmp call return 改变程序执行流
jre不一定改变pc值
当call指令执行的时候PC值会自动加一指向后一条指令的这个地址。

操作码(E8)+偏移量(D6 FF FF FF)小端存储

乘法指令判断是否溢出 带符号: 前n+1全部相同 不溢出 不带符号:前n+1全0 不溢出 不全0 溢出

循环cmp jmp

image.png

  1. x86是CISC image.png

  2. 35行地址-1行地址+1

  3. i-(n-1) ;无符号;
    如果cf为0代表没有溢出 i>n-1;
    如果cf为1代表溢出 i<n-1

MIPS 和RISC -V 指令集结合流水线考察 -录播

转移类指令 分支和循环 jmp jxx; 参数ebp+ 局部变量ebp-