0
点赞
收藏
分享

微信扫一扫

汇编 无条件转移和过程调用指令

(1)JMP无条件转移指令

  • 指令格式:

JMP 目的

  • 指令功能:
    使程序无条件地转移到指令中指定的目的地去执行。
  • 这类指令又分为两种类型:
  • 第一种类型:段内转移或近(NEAR)转移,转移指令的目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。
  • 第二种类型:段间转移,又被称之为远(FAR) 转移,转移指令的目的地址和JMP指令不在同一段中,发生转移时,CS和IP的值都要改变——程序要转移到另一个代码段去执行。

无条件转移指令的类型和方式

类型

方式

寻址目标

段内转移

直接

立即短转移(8位)

段内转移

直接

立即近转移(8位)

段内转移

间接

寄存器(16位)

段内转移

间接

存储器(16位)

段间转移

直接

立即转移(32位)

段间转移

间接

存储器(32位)

  1. 段内直接转移指令
    指令格式:

JMP SHORT       标号
JMP NEAR   PTR  标号(或JMP 标号)

jmp指令能够修改 IP 或 CS 或者同时修改的指令

  • CS:段地址
  • IP:偏移地址

通过以下指令,修改段地址和偏移地址

jmp 4000:0

汇编 无条件转移和过程调用指令_转移指令

jmp 2600:500

汇编 无条件转移和过程调用指令_指令缓存_02
错误的修改CS和IP的方式:

mov cs,2000

mov ip,500

mov ip,ax

以上三条修改方式均是错误的修改方式。

注意:用以下方式虽然编译成功,但是也不能对CS进行正确的修改。

mov ax,500
mov cs,ax

汇编 无条件转移和过程调用指令_转移指令_03

但是用以下这种方式对IP进行修改:

mov ax,500
jmp ax

汇编 无条件转移和过程调用指令_指令缓存_04

指令执行的过程:

  • 1.CPU从 cs:ip 所组成的地址中读取指令,将这个指令存放到指令缓存器中
  • 2.IP = IP + 所读指令的字节数
  • 3.执行指令缓存器中的内容,回到步骤 1 重复这个过程。

假设cs = 2000, IP = 0000, 写出指令执行的过程

a 2000:0
mov ax,6622   ; cs = 2000, ip = 0 + 3 = 3
jmp 1000:3     ;  cs =2000, ip= 3 + 5  = 8
mov cx,ax

a 1000:0        
mov ax,0123    ; cs = 1000  ip = 0 + 3 = 3
mov ax,0          ; cs = 1000  ip = 3 + 3 = 6
mov bx,ax       ; cs =  1000  ip = 6 + 2 =8
jmp bx              ;cs = 1000  ip = 0

汇编 无条件转移和过程调用指令_转移指令_05
汇编 无条件转移和过程调用指令_段地址_06

汇编 无条件转移和过程调用指令_指令缓存_07

例:

mov ax,bx     ; ax = bx
sub ax,ax      ; ax = ax - ax =0
jmp ax           

mov ax,bx     ; => 指令缓存器 => 1   =>  执行
sub ax,ax      ; => 指令缓存器 = > 1  = > 执行
jmp ax           ; => 指令缓存器 = > 1   => 执行 => 1

汇编 无条件转移和过程调用指令_段地址_08

上面3条指令执行后,cpu 4次修改了IP,最后一次IP的值为0

用3条指令写入从2000:0开始的内存单元,利用3条指令计算 2 的 8 次方

mov ax,1
add ax,ax
jmp 2000:3

汇编 无条件转移和过程调用指令_指令缓存_09
汇编 无条件转移和过程调用指令_转移指令_10
汇编 无条件转移和过程调用指令_指令缓存_11
汇编 无条件转移和过程调用指令_转移指令_12

(2)过程调用和返回指令
在编写程序时,往往把某些能完成特定功能而又经常要用到的程序段,编写成独立的模块,并把它成为过程,习惯上也称为主程序,然后在程序中用CALL语句调用这些过程,调用过程的程序称为主程序。若在过程运行中又去调用另一个过程,称为过程嵌套。它使程序结构清晰,可读性强,同时也能节省内存。

过程调用和返回指令的格式如下:

CALL 过程名
RET

过程调用有近调用和远调用两种类型 。
例如:
汇编 无条件转移和过程调用指令_转移指令_13
上面程序代码执行的顺序:

        call cpy_Boot                 ; 执行该代码后,会跳转到 cpy_Boot ,执行到ret 后跳转到 call cpy_Boot下面的代码继续执行。(类似 C语言的goto)
=============================================================
cpy_Boot:
mov bx,1000H
mov bx,1001H
mov bx,1002H
mov bx,1003H
mov bx,1004H
ret

mov ax,1000H
mov ax,1001H
mov ax,1002H
mov ax,1003H
mov ax,1004H

mov ax 4c00H
int 21H

举报

相关推荐

0 条评论