目录
一、ret和retf
ret 相当于pop IP
retf 相当于pop IP pop CS
二、call指令
(一)操作:
(1)push IP
push CS
(2)转移
call指令不能实现短转移,除此之外,call实现转移的方法和jmp相同
(二)几种转移方法
1.标号法
(1)近转移(段内)
语法:call 标号
操作:
push IP
jmp near ptr 标号
(2)远转移(段间)
语法:call far ptr 标号
操作:
push CS
push IP
jmp far ptr 标号
2.寄存器法
语法:call 16位reg
操作:
push IP
jmp 16位reg
3.内存法
(1)近转移(段内)
语法:call word ptr 内存单元地址
操作:
push IP
jmp word ptr 内存单元地址
(2)远转移(段间)
语法:call dword ptr 内存单元地址
操作:
push IP
jmp dword ptr 内存单元地址
三、call和ret的配合使用
call是跳转到指定的程序,而ret是回到call,继续执行call下方语句
因此,可以用call和ret来实现子程序的机制。
子程序的框架如下:
assume cs:code
code segment
main:
...
call sub1
...
mov ax,4c00h
int 21h
sub1:
...
call sub2
...
ret
sub2:
...
ret
code ends
end main
四、mul指令
注意事项:
(1)两个相乘的数,要么都是8位,要么都是16位。
如果都是8位,一个默认在AL中,另一个放在8位reg或内存字节单元中
如果都是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
(2)结果
如果是8位乘法,结果默认放在AX中
如果是16位惩罚,结果高位默认放在DX中存放,低位在AX中存放
语法:
mul reg
mul 内存单元
例:计算100*10
mov al,100
mov bl,10
mul bl
结果:(ax)=1000(03E8H)
五、参数和结果传递的问题
1.单个数据的传递
子程序一般需要根据提供的参数处理一定的事务,处理后,将结果提供给调用者。
故需要存储参数和返回值。
例:参数为N,返回N的3次方
可以将参数存储在bx中,将结果放在dx和ax中
cube: mov ax,bx
mul bx
mul bx
ret
2.批量数据的传递
可以将批量数据放在内存中,然后将首地址放在寄存器中,传递给需要的子程序。
例:将一个全是字母的字符串转化为大写
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,4c00h
int 21h
capital: and byte ptr [si],11011111b
inc si
loop capital
ret
code ends
end start