【汇编语言-7】 jmp、push、pop、call、ret


1、转移指令

修改ip或修改ip和cs的指令。

jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
等几种汇编指令,它们对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行。

 

2、堆栈操作

PUSH SRC: SP的值减2,然后把源操作数SRC送入由SP所指的栈顶
POP DST:  先把SP所指的字数据送至目的操作数DST,然后SP值加2

 

3、call、ret

ret:  (IP)=((SS)*16 + (SP)), (SP)=(SP)+2,相当于pop IP
retf: (IP)=((SS)*16 + (SP)), (SP)=(SP)+2, (CS)=((SS)*16 + (SP)), (SP)=(SP)+2,相当于pop IP, pop CS

call: 将当前的IP或CS和IP压入栈中;转移

(1) 根据位移进行转移的call指令
格式:call 标号
操作:sp=sp-2, ss*16+sp=ip, ip=ip+16位位移
相当于:push ip, jmp near ptr标号

(2) 转移的目标地址在指令中的call指令
格式:call far ptr 标号
相当于:push cs, push ip, jmp far ptr标号

 

4、call和ret的配合使用

子程序的实现机制

assume  cs:code

stack segment
  db  8 dup( 0)           1000: 0000   00  00  00  00  00  00  00  00
  db  8 dup( 0)           1000: 0008   00  00  00  00  00  00  00  00
stack ends

code segment
   start:  mov ax,stack   1001: 0000  B8  00  10
          mov ss,ax      1001: 0003  8E D0
          mov sp, 16      1001: 0005  BC  10  00
          mov ax, 1000    1001: 0008  B8 E8  03
          call s         1001: 000B  E8  05  00  ; 机器码中的00 05是标号相对于call的下一条指令的偏移量
          mov ax,4c00h   1001: 000E  B8  00 4C
          int 21h        1001: 0011  CD  21
       s:  add ax,ax      1001: 0013   03 C0
          ret            1001: 0015  C3
code ends
end start

 

该程序的主要执行过程:
(1) 前三条指令执行后,栈的情况如下:
1000:0000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
                                                                                  ↑
                                   ss:sp
(2) call指令读入后,ip=000EH,CPU指令缓冲器中的代码为:E8 05 00
CPU执行E8 05 00,首先,栈中的情况变为:
1000:0000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00
                                                                           ↑
                               ss:sp
然后,ip=ip+0005=0013H
(3) CPU从cs:0013H处(即标号s处)开始执行。
(4) ret指令读入后:
ip=0016H,CPU指令缓冲器中的代码为:C3
CPU执行C3,相当于进行pop IP,执行后,栈中的情况为:
1000:0000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00
                                                                             ↑
                                 ss:sp
ip=000EH
(5) CPU回到cs:000EH处(即call指令后面的指令处)继续执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值