retretf

 

ret指令:用栈中的数据修改IP的内容,从而实现近转移

执行的操作:

(ip)= ((ss)*16+ (sp))

(sp)= (sp) +2

 

retf指令:用栈中的数据修改CSIP的内容,从而实现远转移

执行的操作:

(ip)= ((ss)*16+ (sp))

(sp)= (sp) +2

(cs)= ((ss)*16+ (sp))

(sp)= (sp) +2

 

 

 

 

 

 

 

call指令

 

格式:

call 标号

call far ptr 标号

call reg

call word ptr mem

call dword ptr mem

 

 

格式: call标号

功能:将当前的IP压栈后,转到标号处执行指令

操作:

(sp)=(sp)-2

((ss)*16+(sp))=(IP)

(IP)=(IP)+16位位移

相当于 push IP   jmp near ptr 标号

说明:

1)   16位位移=“标号处的地址-call指令后第一个字节的地址

2)   16位位移的范围是转移到段内的任意位置

3)   16位位移是由编译程序在编译时算出

 

格式:call far ptr 标号

转移的目的地址在指令中的call指令

功能:将当前的CSIP压栈后,转到标号处执行指令

操作:

(sp)= (sp)-2

((ss)*16+ (sp))= (CS)

(sp)= (sp)-2

((ss)*16+ (sp))= (IP)

(CS)=标号所在段的段地址

(IP)=标号在段中的偏移地址

相当于

push cs

pushIP

jmp far ptr 标号

 

格式:call reg

转移地址在寄存器中的call指令

功能:将当前的IP压栈后,转到寄存器中所存放的偏移地址处执行指令

操作:

(sp)=(sp)-2

((ss)*16+(sp))=(IP)

(IP)=(16位寄存器)

转移地址在内存中的call指令

 

格式1call word ptr mem

操作:push IP

jmp word ptr mem

 

例:mov sp,10h

mov ax,0123h

mov ds:[0],ax

call word ptr ds:[0]

 

格式2call dword ptr mem

操作:push cs

push IP

jmp dword ptr mem

 

例:mov sp,10h

mov ax,0123h

mov ds:[9],ax

mov word ptr ds:[2],0

call
dword ptr ds:[0]

 

callret配合实现子程序机制

 

具有子程序的源程序框架:

assume cs:code

code segment

  
main: 

             

call sub1

             

mov ax,4c00h

int 21h

     sub1: 

               

call sub2

               

ret

     sub 2:

               

ret

code ends

end main

 

mul指令

 

mul指令:两操作数指令

功能:完成两个数的相乘

格式:mul reg/mem

 

两个数要么都是8位,要么都是16

若为8位,则一个默认在al中,另一个可以在一个8位寄存器中,也可以是一个字节单元,结果默认放在ax

若为16位,一个默认放在ax中,另一个在一个16位寄存器中或一个字单元中,结果高位默认放在dx中,低位放在ax