Call和Ret指令
ret和retf指令:
ret指令用栈中的数据,修改IP的内容,从而实现近转移.退出
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移,退出
assume cs:codesg
stack segment
dh 16 dup (0)
stack ends
codesg segment
mov ax, 4c00h
int 21h
start:
mov ax, stack
mov ss, ax
mov sp, 16
mov ax, 0
push ax
mov bx, 0
ret
codesg ends
end start
call指令:
call指令经常跟ret指令配合使用,因此cpu执行call指令,进行两步操作
1,将当前的IP或者CS和IP压入栈中
2,转移(jmp)
call指令不能实现短转移,原理和jmp方法相同
依据位移进行转移的指令
call 标号 (将当前的IP压入栈之后,转到标号处执行指令)
16位位移的 = “标号”处的地址-call指令后的第一个字节的地址
16位位移的范围位-32768~32767,用补码表示
转移的目的地址在指令中的call指令
call far ptr 标号
相当于
push CS
push Ip
jmp far ptr 标号
转移地址在寄存器中的call指令
call 16位寄存器
相当于
push Ip
jmp 16位寄存器
转移地址在内存中的call指令
call word ptr 内存单元地址
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
call word ptr ds:[0]
执行后,(IP)= 0123H, (sp) = 0EH
call dword ptr 内存单元地址
相当于:
push CS
push Ip
jmp dword ptr 内存单元地址
mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2], 0
call dword ptr ds:[0]
执行后:(CS)= 0 (IP)= 0123H, (sp)= 0CH
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 start
执行后bx的值为:8 (2的n次方的算法)
font color=red size=4>mull指令:
mull:乘法指令
相乘的两个数必须位数相同,8 * 8 / 16 * 16位
8位:AL中和8位寄存器或者内存字节单元中
16位:AX中和16位寄存器或者内存字单元中
结果:
8位 AX中
16位:DX(高位)和AX(低位)中
格式:
mul 寄存器
mul 内存单元