ret 指令:用栈中数据修改IP内容,实现近转移
(1)(IP)=((ss)*16+(sp))
(2)(sp)=(sp)+2
相当于
pop IP
retf指令:用栈中的数据修改CS和IP的内容,实现远转移
(1)(IP)=((ss)*16+(sp))
(2)(sp)=(sp)+2
(3)(CS)=((ss)*16+(sp))
(4)(sp)=(sp)+2
相当于
pop IP
pop CS
2.call 命令,分两步操作
(1)将当前IP或CS和IP压栈
(2)转移
- call 标号(将当前IP压栈后,转移到标号处执行指令)
(1)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2)(IP)=(IP)+16位位移
16位位移=标号处地址-call指令后的第一个字节的地址
16位位移的范围为-32768~32767,用补码表示
16位位移由编译器编译时算出
上面的指令相当于
push IP
jmp near ptr 标号
(根据位移进行转移的call指令)
- call far ptr 标号 (段间转移)
(1)
(sp)=(sp)-2
((ss)*16+(sp))=(CS)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2)
(CS)=标号所在的段的段地址
(IP)=标号在段中的偏移地址
上面的命令相当于
push CS
push IP
jmp far ptr 标号
(转移的目的地址在指令中(机器码))
- call 16位reg
(1)
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2)(IP)=(16位reg)
上面指令相当于
push IP
jmp 16位reg
(转移地址在寄存器中)
- 转移地址在内存中的call指令
(1)call word ptr 内存单元地址
上面的指令相当于
push IP
jmp word ptr 内存单元地址
如:
mov sp,10H
mov ax,0123H
mov ds:[0],ax
call word ptr ds:[0]
执行后(IP)=0123H,(sp)=0EH
(2)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
3.mul 乘法指令
(1)两个相乘的数,要么都是8位,要么都是16位,若是8位,则默认一个存放在al中,另一个放在8位reg或内存单元中,若是16位,一个数默认存放在ax中,另一个放在16位reg或内存单元中
(2)结果:若是8位乘法,结果默认存放在ax中,若是16位乘法,高位默认存放在dx,低位默认存放在ax
如:
mul byte ptr ds:[0]
含义:(ax)=(al)*((ds)*16+0)
mul word ptr [bx+si+8]
含义:(ax)=(ax)*((ds)*16+(bx)+(si)+8)结果的低16位
(dx)=(ax)*((ds)*16+(bx)+(si)+8)结果的高16位汇编
4.调用者和子程序的读写操作恰恰相反:调用者将参数送入参数寄存器,从结果寄存器中取出返回值;子程序从参数寄存器中取出参数,将返回值送入结果寄存器
5.编写子程序时,有可能使用,已经被调用者使用的寄存器,所以,要将子程序中所有要用到的寄存器内容都保存起来,在子程序返回前恢复,可以用栈来保存寄存器中的内容