苏州本地网站有哪些,网站建设服务器一般多少钱,郑州中航软件开发有限公司,wordpress 获得备案号文章目录 前言一、转移综述1.1 :背景#xff1a;1.2 转移指令1.3 转移指令的分类按转移行为根据指令对IP修改的范围不同 二、操作符offset2.1 offset操作符是干什么的#xff1f;标号是什么#xff1f; 2.2 nop是什么#xff1f; 三、jmp指令3.1 jmp指令的功能3.2 jmp指令1.2 转移指令1.3 转移指令的分类按转移行为根据指令对IP修改的范围不同 二、操作符offset2.1 offset操作符是干什么的标号是什么 2.2 nop是什么 三、jmp指令3.1 jmp指令的功能3.2 jmp指令依据位移进行转移3.3 两种段内转移短转移近转移 3.4 远转移jmp far ptr 标号远转移jmp far ptr 标号近转移jmp near ptr 标号 3.5 转移地址在寄存器中的jmp指令3.6 转移地址在内存中的jmp指令jmp word ptr 内存单元地址jmp dword ptr 内存单元地址 总结 前言
在计算机编程的世界里汇编语言扮演着一种特殊而重要的角色。它是一种低级语言直接与计算机硬件进行交互提供了对计算机体系结构底层操作的直接控制。在汇编语言中“转移” 是一项基本而关键的操作它使得程序能够灵活地改变执行的流程实现分支和循环等基本结构。其中offset 操作符和 JMP 指令是在汇编中常用于实现转移的两个关键元素。
汇编中的“转移”综述
“转移” 在汇编语言中是一种机制允许程序在执行过程中跳转到其他位置继续执行。这种能力使得程序能够根据不同的条件或需要选择性地执行特定的代码块。在这个过程中涉及到两个主要元素offset 操作符和 JMP 指令。
操作符 offset
offset 操作符用于获取标签或变量在代码段中的偏移量。这个偏移量表示标签或变量相对于代码段的起始地址的位置。通过 offset程序能够动态地处理内存中的数据和执行跳转等操作。这为编程提供了更大的灵活性使得代码能够更容易地适应不同的情境和需求。
JMP 指令
JMP 指令是汇编语言中的跳转指令用于改变程序的执行流程。通过 JMP程序可以无条件地跳转到指定的地址实现代码的非顺序执行。这是实现循环、条件分支等逻辑的基础为程序的控制流提供了关键的控制点。 一、转移综述
1.1 :背景
一般情况下指令是顺序地逐条执行的而在实际中常需要改变程序的执行流程。
1.2 转移指令
可以控制CPU执行内存中某处代码的指令 可以修改IP或同时修改CS和IP的指令
1.3 转移指令的分类
按转移行为
段内转移只修改IP如jmp ax 段内转移Jump within a Segment:
当我们只需要在当前代码段内进行跳转时我们使用段内转移。这就像是在当前程序的一本书中的不同章节之间翻页。例如jmp ax 指令就是一种段内转移。这里ax 寄存器中存储的值将被直接加载到指令指针寄存器IP从而控制程序跳转到 ax 寄存器所指示的内存地址。
段间转移同时修改CS和IP如jmp 1000:0 段间转移Jump between Segments:
有时候我们需要从一个代码段跳转到另一个代码段就像是关闭一本书并打开另一本一样。这时我们使用段间转移。例如jmp 1000:0 指令就是一种段间转移。这里1000 是新的代码段的地址而 0 是该段内的偏移地址。同时指令指针寄存器IP会被设置为 0代码段寄存器CS则会被设置为 1000这样程序就会从新的代码段开始执行。
总的来说这些跳转指令是为了使程序能够按照我们的设计在不同的部分之间流动从而实现更复杂的逻辑和功能。
根据指令对IP修改的范围不同
段内短转移IP修改范围为-128~127
在汇编语言中段内转移可以分为两种短转移和近转移它们主要是根据转移的范围不同而区分的。
段内短转移Short Jump within a Segment:
短转移是一种限制在较小范围内的跳转它的目的是在当前代码段内进行跳转。IP指令指针寄存器的修改范围是 -128 到 127。这就像是在一本小册子的一页上进行跳转适用于相对较短的代码段。例如jmp short label 就是一种短转移指令。这里 short 关键字表示这是一个短跳转。
段内近转移IP修改范围为-32768~32767
段内近转移Near Jump within a Segment:
近转移是一种更广泛的跳转允许在当前代码段内进行更大范围的跳转。IP 的修改范围是 -32768 到 32767。这就像是在一本厚重的书中的章节之间进行跳转适用于相对较大的代码段。例如jmp near label 就是一种近转移指令。
总的来说短转移和近转移的区别在于它们允许的跳转范围大小不同。选择使用哪一种取决于你的程序的结构和需求以便更有效地管理程序的执行流程。
二、操作符offset
2.1 offset操作符是干什么的
在汇编语言中offset 操作符用于获取一个标签label或变量在代码段中的偏移量。这个偏移量表示标签或变量相对于代码段的起始地址的位置。
标号是什么
在汇编语言中标号label是一种用于标识代码位置的符号。你可以把标号看作是程序中的地标或标记帮助程序员更容易地定位和引用特定的代码块或数据。
举个例子如果你有一个循环的开始处你可以在那里放置一个标号类似于这样
start_of_loop:; 这里是循环的代码; ...jmp start_of_loop ; 跳转回循环开始处在这个例子中start_of_loop 就是一个标号它标识了循环的开始位置。当程序执行到 jmp start_of_loop 时它会跳转回这个标号所标识的位置实现循环的目的。
总的来说标号是汇编语言中用于标记和引用代码位置的一种方式使得程序结构更加清晰易于理解和维护。
回到offset举个例子假设有一个标签为 myLabel你可以使用 offset 操作符来获取它相对于代码段起始位置的偏移量就像这样 mov ax, offset myLabel
在这个例子中ax 寄存器将被设置为 myLabel 相对于代码段的偏移量。这个偏移量可以在程序中用于计算地址或进行跳转等操作。 总的来说offset 操作符是用于获取标签或变量在代码段中的位置信息使程序能够动态地处理内存中的数据和执行跳转等操作。
2.2 nop是什么
NOP 是汇编语言中的一个指令它代表 “No Operation”中文可以理解为“无操作”或“空操作”。这个指令在程序执行时不做任何有意义的操作实际上就是告诉计算机处理器不要执行任何操作只是简单地占用一个时钟周期。 为什么会需要这样的指令呢有时候在编写汇编代码时为了满足一些特定的要求比如调整指令的对齐方式或者是占用一些字节的空间我们可能会需要插入一些没有实际操作的指令。NOP 就是为了满足这种需要而设计的。 在汇编语言中NOP 可以写作 NOP也可以写作 NOOP这两者是等效的。一个典型的使用场景是在调试或优化汇编代码时通过插入一些 NOP 指令可以方便地观察程序的行为或者调整指令的布局而不改变实际的逻辑。
三、jmp指令
3.1 jmp指令的功能
无条件转移可以只修改IP也可以同时修改CS和IP
jmp指令要给出两种信息 转移的目的地址 转移的距离
段间转移远转移 jmp 2000:1000段内短转移 jmp short 标号 ; IP的修改范围为 -128~1278位的位移段内近转移 jmp near ptr 标号 ; IP的修改范围为 -32768~3276716位的位移
3.2 jmp指令依据位移进行转移
引子常见指令中的立即数均在机器指令中有体现问题 jmp short 指令中转移到了哪里 jmp short 的机器指令中包含的是跳转到指令的相对位置而不是转移的目标地址。
下边程序jmp short s指令的读取和执行 1(IP)0003CS:IP指向EB 05(jmp 的 机器码) 2读取指令码EB 05进入指令缓冲器 3(IP)(IP)所读取指令的长度 (IP)20005CS:IP指向add ax, 0001 4CPU执行指令缓冲器中的指令 EB05 5指令EB 05执行后 (IP)(IP)05000AHCS:IP指向inc ax 3.3 两种段内转移
短转移
短转移“jmp short 标号” 功能(IP)(IP)8位位移 原理 18位位移 “标号”处的地址-jmp指令 后的第一个字节的地址 2short指明此处的位移为8位位移 38位位移的范围为-128~127用补码 表示 48位位移由编译程序在编译时算出。
近转移
近转移指令“jmp near ptr 标号” 功能 (IP)(IP)16位位移 原理 116位位移 “标号”处的地址-jmp指令 后的第一个字节的地址 2near ptr指明此处的位移为16位位移 进行的是段内近转移 316位位移的范围为 -32769~32767 用补码表示 416位位移由编译程序在编译时算出。
3.4 远转移jmp far ptr 标号
远转移jmp far ptr 标号
段间转移 far ptr指明了跳转到的目的地址即包含了标号的段地址CS和偏移地址IP。
近转移jmp near ptr 标号
near ptr 指明了相对于当前IP的转移位移而不是转移的目的地址。
3.5 转移地址在寄存器中的jmp指令
指令格式jmp 16位寄存器 功能IP 16位寄存器 举例 jmp ax jmp bx
3.6 转移地址在内存中的jmp指令
jmp word ptr 内存单元地址
段内转移 功能从内存单元地址处开始存放着一个字是转移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后(IP)0123Hmov ax,0123H
mov [bx],ax
jmp word ptr [bx]
执行后(IP)0123Hjmp dword ptr 内存单元地址
段间转移 功能从内存单元地址处开始存放着一个字是转移的目的偏移地址。
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:0123mov ax,0123H
mov [bx],ax
mov word ptr [bx2],0
jmp dword ptr [bx]
执行后
(CS)0
(IP)0123H
CS:IP指向0000:0123总结
总体而言汇编语言中的“转移”是编程中不可或缺的一部分。通过 offset 操作符和 JMP 指令程序员能够以底层的方式控制程序的执行流程实现更复杂和灵活的逻辑。这种能力为编程带来了更高的自由度同时也要求程序员对计算机体系结构有更深入的理解。在深入学习汇编语言的过程中理解和掌握这些“转移”的机制将成为编程技能中的重要一环。
相关文章: