一步步学汇编(九) call & ret
call和ret指令都是转移指令,都修改IP,或同时修改CS和IP。经常被用来
实现子程序的设计。
ret指令用栈中的数据,修改IP的内容,实现近转移
retf指令用栈中的数据,修改CS和IP的内容,实现远转移
CPU执行ret指令时的操作:
(1)(IP)=((SS)*16+(SP))
(2)(SP)=(SP)+2
CPU执行retf指令是的操作:
(1)(IP)=((SS)*16+(SP))
(2)(SP)=(SP)+2
(3)(CS)=((SS)*16+(SP))
(4)(SP)=(SP)+2
CPU执行call指令是进行的操作:
(1) 将当前的IP或CS和IP压入栈中
(2) 转移
依据位移惊醒转移的call指令操作:
(1) (sp)=(sp)-2
((ss)*16+(sp))=(ip)
(2) (ip)=(ip)+16位位移
"call far ptr 标号"实现的是段间转移,其操作如下:
(1)(sp)=(sp)-2
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(ip)
(2)(cs)=标号所在段的段地址
(ip)=标号在段中的偏移地址
"call 16位寄存器",操作如下:
(sp)=(sp)-2
((ss)*16+(sp))=(ip)
(ip)=(16位寄存器)
call word ptr 内存单元地址,操作:
push ip
jmp word ptr 内存单元地址
call dword ptr 内存单元地址,操作:
push CS
push IP
jmp dword ptr 内存单元地址
mul指令:乘法指令
两个相乘的数,要么都是8位要么都是16位,如果是8位,一个默认放在Ah
中,另一个放在内存字节单元中或8位寄存器中,如果是16位,一个默认
放在AX中,另一个放在内存字单元中或16位寄存器中
相乘的结果:如果是8位,结果默认放在AX中;如果是16位乘法,结果高位默认
放在DX中,低位默认放在AX中