汇编学习笔记(二):转移指令

章节目录

  1. 转移指令原理
  2. jmp 指令
  3. jcxz 指令
  4. loop 指令
  5. ret 和 retf 指令
  6. call 指令
  7. call+ret

作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!

本文中所有程序均在DOSBox下使用MASM, LINK编译运行

转移指令原理

转移指令是可以控制 CPU 执行内存中某处代码的指令. 而 CPU 执行内存中哪处的指令是由 CS 和 IP 寄存器中的决定的. 因此, 转移指令是通过修改 CS 和 IP 寄存器的值来控制 CPU 对指令的执行的.

只修改 IP 的转移行为称为 段内转移.
同时修改 CS 和 IP 的转移行为称为 段间转移.

由于转移指令对 IP 的修改范围不同, 段内转移又分为: 短转移和近转移.
短转移: 对 IP 修改范围为 -128 ~ 127.
近转移: 对 IP 修改范围为 -32768 ~ 32767.

jmp 指令

jmp为无条件转移指令, 可以修改 IP 或者同时修改 CS 和 IP.

jmp short 标号

这条指令完成段内短转移. 对 IP 的修改范围为:-128 ~ 127. 执行完该指令之后, CS 的值不变, IP 指向标号在段中的偏移地址.

示例:

这里写图片描述

在上面程序中我们通过 jmp short s 将 IP 指向标号 s 的偏移地址. 当程序执行到 jmp 时, 会直接跳转到 s 处, 从 s 处继续往下执行.

jmp far ptr 标号

这条指令完成段间转移, 又称为远转移. 执行完该指令之后, CS 指向标号所在的段基址, IP 指向标号在段中的偏移地址.

示例:
这里写图片描述

在上面程序中我们通过 jmp far ptr s 将 CS 指向标号 s 的段基址, IP 指向标号 s 的偏移地址. 当程序执行到 jmp 时, 会直接跳转到 s 处, 从 s 处继续往下执行.

其他 jmp 指令

当然转移地址可以存储在寄存器或者内存中, 相应的语法如下:

jmp reg // 其中 reg 为 16位寄存器,其中存储这要跳转的偏移地址.

jmp word ptr 内存单元地址 // 段内转移, 内存单元存放目的偏移地址.
// 示例:
mov ax, 0123H
mov ds:[0], ax
jmp word ptr [ds]:[0] // IP = 0123H

jmp dword ptr 内存单元地址 // 段间转移, 内存单元两个字节,
//高地址处存放着转移的目的段基址, 低字节存放的是转移的目的偏移地址.
// 示例:
mov ax, 0123H
mov ds:[0], ax
mov word ptr ds:[2], 0
jmp word ptr [ds]:[0] // CS = 0, IP = 0123H

Note: 转移指令,不仅仅可以向后跳转, 亦可以向前跳转.

jcxz 指令

该指令为有条件转移指令. 所有有条件转移指令都是短转移.

指令格式: jcxz 标号(如果 CX = 0, 转移到标号处执行)

jcxz 的功能相当于: if (CX == 0) jmp short 标号
当 CX != 0 时, jcxz 什么也不做, 程序继续向下执行.

示例:

这里写图片描述

loop 指令

该指令在上一篇文章中已经涉及,示例可参考汇编语言笔记(一)

ret 和 retf 指令

ret 指令用栈中的数据, 修改 IP 的值, 实现近转移.
retf 指令用栈中的数据, 修改 CS 和 IP 的值, 实现远转移.

CPU 执行 ret 指令时, 进行如下两步操作:

IP = SS * 16 + SP
SP = SP + 2

相当于: pop IP

CPU 执行 retf 执行时, 进行如下四步操作:

IP = SS * 16 + SP
SP = SP + 2
CS = SS * 16 + SP
SP = SP + 2

相当于:
pop IP
pop CS

示例:

ret 用法
这里写图片描述

retf 用法:

这里写图片描述

上述程序中, ret/retf 执行执行后, IP = 0, CS:IP 指向代码段的第一条指令.

call 指令

CPU 执行 call 指令时, 执行以下两步操作:

将当前的 IP 或者 CS 和 IP 压入栈中
转移

call 指令不能实现短转移.

call 标号

CPU 执行此指令时, 执行如下操作:

(1) SP = SP - 2, SS * 16 + SP = IP
(2) IP = IP + 16 位位移

执行 call 标号 指令相当于执行:
push IP
jmp near ptr 标号

call far ptr 标号

CPU 执行此指令时, 执行如下操作:

(1) SP = SP - 2, SS * 16 + SP = CS
SP = SP - 2, SS * 16 + SP = IP
(2) CS = 标号所在段的段基址
IP = 标号在段中的偏移地址

执行 call far ptr 标号 指令相当于执行:
push CS
push IP
jmp far ptr 标号

其他 call 指令

当然转移地址可以存储在寄存器或者内存中, 相应的语法如下:

call reg

reg 为16位寄存器
相应 CPU 操作:
SP = SP - 2, SS * 16 + SP = IP
IP = reg 中的值
相当于:
push IP
jmp reg

call word ptr 内存单元地址

相当于:
push IP
jmp word ptr 内存单元地址
示例:
mov sp, 10H
mov ax, 0123H
mov ds:[0], ax
call word ptr ds:[0] // 执行后 IP = 0123H, SP=0EH

call dword ptr 内存单元地址

相当于:
push CS
push IP
jmp dword ptr 内存单元地址
示例:
mov sp, 10H
mov ax, 0123H
mov ds:[0], ax
mov word ptr ds:[2], 0
call word ptr ds:[0] // 执行后 CS=0, IP = 0123H, SP=0CH

call + ret

这里写图片描述

建议在继续往下看之前, 仔细阅读一下上图中代码, 分析程序结束时 bx 中的值是多少?

分析一下这个程序将非常有助于我们理解 call 和 ret 指令.

(1) 程序执行到 call s 时, IP 此时指向了 call s 的下一条指令 mov bx, ax (CS 和 IP 指向了 CPU 当前要读取指令的地址. 而当前已经执行到了 call s,因此下一条要读取的指令将是 mov bx, ax);
(2) CPU 执行 call s 时, 将当前 IP 值(指向 mov bx, ax 的偏移地址)压栈, 并将 IP 的值改变为标号 s 的偏移地址.
(3) CPU 从标号 s 处开始执行指令, loop 循环结束后, ax = 8
(4) CPU 将 ret 指令读入, IP 指向了 ret 指令后的内存单元(此时仅仅是读取指令,还未执行 ret 指令);
(5) CPU 执行 ret 指令, 从栈中弹出一个值(即 call s 指令先前压入的 mov bx, ax 指向的偏移地址), 将该值存入 IP 中. 此时 CS:IP 指向指令 mov bx, ax.
(6) 执行完 ret 指令之后, 程序将跳转到 mov bx, ax 处继续执行, 直至完成.
(7) 最终, bx = 8.

欢迎交流任何想法.

End…

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言笔记(三): 标志寄存器

章节目录 简介 ZF 标志寄存器PF 标志寄存器SF 标志寄存器CF 标志寄存器OF 标志寄存器几条相关指令DF 标志寄存器PUSHF and POPF 标志寄存器 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介 8086 CPU…

汇编语言笔记(四):内中断

汇编语言笔记:内中断 章节目录 概念 中断过程示例: 0 号中断处理 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 概念 中断信息: 任何一个通用 CPU 都具备一种能力, 可以在执行完当前正在执行的指令之…

ASN.1 学习

ASN.1 章节目录 简介常用数据类型 2.1 常见的简单类型 2.2 结构类型Basic Encoding RulesDistinguished Encoding Rules编码示例 5.1 BIT STRING 5.2 IA5String 5.3 INTEGER 5.4 NULL 5.5 OCTET STRING 5.6 UTCTime 5.6 OBJECT IDENTIFIER编码 Name (X.501 type) 参考 http://…

证书体系: PFX 文件格式解析

原文同时发布于本人个人博客: https://kutank.com/blog/cert-pfx/ 章节目录 PFX 简介PFX 格式解析 2.1 最外层结构 2.2 AuthenticatedSafe 结构 参考 https://tools.ietf.org/html/rfc7292. PFX 简介## 以下引用自维基百科 在密码学中,PKCS #12 定义了…

C10K 非阻塞 Web 服务器

本文由作为 Going Concurrency in Go 的作者 Nathan Kozyra 撰写, 解决了互联网上最著名,最受尊敬的挑战之一, 并试图通过核心 Go 包来解决它. 原文地址: https://hub.packtpub.com/c10k-non-blocking-web-server-go/ 我们已经构建了一些可用的应用程序,并且可以在日常使用的真…

SHA算法描述及实现

SHA 算法的原理及实现 章节目录 简介算法描述 2.1 数据准备 2.1.1 <数据填充 2.1.2 数据分块 2.1.3 设置初始 Hash 值 2.2 Hash 计算 2.2.1 SHA-1 2.2.2 SHA-256 2.2.3 SHA-512实现<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, …

C 语言笔记: 链表节点实现技巧--struct的妙用

链表节点实现技巧–struct的妙用 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 废话 C 语言虽然只提供了非常简单的语法&#xff0c;但是丝毫不影响 C 语言程序员使用 C 来实现很多让人叹为观止的高级功能…

协议簇: Media Access Control(MAC) Frame 解析

Media Access Control(MAC) Frame 解析 前言 千里之行&#xff0c;始于足下。 因为个人从事网络协议开发&#xff0c;一直想深入的学习一下协议族&#xff0c;从这篇开始&#xff0c;我将开始记录分享我学习到的网络协议相关的知识 简介 引用百度百科的描述&#xff1a; 数…

协议簇:Ethernet Address Resolution Protocol (ARP) 解析

简介 前面的文章中&#xff0c;我们介绍了 MAC Frame 的帧格式。我们知道&#xff0c;在每个 Ethernet Frame 中都分别包含一个 48 bit 的源物理地址和目的物理地址. 对于源地址很容易理解&#xff0c;该地址可以直接从硬件上读取. 但是对于一个网络节点&#xff0c;他怎么知道…

协议簇:IPv4 解析

简介 IP 是一种无连接的协议. 操作在使用分组交换的链路层&#xff08;如以太网&#xff09;上。此协议会尽最大努力交付数据包。 尽最大努力意味着&#xff1a; IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有…

协议簇:ICMP 解析

简介 ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题. 比如&#xff0c;当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题. 值得一提的是&#xff0c;它属于网络层&#xff0c;不属…

协议簇:TCP 解析: 基础

简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的&#xff0c;不会互相冲突. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议…

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇&#xff1a;TCP 解析: 基础&#xff0c; 我们这篇文章来看看 TCP 连接建立的过程&#xff0c;也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇&#xff1a;TCP 解析: 建立连接&#xff0c; 我们这篇文章来看看 TCP 连接断开的过程&#xff0c;也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇&#xff1a;TCP 解析&#xff1a;基础 协议簇&#xff1a;TCP 解析&#xff1a;建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号&#xff08;Sequence Number&#xff09; 是 TCP 协议中非常重要的一个概念&#xff0c;以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中&#xff0c;通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启&#xff0c;状态为 active 如果未开启&#xff0c;状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里&#xff0c;我…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候&#xff0c;我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题&#xff1a; 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候&#xff0c;发现连接速度非常慢&#xff08;肉眼可见的慢&#x…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客&#xff1a; https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识&#xff0c;重点集中在 CSR 所包含的信息&#xff0c;及其意义。 CSR 的作用: CSR 通常由想要获…