精华内容
下载资源
问答
  • 本博文是对原书8.3.10的内容的总结。 一、相对短转移 指令格式是: jmp short 标号 ...(1)该指令属于段内转移指令,而且只允许转移到距离当前指令-128~127字节的地方。 (2)指令的功能是:(IP) = (IP)+8位位

    本博文是对原书8.3.10的内容的总结。

    一、相对短转移

    指令格式是:

    jmp short 标号

    标号也可以替换成具体的数值(标号和数值是等价的),例如

    jmp short 0x2000

    说明:

    (1)该指令属于段内转移指令,而且只允许转移到距离当前指令-128~127字节的地方。

    (2)指令的功能是:(IP) = (IP)+8位位移量(范围是-127~128,用补码表示)

    (3)short指明此处的位移为8位

    (4)8位位移=标号处的地址-jmp指令后的第一个字节的地址;8位位移由编译器在编译时算出;

    二、16位相对近转移

    指令格式是:

    jmp near 标号

    同理,标号也可以是具体的数值,如

    jmp near 0x3200

    说明:

    (1)该指令属于段内转移,转移范围是-32768~32767

    (2)指令的功能是:(IP)= (IP)+16位位移量(范围是-32768~32767,用补码表示)

    (3)near指明此处的位移为16位

    (4)16位位移=标号处的地址-jmp指令后的第一个字节的地址;16位位移由编译器在编译时算出;

     

    注意:如果没有指定关键字是near或者short,那么NASM编译器会根据目标位置距离当前指令的位移量自动选择near(范围在-127~128内)或者short(范围在-127~128外,但是在-32768~32767内)。

     

    三、16位间接绝对近转移

    指令格式为:

    jmp (near)  r16/m16

    说明:

    (1)这种转移也是段内转移,但是转移的目标不是在指令中直接给出,而是由一个16位的通用寄存器或者内存地址间接给出

    (2)near关键字可以省略

    (3)执行时,处理器将用16位通用寄存器的值或内存中的那个字取代IP寄存器的内容。

    四、16位直接绝对远转移

    指令格式为:

    jmp 段地址:偏移地址

    说明:

    (1)属于段间转移

    (2)执行时,处理器用段地址的内容取代CS的值,用偏移地址(也可以是标号)取代IP的值

    五、16位直接绝对远转移

    指令格式为:

    jmp far m32

    说明:

    (1)关键字far是必须的

    (2)操作数是一个内存地址,内存地址处存放着2个字,低字是偏移地址,高字是段地址

    (3)执行时,处理器根据内存地址找到偏移地址和段地址,分别用来代替IP和CS的内容


    (完)

    展开全文
  • 本博文是对原书8.3.10的内容的总结。 一、相对短转移 ...(1)该指令属于段内转移指令,而且只允许转移到距离当前指令-128~127字节的地方。 (2)指令的功能是:(IP) = (IP)+8位移量(范围是-127~12...

    本博文是对原书8.3.10的内容的总结。

    一、相对短转移

    指令格式是:

    jmp short 标号

    标号也可以替换成具体的数值(标号和数值是等价的),例如

    jmp short 0x2000

    说明:

    (1)该指令属于段内转移指令,而且只允许转移到距离当前指令-128~127字节的地方。

    (2)指令的功能是:(IP) = (IP)+8位位移量(范围是-127~128,用补码表示)

    (3)short指明此处的位移为8位

    (4)8位位移=标号处的地址-jmp指令后的第一个字节的地址;8位位移由编译器在编译时算出;

    二、16位相对近转移

    指令格式是:

    jmp near 标号

    同理,标号也可以是具体的数值,如

    jmp near 0x3200

    说明:

    (1)该指令属于段内转移,转移范围是-32768~32767

    (2)指令的功能是:(IP)= (IP)+16位位移量(范围是-32768~32767,用补码表示)

    (3)near指明此处的位移为16位

    (4)16位位移=标号处的地址-jmp指令后的第一个字节的地址;16位位移由编译器在编译时算出;

     

    注意:如果没有指定关键字是near或者short,那么NASM编译器会根据目标位置距离当前指令的位移量自动选择near(范围在-127~128内)或者short(范围在-127~128外,但是在-32768~32767内)。

     

    三、16位间接绝对近转移

    指令格式为:

    jmp (near)  r16/m16

    说明:

    (1)这种转移也是段内转移,但是转移的目标不是在指令中直接给出,而是由一个16位的通用寄存器或者内存地址间接给出

    (2)near关键字可以省略

    (3)执行时,处理器将用16位通用寄存器的值或内存中的那个字取代IP寄存器的内容。

    四、16位直接绝对远转移

    指令格式为:

    jmp 段地址:偏移地址

    说明:

    (1)属于段间转移

    (2)执行时,处理器用段地址的内容取代CS的值,用偏移地址(也可以是标号)取代IP的值

    五、16位直接绝对远转移

    指令格式为:

    jmp far m32

    说明:

    (1)关键字far是必须的

    (2)操作数是一个内存地址,内存地址处存放着2个字,低字是偏移地址,高字是段地址

    (3)执行时,处理器根据内存地址找到偏移地址和段地址,分别用来代替IP和CS的内容


    (完)

    转载于:https://www.cnblogs.com/longintchar/p/5224402.html

    展开全文
  • 在下列指令中,属于段内转移指令的有( )。 A.JMP SHORT A B.JMP [BX] C.JMP DWORD PTR [BX] D.JMP NEAR PTR [BX+SI] 6.在下列指令中,错误的指令有( )。 A.SUB 5,AL B.ADD AL,BX C.INC [BX] D....
  • 注意,由于 cs 加载了新目标代码段选择子,处理器只要发现段寄存器被加载,段描述符缓冲寄存器就会被刷新,因为处理器认为是换了一个段,属于段间转移,也就是远转移。 所以,当前进程被中断打断后,为了从中断...

    我们知道,中断在发生时,处理器根据收到的中断向量号在中断描述符表中找到相应的中断门描述符。

    处理器从该描述符中加载目标代码段选择子到代码段寄存器 cs 及偏移量到指令指针寄存器 EIP。

    在这里插入图片描述
    注意,由于 cs 加载了新的目标代码段选择子,处理器只要发现段寄存器被加载,段描述符缓冲寄存器就会被刷新,因为处理器认为是换了一个段,属于段间转移,也就是远转移。

    所以,当前进程被中断打断后,为了从中断返回后能继续运行该进程,处理器自动把 cs 和 EIP 的当前值保存到中断处理程序使用的栈中。

    除了要保存 cs、 EIP 外,还需要保存标志寄存器 EFLAGS,

    因为中断是可以在任何特权级别下发生的,不同特权级别下处理器使用不同的栈,如果涉及到特权级变化,还要压入 SS 和 ESP 寄存器。

    那么我们就来看看到底中断的时候是如何来压栈的吧~

    1。当中断发生时,低特权级向高特权级转化时的压栈现象
    在这里插入图片描述
    当处理器根据中断向量号找到中断描述符后,根据中断描述符中的段描述符选择子+GDTR的值,我们可以找到目标段描述符。

    我们是否能访问这个目标段描述符,要做的就是将找到中断描述符时当前的CPL与目标段描述符的DPL进行对比。

    这里我们讨论的是CPL特权级比DPL低的情况,即数值上CPL > DPL.
    这表示我们要往高特权级栈上转移,也意味着我们最后需要恢复旧栈,所以

    (1) 处理器先临时保存一下旧栈的SS和ESP(SS是堆栈段寄存器,因为换了一个栈,所以其也要变,ESP相当于在栈上的索引),然后加载新的特权级和DPL相同的段,将其加载到SS和ESP中,然后将之前保存的旧栈的SS和ESP压到新栈中
    在这里插入图片描述

    由于SS堆段寄存器是16位寄存器,所以为了对齐,将其0拓展后压栈。
    然后在新栈中压入EFLAGS标志寄存器,得到图如下:
    在这里插入图片描述

    2.因为是要切换栈,属于段间转移,所以我们还要将旧栈SS和EIP备份,以便中断程序执行后还可以恢复到被中断的进程。因为CS代码段寄存器也是16位寄存器,所以也要在压入栈前进行0扩展,此时如下图
    在这里插入图片描述

    3.某些异常会有错误码,此错误码用于报告异常是在哪个段上发生的,也就是异常发生的位置,所以错误码中包含选择子等信息。错误码会紧跟在 EIP 之后入栈,记作 ERROR CODE
    在这里插入图片描述

    2。当中断发生时,无特权级转化时的压栈现象
    此时由于不会切换栈,就不用保存SS和ESP,但是由于在处理完中断程序后还是要返回源程序中继续执行的,所以,我们的CS EIP寄存器还是要保存的。

    在这里插入图片描述
    这种中断返 回是用 iret 指令实现的。 Iret,即 interrupt ret。注意在返回的时候,其错误码不会自动跳过,所以需要我们手动跳过。

    ????????????????????????

    好了,我们的压栈过程就到此讲完了,下面我们来了解一下,中断程序返回即出栈的过程,假设此时ESP已经跳过错误码指向eip_old

    当处理器执行到 iret指令时,它首先需要从栈中返回CS_old 及EIP_old,由于处理器在中断返回的时候,并不记得自己来的时候也曾经做过特权级检查,所以这时候它还要再进行特权级检查。

    特权级检查如下:
    (1)将cs_old对应的代码段的DPL及cs_old中的RPL做特权级检查, 如果检查通过,随即需要更新寄存器cs和EIP

    由于cs_old在入栈时已经将高16位扩充为 0,现在是 32 位数据,段寄存器 cs 是 16 位,故处理器丢弃 cs_old 高 16 位,将低16 位加载到 cs.
    将 EIP_old加载到 EIP 寄存器,之后栈指针指向 EFLAGS。

    如果进入中断时未涉及特权级转移,此时栈指针是 ESP_old (说明在之前进入中断后,是继续使用旧栈)。否则栈指针是 ESP_new (说明在之前进入中断后用的是 TSS 中记录的新栈)。

    (2)将栈中保存的EFLAGS 弹出到标志寄存器 EFLAGS。如果在第 1 步中判断返回后要改变特权级, 此时栈指针是 ESP_new,它指向栈中的 ESP_old。否则进入中断时属于平级转移,用的是旧栈,此时栈指针是 ESP_old,栈中已无因此次中断发生而入栈的数据,栈指针指向中断发生前的栈顶。

    (3)如果在第 1 步中判断出返回时需要改变特权级,也就是说需要恢复旧栈,此时便需要将 ESP_old 和 SS_old 分别加载到寄存器 ESP 及 SS,丢弃寄存器 SS 和 ESP 中原有的 SS_new 和 ESP_new,同时进行特权级检查。

    由于 SS_old 在入栈时已经由处理器将高 16 位填充为 0,现在是 32 位数据,所以在 重新加载到栈段寄存器 SS 之前,需要将 SS_old 高 16 位剥离丢弃,只用其低 16 位加载 SS。

    至此,处理器回到了被中断的那个进程。

    参考书籍:《操作系统真相还原》第七章7.4.2

    作者:五月的天气
    来源:CSDN
    原文:https://blog.csdn.net/qq_37414405/article/details/84986968
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 5.1 习题(20)

    2020-06-05 07:57:43
    为CPU做出一些判断:转移指令、中断指令提供依据 7, CPU位数是指CPU总线线数,CPU一次性能处理位数 一般和机器字长是一致 需要访存时间,访存一次都是直接计算一次 地址总线线数->可寻址范围->...

    2,

    程序状态寄存器属于运算器

    3,

    通用寄存器不是一开始就有功能的,需要编写技术逻辑与移位逻辑

    本身不一定具备

    通用寄存器是可编程的多功能寄存器

    6,

    标志寄存器PWR,FR是运算器的一部分,有当前指令执行结果的状态信息

    控制信息:允许中断,有中断置位指令

    为CPU做出一些判断:转移指令、中断指令提供依据

    7,

    CPU的位数是指CPU总线的线数,CPU一次性能处理的位数

    一般和机器字长是一致的

    需要访存的时间,访存一次都是直接计算一次

    地址总线的线数->可寻址范围->存储器最大容量

    数据总线的线数->一次可取的数据位数->MDR的位数->运算器寄存器的位数

    控制总线线数->一次可并行传送的控制信息位数

    I/O线数->与外设通信的并行程度

    8,

    用户可见 用户不可见
    通用寄存器R MAR
    程序状态寄存器PSW MDR
    程序计数器PC 指令寄存器IR
    暂存寄存器Y

    10,

    PC在取指后自增

    转移指令分为条件转移和无条件转移

    条件转移有可能不满足就不跳转

    无条件转移会无条件跳转

    11,

    无条件跳转指令,取指令自增一次,执行的时候回修改一次,一共修改两次

    12,

    通用寄存器存放了操作数和各种地址信息

    机器字长决定了地址的长度,一次性能处理的二进制位数

    通用寄存器的位数由机器字长决定

    15,

    通用寄存器可以存放数据和地址,和一些指令但不能替代专用寄存器

    16,

    寄存器 功能
    程序计数器 指令地址
    累加寄存器 计算的中间结果
    中断寄存器 优先级控制
    程序状态字寄存器 表示程序和机器运行的状态,为转移指令、中断指令提供依据

    17,

    状态寄存器,保留运算指令或测试指令的结果而建立的状态信息

    18,

    如何取指令:PC

    拿来放哪里:IR

    如何解析指令:CU

    19,

    指令译码,只会对操作码进行译码

    20,

    地址译码器属于存储器,将地址信号翻译成存储信号,将地址信号翻译成存储单元的选通信号

    21,

    CPU决定指令执行顺序的程序计数器

    22,

    一条指令的周期

    取指周期:取指令

    间址周期:取有效地址

    执行周期:取操作数

    中断周期:保存断点

    多级寻址:前面有一位标志位看是否是最后一个

    23,

    IR存放的是指令的位数

    如果是边界对齐,PC中的位数是总容量/指令的大小,然后用多个二进制位数表示

    如果是间接须知 EA的长度也是类似PC中的,要取决于数的大小

    24,

    25,

    CPU专用寄存器

    MAR,MDR,IR,PSW,PC

    展开全文
  • 第9章转移指令的原理 9.1 操作符offset 9.2 jmp指令 9.3 依据位移进行转移的jmp指令 9.4 转移的目的地址在指令中的jmp指令 9.5 转移地址在寄存器中的jmp指令 9.6 转移地址在内存中的jmp指令 9.7 jcxz指令 ...
  • 7 形成指令地址的方法称为指令寻址,通常是( 顺序)寻址,遇到转移指令时( 跳跃)寻址。 P123 8 CPU从(主存中)取出一条指令并执行这条指令的时间和称为( 指令周期 )。 9 定点 32 字长的字,采用 2 的补码...
  • 重点是数据传送指令、逻辑运算指令和条件转移指令的用法。 • 熟悉那些与CPU引脚信号有关的指令及其使用方法,如IN、OUT、LOCK、WAIT、ESC指令。 • 熟悉各种寻址方式的含义及指令的汇编格式,了解常用指令(如ADD、...
  • 5. 条件转移、无条件转移、转子程序、返主程序、中断返回指令属于A.______类指令,这类指令指令格式中所表示地址不是B.______地址,而是C.______地址。 6. 从操作数物理位置来说,可将指令归结为三种...
  • 当打开二进制文件,需要指定文件图像(物理地址)偏移量,图像大小,对应于图像(虚拟地址)开头虚拟地址,进入点和是否该代码是32位的虚拟地址。     反汇编 最小字符串长度:具有长度小于给定...
  • 单片机期末考试题目及答案详解

    热门讨论 2009-06-23 10:30:30
    12.下列叙述中,不属于单片机存储器系统特点的是 A.扩展程序存储器与片内程序存储器存储空间重叠 B.扩展数据存储器与片内数据存储器存储空间重叠 C.程序和数据两种类型的存储器同时存在 D.芯片内外存储器...
  • 23 运算型指令的寻址和转移指令的寻址,其不同点在于:( )。 A:前者取操作数,后者决定程序的转移地址 B:后者取操作数,前者决定程序的转移地址 C:两者都是取操作数 D:两者都是决定程序的转移地址 24 指定起始...
  • 的是,Linux 上有公认的 C 语言世界最好的编译器 gcc,如果你想得到一个效率更高的开 发环境(并不一定是最友好的,但一定是最强大的),我建议你一定要好好的熟悉一下 Linux。 三.如何得到Linux? 据我所知...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    7.6 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 条 件 语 句 .79 8.2 循 环 语 句 .86 8.3 条 件 编 译.90 8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    7.6 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 条 件 语 句 .79 8.2 循 环 语 句 .86 8.3 条 件 编 译.90 8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 ...
  •  A、windows NT Server 内部采用64体系结构  B、windows NT Server 以“域”为单位集中管理网络资源  C、windows NT Server只支持TCP/IP协议  D、windows NT Server没有融入对Unix支持  Key: B  29、...
  • 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37 2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 空白 40 2.1.7 语句块 41 2.1.8 自动生成控制台程序 41 2.2 定义变量 42 2.2.1 ...
  • 我虽然已经有多年不写代码了,但看这本书时候,让我又重新感受到做程序员乐趣:用代码建设属于自己系统,让电脑听从自己的指令,对系统每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科解释是...
  • 我虽然已经有多年不写代码了,但看这本书时候,让我又重新感受到做程序员乐趣:用代码建设属于自己系统,让电脑听从自己的指令,对系统每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科解释是...
  • 迄今为止计算机程序设计语言发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象编程语言,也属于高级语言。 1-2 面向对象编程语言有哪些特点? 解: 面向对象编程语言与以往各种编程...
  • 操作系统(Operating System,OS),是一种软件,属于系统软件; 1、科普观点 操作系统是计算机系统管理和控制中心,它依照设计者制定各种调度策略组织和管理计算机系统资源,使之能高效地运行。 2、功能...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    2.12 使用编译器指令 57 2.12.1 获得特定于iPhone定义 58 2.12.2 运行时检查 58 2.12.3 记忆标记 59 2.12.4 折叠方法 60 2.13 针对发布进行构建 60 2.14 清除构建 61 2.14.1 针对App Store进行编译 62 ...
  • iPhone开发秘籍(第2版)--详细书签版

    热门讨论 2012-12-11 13:42:25
    2.12 使用编译器指令 57 2.12.1 获得特定于iPhone定义 58 2.12.2 运行时检查 58 2.12.3 记忆标记 59 2.12.4 折叠方法 60 2.13 针对发布进行构建 60 2.14 清除构建 61 2.14.1 针对App Store进行编译 62 ...
  • 3.1.7 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环概念 117 3.2.2 for循环变体 119 3.2.3 while循环 126 3.2.4 do-while循环 128 3.2.5 嵌套循环 129 3.3 C++/CLI编程 132 3.4 小结 137 3.5 ...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

属于位转移指令的是