zoukankan      html  css  js  c++  java
  • 修改CS、IP的指令(学习汇编)

    在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

    我们如何改变CS、IP的值呢?显然,8086CPU必须提供相应的指令。我们如何修改AX中的值?可以用mov指令,如mov ax,123将ax中的值设为123,显然,我们也可以用同样的方法设置其他寄存器的值,如mov bx,123,mov cx,123,mov dx,123等。其实,8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称为传送指令。

    但是,mov指令不能用于设置CS、IP的值,原因很简单,因为8086CPU没有提供这样的功能。8086CPU为CS、IP提供了另外的指令来 改变它们的值。能够改变CS、IP的内容的指令被统称为转移指令(我们以后会深入研究)。我们现在介绍一个最简单的可以修改CS、IP的指令:jmp指 令。

    若想同时修改CS、IP的内容,可用形如"jmp段地址:偏移地址"的指令完成,如

    jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。

    jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。

    "jmp 段地址:偏移地址"指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。

    若想仅修改IP的内容,可用形如"jmp 某一合法寄存器"的指令完成,如

    jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
    指令执行后:ax=1000H,CS=2000H,IP=1000H
    jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H
    指令执行后:bx=0B16H,CS=2000H,IP=0B16H

    "jmp 某一合法寄存器"指令的功能为:用寄存器中的值修改IP。

    jmp ax,在含义上好似:mov IP,ax。

    注意,我们在适当的时候,会用已知的汇编指令的语法来描述新学的汇编指令的功能。采用一种"用汇编解释汇编"的方法来使读者更好地理解汇编指令的功 能,这样做有助于读者进行知识的相互融会。要强调的是,我们是用"已知的汇编指令的语法"进行描述,并不是用"已知的汇编指令"来描述,比如,我们用 mov IP,ax来描述jmp ax,并不是说真有mov IP,ax这样的指令,而是用mov指令的语法来说明jmp指令的功能。我们可以用同样的方法描述jmp 3:01B6的功能:jmp 3:01B6 在含义上好似mov CS,3  mov IP,01B6。

    内存中存放的机器码和对应的汇编指令情况如图2.27所示,设CPU初始状态:CS=2000H,IP=0000H,请写出指令执行序列。思考后看分析。

     
    图2.27  内存中存放的机器码和对应的汇编指令

    分析:

    CPU对图2.27中的指令的执行过程如下。

    (1) 当前CS=2000H,IP=0000H,则CPU从内存2000H×16+0=20000H处读取指令,读入的指令是:B8 22 66(mov ax,6622H),读入后IP=IP+3=0003H;

    (2) 指令执行后,CS=2000H,IP=0003H,则CPU从内存2000H×16+0003H =20003H处读取指令,读入的指令是:EA 03 00 00 10(jmp 1000:0003),读入后IP=IP+5=0008H;

    (3) 指令执行后,CS=1000H,IP=0003H,则CPU从内存1000H×16+0003H =10003H处读取指令,读入的指令是:B8 00 00(mov ax,0000),读入后IP=IP+3=0006H;

    (4) 指令执行后,CS=1000H,IP=0006H,则CPU从内存1000H×16+0006H =10006H处读取指令,读入的指令是:8B D8(mov bx,ax),读入后IP=IP+2=0008H;

    (5) 指令执行后,CS=1000H,IP=0008H,则CPU从内存1000H×16+0008H =10008H处读取指令,读入的指令是:FF E3(jmp bx),读入后IP=IP+2=000AH;

    (6) 指令执行后,CS=1000H,IP=0000H,CPU从内存10000H处读取指令……

    经分析后,可知指令执行序列为:

    (1) mov ax,6622H

    (2) jmp 1000:3

    (3) mov ax,0000

    (4) mov bx,ax

    (5) jmp bx

    (6) mov ax,0123H

    (7) 转到第3步执行

  • 相关阅读:
    ASP.NET Forums 2.0 修改集锦(一)
    在自己的应用程序中显示Windows关于对话框
    ASP.NET Forums 2.0 本地化修改(四)
    Flash对双字节的支持问题
    DotNetNuke 2.1.2安装指南
    ASP.NET Forums 2.0 本地化修改(五) 增加页面Meta标记的keywords和description
    ASP.NET Forums 2.0 本地化修改(三)
    JavaScript利用正则表达式自己写数字判断函数
    hash表基础知识(转载)
    求子数组的最大和
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/3879188.html
Copyright © 2011-2022 走看看