• [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令


    1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP

    jmp指令要给出两种信息:

    (1) 转移的目的地址

    (2) 转移的距离(段间转移, 段内转移, 段内近转移)

    2- 依据位移进行转移的jmp指令

    jmp short 标号(转到表号处执行指令) ;段内短转移 -128-127

    1 assume cs:codesg
    2 codesg segment
    3 start: mov ax,0
    4         jmp short s
    5         add ax,1
    6     s:inc ax
    7 codesg ends
    8 end start

    执行后 ax 0001H

    2- 根据位移进行转移的原理

    1 assume cs:codesg
    2 codesg segment
    3 start: mov ax,0
    4         jmp short s
    5         add ax,1
    6     s:inc ax
    7 codesg ends
    8 end start

    图1

    1 assume cs:codesg
    2 codesg segment
    3 start: mov ax,0
    4         jmp short s
    5         add ax,1
    6                 add ax,2
    7     s:inc ax
    8 codesg ends
    9 end start    

    图2

    图1jmp 需要转移到 cs:0008 ,图2jmp需要转移到 cs:000B 两图的jmp 行代码的机器指令为 EB03 和 EB06 , 可见CPU在指令jmp命令的时候并不需要转移的目的地址.主要控制转移到哪里的是机器指令中得 EB03,EB06. 03 和 06

    首先回忆下CPU执行指令的过程:

    (1) 从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲区.

    (2) (IP) = (IP) + 所读取指令的长度, 从而指向下一条指令

    (3) 执行指令. 转到1, 重复这个过程

    按照以上步骤,(图1)查看程序执行jmp short s指令的执行过程:

    (1) CS:0B60 IP:0003 CS:IP指向EB03(jmp short s 的机器码)

    (2) 读取指令码EB03进入指令缓冲区

    (3) (IP)=(IP)+所读取的指令长度=(IP)+2 = 0005, CS:IP指向 add ax,1

    (4) CPU执行指令缓冲区的指令EB03

    (5) 指令EB03执行后(IP)=0008H CS:IP指向 inc ax  IP由原来的 0005 + 03(及EB03中得03) = 0008

    实际上指令jmp short "标号" 段内短转移 的功能为: (IP) = (IP) + 8位位移

    (1) 8位位移 = "标号"处的地址 - jmp指令后的第一个字节的地址

    (2) short指明此处位移为8位位移

    (3) 8位位移的范围-128-127,用补码表示

    (4) 8位位移由编译程序在编译时算出

    jmp near ptr 标号 实现段内近转移 功能为 (IP) = (IP) + 16位位移

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

    (2) near prt 指明此处位移为16位位移,进行的是段内近转移

    (3) 16位位移的范围-32768-32767,用补码表示

    (4) 16位位移由编译程序在编译时算出

    3- 转移的目的地址在指令中的jmp指令 

      jmp far ptr 标号 实现的是,段间转移,又称为远转移.指明了指令用标号的段地址和偏移地址.

     1 assume cs:codesg
     2 codesg segment
     3 start:    mov ax,0
     4         mov bx,0
     5         jmp  far ptr s
     6         db 255 dup (0)
     7     s:  add ax,1
     8         inc ax
     9         
    10         mov ax,4c00H
    11         int 21h
    12 codesg ends
    13 end start

      CS:0B60 IP:010A 机器指令:EA0A01600B

    4- 转移的目的地址在寄存器中的jmp指令 

      jmp 16位寄存器

      (IP) = (16位寄存器)

    5- 转移的目的地址在内存中的jmp指令 

      (1) jmp word ptr 内存单元地址(段内转移)

      功能:从内存单元地址开始存放着一个字,是转移的目的偏移地址

      mov ax,0123H

      mov ds:[0],ax

      jmp word ptr ds:[0]

      执行后(IP) = 0123H

      mov ax,0123H

      mov [bx],ax

      jmp word ptr [bx]

      执行后(IP) = 0123H  

      (2) jmp dword ptr 内存单元地址(段间转移)

      功能:从内存单元地址开始存放着两个字,高地址处的字是转移的目的地址, 低地址处是转移的目的偏移地址.

      (CS)=(内存单元地址+2)

      (IP)=(内存单元地址)

      mov ax,0123H

      mov ds:[0],ax

      mov word ptr ds:[2],0

      jmp dword ptr ds:[0]

      执行后:(CS)=0 (IP)=0123H CS:IP指向0000:0123

      

      mov ax,0123H

      mov [bx],ax

      mov word ptr [bx+2],0

      jmp dword ptr [bx]

      执行后:(CS)=0 (IP)=0123H CS:IP指向0000:0123

     1 assume cs:codesg
     2 codesg segment
     3 start:    mov ax,2000H
     4         mov ds,ax
     5         mov bx,1000h
     6         mov word ptr [bx].0,0BEH
     7         mov word ptr [bx].2,6H
     8         mov word ptr [bx].4,0
     9         
    10         mov ax,2000H
    11         mov es,ax
    12         jmp dword ptr es:[1000H]
    13 codesg ends
    14 end start

     执行后:(CS)=0006 (IP)=00BEH CS:IP指向0006:00BE

  • 相关阅读:
    【Mysql】Mysql常见的日志种类及作用
    【Mysql】执行sql的过程
    【Mysql】回表查询原理,利用联合索引实现索引覆盖
    【Mysql】explain详解与索引最佳实践
    【Mybatis】MyBatis源码编译
    【Mysql】MySQL数据存储文件详解
    【LoadRunner-工作原理】
    【LoadRunner-简介】
    【LoadRunner-基础篇】
    【LoadRunner-基础篇】
  • 原文地址:https://www.cnblogs.com/galoishelley/p/3573925.html
Copyright © 2020-2023  润新知