zoukankan      html  css  js  c++  java
  • 汇编语言:第九章 转移指令的原理

    可以修改IP或者CS:IP的指令叫做转移指令.

    只修改IP,称为段内转移如jmp ax,根据对IP修改的范围不同分为短转移和近转移,范围分别为-128到127和-32768到32767

    同时修改CS和IP的指令称为段间转移,如jmp 1000:0

    9.1 offset

    offset 标号,用于取标号的偏移地址,如mov ax,offset start 相当于mov ax,0   start为代码段的标号

    9.2 jmp指令

    jmp是无条件转移指令,可以修改IP或者CS:IP都修改

    jmp指令给出以下两种信息之一:

    (1)转移目的地址

    (2)转移位移

    9.3 根据位移进行转移

    jmp short 标号  表示段内短转移,8个字节长度表示位移量,因此可以表示范围是:向前转移128字节到向后转移127字节

          即 IP=IP+8位位移,8位位移=标号偏移地址 - jmp的下一条指令的偏移地址

    jmp near ptr 标号   表示段内近转移,IP=IP+16位位移

    这两种转移 在编译器编译后给出目标地址,但是机器码会给出位移地址

    9.4 转移的目的地址在指令中

    jmp far ptr 标号,实现段间转移也叫远转移,将标号的段地址和偏移地址放入CS:IP中

    这种转移 编译器编译后给出目标地址,机器码也指定转移的目标地址

    9.5 转移地址在jmp中

    jmp 16位reg

    IP = 16位reg值

    9.6 转移地址在内存中

    jmp word ptr 内存单元地址: 将内存单元处字单元作为IP的值

    jmp dword ptr 内存单元地址: 将内存单元处第一个字单元作为IP值,第二个字单元作为CS值

    检测点9.1

    (1) 程序如下:

    assume cs:code

    data segment

    ?

    data ends

    code segment

    start:

    mov ax,data

    mov ds,ax

    mov bx,0

    jmp word ptr [bx+1]

    code ends

    end start

    要使jmp执行后CS:IP指向程度第一条指令,data中应该怎么填?

    分析:  jmp word ptr [1] 就是把1地址字单元值放入IP,即让CS:IP指向CS:0,所以让1地址字单元值为0

         所以data里应该是db 0,0,0

    (2)程序如下

    assume cs:code

    data segment

    dd 12345678H

    data ends

    code segment

    start:

    mov ax,data

    mov ds,ax

    mov bx,0

    mov [bx],

    mov [bx+2],

    jmp dword ptr ds:[0]

    code ends

    end start

    补全程序使jmp执行后CS:IP指向程序第一条指令

    分析: jmp dword ptr ds:[0] 表示让0地址字单元放入IP2地址字单元放入CS中

    所以让0地址字单元变成0,2地址字单元变成CS,

    所以: mov [bx],bx   此处不可以用 mov [bx],0 因为需要确定指令数据长度

          mov [bx+2],cs

    (3)用Debug 查看内存,结果如下:

    2000:1000 BE 00 06 00 00 00 .....

    则此时,CPU执行指令

    mov ax,2000H

    mov es,ax

    jmp dword ptr es:[1000H]

    后 CS = 0006H,  IP = 00BEH

    9.7

  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/superzhao/p/4666781.html
Copyright © 2011-2022 走看看