这周主要学习的是转移指令的相关知识和原理。
- offset在和汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
- jmp是无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
- CPU在执行jmp指令的时候不需要转移的目的地址,机器码中包含的的是转移的位移。
- Ret指令用栈中的数据,修改IP的内容,从而实现近转移。
Ret=POP IP
Retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
Retf=POP IP POP CS
- CPU执行call指令时,进行两步操作:
- 将当前的IP或CS和IP压入栈中(call下一个指令的IP)
- 转移
- mul乘法指令:
(1)两个相乘的数要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在AX 中,另一个放在16位reg或内存字单元中。
(2 )结果:如果是8位乘法,结果默认放在AAX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。
- 几个重要的标志寄存器
ZF 零标志位 如果结果为0,那么zf=1;如果结果不为0,那么zf=0
PF 奇偶标志位 如果1的个数为偶数,pf=1;如果为奇数,那么pf=0
SF 符号标志位 如果结果为负,sf=1;如果非负,sf=0
CF 进位标志位 在进行无符号运算的时候,它记录向更高有效位的进位
OF 溢出标志位 在进行有符号运算的时候,超过机器所能表示的范围称为溢出
DF 方向标志位 在串处理指令中,控制每次操作后si、di的增减
- adc是带进位加法指令(adc ax,bx 实现的功能是ax=ax+bx+cf)
sbb是带借位减法指令(sbb ax,bx 实现的功能是ax=ax-bx-cf )
- cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果,仅仅根据计算结果对标志寄存器进行设置。
指令cmp ax,bx的逻辑含义是比较ax和bx中的值,如果执行后:
zf=1,说明ax=bx
zf=0,说明ax≠bx
cf=1,说明ax<bx
cf=0,说明ax≥bx
cf=0并且zf=0,说明ax>bx
cf=1或zf=1,说明ax≤bx
- 检测比较结果后的条件转移指令
指令 含义 检测的相关标志位
jcxz 短转移 cx=0
je 等于则转移 zf=1
jne 不等于则转移 zf=0
jb 低于则转移 cf=1
jnb 不低于则转移 cf=0
ja 高于则转移 cf=0且zf=0
jna 不高于则转移 cf=1或zf=1