I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::


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指令后面的指令处)继续执行。

posted on 2012-08-01 17:31  jcsu  阅读(2166)  评论(0)    收藏  举报