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

四、过程

Untitled

与外部库链接

Untitled

Untitled

Untitled

堆栈操作

Untitled

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

Untitled

压栈:

  • ESP减小
  • 放入数据

Untitled

出栈:

  • 拿走数据
  • ESP增加

Untitled

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

Untitled

PUSH和POP

Untitled

PUSHFD和POPFD:标志位入栈出栈

Untitled

Untitled

Untitled

其他栈操作: pushad popad

Untitled

Untitled

例子:反转字符串

Untitled

Untitled

过程的定义和调用

Untitled

PROC指令

Untitled

Untitled

Untitled

Untitled

Untitled

CALL和RET指令

Untitled

Untitled

Untitled

例子:

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

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

Untitled

Untitled

一个崩溃程序的解读

由于在过程中有入栈保护主程序数据,但是没有弹栈,ip=dx=offfset mess1=0,程序循环

导致栈空间溢出,侵蚀了代码段,导致代码段被覆写,程序崩溃

Untitled

Untitled

五、条件处理

Untitled

Untitled

布尔和比较指令

AND指令

Untitled

Untitled

大小写转换

大小写转换

OR指令

Untitled

整数转为ASCII码

整数转为ASCII码

XOR指令

Untitled

NOT指令

Untitled

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

Untitled

ZF = 两个操作数按位相与【或逻辑,同时判0容易,同时判1难】

CMP指令:(不回送结果,只影响标志位)

Untitled

Untitled

不懂

清除各个标志位的操作

Untitled

条件跳转

Untitled

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

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

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

Untitled

要将一个数据看做是有符号数还是无符号数是取决于程序员

  1. 看你溢出时用 CF 还是 OF
  2. 比较时用 JA 还是 JG

Untitled

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

Untitled

例子:

Untitled

找到第一个不为0的元素

找到第一个不为0的元素

条件循环

Untitled

Untitled

Untitled

为什么需要 pushsfpopsf ,因为 add 也会修改标志位

条件结构

Untitled

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

posted @ 2025-09-15 17:04  Miaops  阅读(11)  评论(0)    收藏  举报