西电微机原理-第三章 Intel处理器指令系统及汇编语言(2)
四、过程

与外部库链接



堆栈操作

- 内存方向:上小下大
- 栈的生长方向:大地址到小地址(由下往上)

压栈:
- ESP减小
- 放入数据

出栈:
- 拿走数据
- ESP增加

空栈:ESP指向栈底下方一个元素【这样入栈时+4再放入元素,才会刚好把元素放到栈底】

PUSH和POP

PUSHFD和POPFD:标志位入栈出栈



其他栈操作: pushad popad


例子:反转字符串


过程的定义和调用

PROC指令





CALL和RET指令



例子:

push esi \ ecx是为了 保护主程序的数据


一个崩溃程序的解读
由于在过程中有入栈保护主程序数据,但是没有弹栈,ip=dx=offfset mess1=0,程序循环
导致栈空间溢出,侵蚀了代码段,导致代码段被覆写,程序崩溃


五、条件处理


布尔和比较指令
AND指令



大小写转换
OR指令


整数转为ASCII码
XOR指令

NOT指令

TEST指令:判断某些位的值。(不回送结果,只影响标志位)

ZF = 两个操作数按位相与【或逻辑,同时判0容易,同时判1难】
CMP指令:(不回送结果,只影响标志位)


不懂
清除各个标志位的操作

条件跳转

一个段是256个字节,所以段间的跳转有专门的指令






| 无符号数 | 大于 JA | 小于 JB |
|---|---|---|
| 有符号数 | 大于 JG | 小于 JL |

要将一个数据看做是有符号数还是无符号数是取决于程序员
- 看你溢出时用 CF 还是 OF
- 比较时用 JA 还是 JG

- ZF = al & (00100000b) 如果 为1,说明 bit=1,跳转【jnz】
- ZF = al & (00010011b) 如果为 1,说明bi0,1,4必然不全为0, 跳转【jnz】、
- 直接提取bit2.3.7和目标值进行比较

例子:


找到第一个不为0的元素
条件循环



为什么需要 pushsf 和 popsf ,因为 add 也会修改标志位
条件结构

抓住关键点:cpu顺序执行指令

浙公网安备 33010602011771号