目录
  1. 1. call 标号
    1. 1.1. 依据位移进行转移的call指令
  2. 2. call far ptr 标号
    1. 2.1. 转移的目的之地在指令中的call指令
  3. 3. call 16 位 reg
    1. 3.1. 转移地址在寄存器中的call指令
  4. 4. call word ptr 内存单元地址
  5. 5. call dword ptr 内存单元地址
  6. 6. call和ret的配合使用
call指令

CPU执行call指令时,进行两步操作:
(1)将当前的IP或CS和IP压入栈中;
(2)转移
call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

call 标号

依据位移进行转移的call指令

CPU执行 “call 标号”指令时,进行如下操作:
(1)(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(2) (IP)=(IP)+16位位移。

16位位移=标号处的地址-call指令后的第一个直接的地址;
16位位移的范围为-32768~32767,用补码表示;
16位位移由编译程序在编译时算出。

CPU执行”call 标号”时,用汇编语言解释,相当于进行:
push IP
jmp near ptr 标号

call far ptr 标号

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

CPU执行”call far ptr 标号”指令时,进行如下的操作:
(1) (sp)=(sp)-2
((ss)*16+(sp))=(CS)

(sp)=(sp)-2
((ss)*16+(sp0=(IP)
(2)(CS)=标号所在段的段地址
(IP)=标号在段中的偏移地址

CPU执行”call far ptr 标号”时,用汇编语言解释,相当于进行:
push CS
push IP
jmp far ptr 标号

call 16 位 reg

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

功能:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)
(IP)=(16位reg)

用汇编语言解释,相当于进行:
push IP
jmp 16位 reg

call word ptr 内存单元地址

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

用汇编语言解释,相当于进行:
push IP
jmp word ptr 内存单元地址

比如:

1
2
3
4
mov sp,10h
mov as,0123h
mov ds:[0],ax
call word ptr ds:[0]

执行后,(IP)=0123H,(sp)=0EH

call dword ptr 内存单元地址

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

用汇编语言解释,相当于进行:
push CS
push IP
jmp word ptr 内存单元地址

比如:

1
2
3
4
5
mov sp,10h
mov as,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]

执行后,(CS)=0,(IP)=0123H,(sp)=0CH

call和ret的配合使用

call和ret配合使用来实现子程序
先分析一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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,bx
loops
ret
code ends
end start

CPU执行这个程序的主要过程

可以写一个具有一定功能的程序段,我们称其为子程序,在需要的时候,用call指令去执行。可是执行完子程序后,如何让CPU接着call指令向下执行?call指令去执行子程序之前,call指令后面的指令的地址将存储在栈中,所以可在子程序后面使用ret指令,用栈中的数据设置IP的值,从而转到call指令后面的代码处继续执行。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
assume cs:code
code segment
main: :
:
call sub1
:
:
mov ax,4c00h
int 21h
sub1: :
:
call sub2
:
:
ret
sub2: :
:
ret

code ends
end main

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2018/09/12/call指令/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝