汇编语言学习总结
CALL和RET指令
ret和retf
ret 指令用栈中的数据,修改IP的内容,从而实现近转移;
retf 指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
ret 指令相当于
pop IP
retf 指令相当于
pop IP
pop CS
检测点10.1
1 | assume cs: code |
call指令
- call 标号
push IP
jmp near ptr 标号
- call far ptr 标号
push CS
push IP
jmp near ptr 标号
- call 16位 reg
push IP
jmp 16位 reg
- call word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
- call dword ptr 内存单元地址
push CS
push IP
jmp dword ptr 内存单元地址
call和ret的配合使用
call 标号
标号:
指令
ret
mul指令
- 两个相乘的数:
两个相乘的数,要么都是8位,要么都是16位。
如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;
如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。 - 结果:
如果是8位乘法,结果默认放在AX中;
如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。
mul reg
mul 内存单元
mul byte ptr ds:[0]
实验十:
1 | cs:code |
标志寄存器
flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义;
而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
ZF标志(第6位)–零标志位
记录相关指令执行后,其结果是否为0.
- 结果为0:zf=1;
- 结果不为0:zf=0。
注意是与结果相反的
PF标志(第2位)–奇偶标志位
它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。
- 1的个数为偶数:pf=1,
- 奇数:pf=0。
SF标志(第7位)–符号标志位
- 结果为负,SF=1;
- 结果为正,SF=0。
通常用补码来表示有符号数据。
因此,对于一个二进制数据,计算机在既把它当做有符号数运算也进行无符号数运算,同时提供两种结果给程序选择。
CF标志(第0位)–进位/借位标志位
记录最高有效位向更高有效位的进位/借位
- 有进位/借位:CF=1,
- 无进位/借位:CF=0。
OF标志(第11位)–溢出标志位
- 有溢出:OF=1,
- 无溢出:OF=0。
CF和OF的区别:
CF是对无符号数运算有意义的标志位;
OF是对有符号数运算有意义的标志位。
adc指令
adc是带进位加法指令,它利用了CF位上记录的进位值。
adc obj1,obj2
obj1 = obj1+obj2+CF