引言
call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。
10.1 ret 和 retf
ret指令用栈中的数据,修改IP的内容,从而实现近转移!
CPU执行ret指令时,进行下面两步操作:
1.(IP)=((ss)*16+(sp))
2.(sp)=(sp)+2
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
CPU执行retf指令时,进行下面两步操作:
1.(IP)=((ss)*16+(sp))
2.(sp)=(sp)+2
3.(CS)=((ss)*16+(sp))
4.(sp)=(sp)+2
CPU执行ret指令时,相当于进行:
pop IP
CPU执行retf指令时,相当于进行:
pop IP
pop CS
10.2 call 指令
call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
1.将当前的 IP 或 CS和IP 压入栈中
2.转移(jmp)
10.3 依据位移进行转移的call指令
call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
call 标号(将当前的 IP 压栈后,转到标号处执行指令)
CPU 执行指令“call 标号”时,相当于进行:
push IP
jmp near ptr 标号
10.4 转移的目的地址在指令中的call指令
call far ptr 标号(实现的是段间转移)
CPU 执行指令 “call far ptr 标号” 时,相当于进行:
push CS
push IP
jmp far ptr 标号
10.5 转移地址在寄存器中的call指令
call 16位寄存器
CPU执行指令“call 16位寄存器”时,相当于进行:
push IP
jmp 16位寄存器
10.6 转移地址在内存中的call指令
转移地址在内存中的call指令有两种格式:
1.call word ptr 内存单元地址:
push IP
jmp word ptr 内存单元地址
2.call dword ptr 内存单元地址:
push CS
push IP
jmp dword ptr 内存单元地址
10.7 call 和 ret 的配合使用
10.8 mul 指令
mul是乘法指令。
相乘的两个数:要么都是8位,要么都是16位。
1.8 位: 乘数位于AL中和 8位寄存器或内存字节单元中,结果位于AX中;
2.16 位: 乘数位于AX中和 16 位寄存器或内存字单元中,结果位于DX(高位)和AX(低位)中。
内存单元可以用不同的寻址方式给出,比如:
mul byte ptr ds:[0]
含义为: (ax)=(al)*((ds)*16+0);
mul word ptr [bx+si+8]
含义为:
(ax)=(al)*((ds)*16+(bx)+(si)+8)结果的低16位;
(dx)=(al)*((ds)*16+(bx)+(si)+8)结果的高16位;
10.9 模块化程序设计
10.10 参数和结果传递的问题
10.11 批量数据的传递
10.12 寄存器冲突的问题
参考资料:《小甲鱼汇编零基础入门》
《汇编语言》第三版