call和ret指令都是转移指令,它们都修改ip,或同时修改cs和ip。
1、ret和retf
ret指令用栈中的数据修改ip的内容,从而实现近转移。
CPU执行ret指令时,进行下面两步操作:
(ip)=((ss)*16+sp)
(sp)=(sp)+2
相当于pop ip
retf指令用栈中的数据修改cs和ip的内容,从而实现远转移
CPU执行retf指令时,进行操作:
(ip)=((ss)*16+(sp))
(sp)=(sp)+2
(cs)=((ss)*16+(sp))
(sp)=(sp)+2
相当于pop ip
pop cs
2、call指令
call指令经常跟ret指令配合使用,因为CPU执行call指令进行两步操作:
- 将当前ip或cs和ip压入栈中
- 转移jmp
call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令原理相同。
call 标号
将当前ip压入栈中后,转到标号处执行指令
CPU执行操作
(sp)=(sp)-2
((ss)*16+sp)=(ip)
(ip)=(ip)+16位位移
相当于 push ip
jmp near ptr 标号
call far ptr 标号 (段间转移)
CPU操作:
(sp)=(sp)-2
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(ip)
相当于 push cs
push ip
jmp far ptr 标号
call 16位寄存器
功能:
(sp)=(sp)-2
((ss)*16+(sp))=(ip)
(ip)=(16位寄存器)
相当于 push ip
jmp 16位寄存器
call word ptr 内存单元地址
相当于 push ip
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
相当于 push cs
push ip
jmp dword ptr 内存单元地址
3、call和ret的配合使用
assume cs:code
code segment
start : mov ax,1
mov cx,3
call s
mov bx,ax
mov ax,4c00h
int 21h
s:add ax,ax
loop s
ret
code ends
end
可以利用call和ret来实现子程序的机制。
4、mul指令
mul是乘法指令。
相乘的两个数:要么都是8位,要么都是16位
8位:al中和8位寄存器或内存字节单元
16位:ax中和16位寄存器或内存字单元中
结果:
8位:ax中
16位:DX(高位)和AX(低位)中
格式:
mul reg
mul 内存单元
例: mul byte ptr ds:[0]
含义:(ax)=(al)*((ds)*16+0)
5、模块化程序设计
call与ret指令共同支持了汇编语言编程中的模块化设计。
因为现实问题比较复杂,对现实问题进行分析时,把它转换称为相互联系、不同层次的子问题,是必须的解决问题方法。
6、参数和结果传递的问题
应该如何储存子程序需要的参数和产生的返回值。
用寄存器来存储参数
调用者将参数送入参数寄存器,从结果寄存器中取得返回值。
子程序从参数寄存器中取到参数,将返回值送入结果寄存器。
例:
assume cs:code
data segment
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends
start : mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov bx,[si]
call cube
mov [di],ax
mov [di].2,dx
add si,2
add di,4
loop s
mov ax,4c00h
int 21h
cube:mov ax,bx
mul bx
mul bx
ret
code ends
end start
7、批量数据的传递
将批量数据放入内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
对返回结果,也可用同样的方法。
assume cs:code
data segment
db 'conversation'
data ends
code segment
start : mov ax,data
mov ds,ax
mov si,0
mov cx,12
call capital
mov ax,4cooh
int 21h
capital:add byte ptr [si],11011111b
inc si
loop capital
ret
code ends
end start
还有一种通用方法:使用栈来传递参数
8、寄存器冲突的问题
使用jcxz指令来判断
capital:mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short capital
ok:ret