8086汇编(16位汇编)学习笔记06.串操作、流程转移指令

8086汇编(16位汇编)学习笔记06.串操作、流程转移指令-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net

串操作

源操作数使用si,默认段为DS,可段超越

目的操作数使用di,默认段为ES,不可段超越

img

串方向

串方向由DF标志位影响,可以由指令修改

img

重复前缀

串操作指令一般都配合重复前缀使用,实现内存的批量操作。

img

流程转移指令

1.无条件跳转

直接转移 jmp

img

短跳 jmp 或者 jmp short

偏移值范围是 - 128(80H) 到 127(7FH) , 偏移值大小是 一个字节

;栈段
stack segment stackstack ends ;数据段
data segment g_szBuf db 255 dup(0)
data ends ;代码段
code segmentSTART: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,axmov ax,axjmp   LEABEL1  ; 跳转到标号 LEABEL1mov ax,axmov ax,axLEABEL1:  mov dx,dxmov dx,dxjmp   LEABEL2  ; 跳转到标号 LEABEL2mov dx,dxLEABEL2:  mov cx,cxmov cx,cxcode ends 
end START 

img

img

ip 里面存的是下一条指令的地址. ip被改了,代表下一条指令 也被修改了

img

jum 既然能跳转,那么指令肯定包含了 要跳转的地址信息 ,那么是如果做到的呢

开始IP跳转IP地址偏移值机器码
0009000f6EB04
001300174EB02

从表格中我们不难分析出来 EB 代表 jmp 指令 ,其机器码中并没有直接存储 目标地址的 ip信息 ,也不是直接存储偏移,而是地址偏移值 - 2 , 即 下一条指令 到 目标地址的偏移,那为什么不存储本条指令地址和目的地址的偏移,而要存下一条的呢,因为当一条指令执行完,IP地址就指向了下一条指令的ip地址,如果要储存自己和目标指令的偏移,需要先 - 2 ,把ip地址 改回当前自己的,再去算偏移,所以就直接存储 下条指令的 ip 地址 和目标地址的偏移

上面是考虑的是 从上往下跳,如果从下往上跳呢

stack segment stack    ;栈段stack ends data segment     ;数据段g_szBuf db 255 dup(0)
data ends code segment    ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,axmov ax,axjmp   LEABEL1  ; 跳转到标号 LEABEL1mov ax,axmov ax,axLEABEL1:   mov dx,dxmov dx,dxjmp   LEABEL1  ; 跳转到标号 LEABEL1jmp   LEABEL2  ; 跳转到标号 LEABEL2mov dx,dxLEABEL2:  mov cx,cxmov cx,cxcode ends 
end START 

img

开始IP跳转IP地址偏移值机器码
0013000f-4EBFA

FA 是 -6 , -4 = -6 +2 ,因此向上跳 也是 记录的 下条指令 到 目标地址的 偏移

近跳 jmp 或者 jmp near

短跳的偏移值 范围 是 - 128(80H) 到 127(7FH) ,如果超过这个范围,那么短跳将无法实现,此时就需要用到近跳

近跳 偏移值范围是 - 32766((8000H)) 到 32765(7FFFH) , 偏移值大小是 一个字

stack segment stack    ;栈段
stack ends data segment   ;数据段g_szBuf db 255 dup(0)
data ends code segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,axmov ax,axjmp   LEABEL1  ; 跳转到标号 LEABEL1,此时跳转范围超过一个字节mov ax,axmov ax,axdb 255 dup(0)  LEABEL1:   mov dx,dxmov dx,dxjmp   LEABEL1  ; 跳转到标号 LEABEL1jmp   LEABEL2  ; 跳转到标号 LEABEL2mov dx,dxLEABEL2:  mov cx,cxmov cx,cxcode ends 
end START 

img

此时 这条指令 占3个字节,偏移值是一个 word ,偏移值 是 0103 (小尾保存的 )

000c (下条指令地址) + 0103 (偏移值) = 010F 及目标地址

远跳 jmp far

上面都是在一个段内跳转,如果在不同段内跳转 ,其偏移值 可以 超过 word 的表达范围,此时就需要用远跳

img

stack segment stack    ;栈段
stack ends data segment   ;数据段g_szBuf db 255 dup(0)
data ends code1 segment  ;代码段db 64 dup(0)
LEABEL3: xor ax,axxor ax,axdb 521 dup(0)code1 endscode segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,axmov ax,ax;jmp far ptr LEABEL3  ; 跳转到标号 LEABEL3,此时是跨段跳jmp code1:LEABEL3    ; jmp 段名:标号名  ,效果跟上面一样  jmp  LEABEL1  ; 跳转到标号 LEABEL1,此时跳转范围超过一个字节mov ax,axmov ax,axdb 255 dup(0)  LEABEL1:   mov dx,dxmov dx,dxjmp   LEABEL1  ; 跳转到标号 LEABEL1jmp   LEABEL2  ; 跳转到标号 LEABEL2mov dx,dxLEABEL2:  mov cx,cxmov cx,cxcode ends 
end START 

img

指令偏移计算

指令中的偏移值是下一条指令到目的地址的偏移。

img

指令偏移计算练习

计算下列指令的机器码,短跳 0xEB,近跳 0xE9,远跳跳 0xEA。

0AE7:0102 jmp 0120 -- EB1C

  • 120 - 104 = 1C 所以机器码是 E91B02

0AE7:0102 jmp 0320 -- E91B02

  • 因为偏移值超过一个字 ,偏移值是字,因此这条指令是 3个字节 ,下条指令地址是 105

320 - 105 = 021B 所以机器码是 E91B02

0AE7:0102 jmp 20 -- E91BFF

  • 104 - 20 = E4 取反是 FF1C 用一个字节无法表示,所以偏移值应该是用一个字表示,那么该条指令应该是3个字节,下条指令地址应该是 105, 105 - 20 = E5 取反 FF1B 所以机器码是 E91BFF

0AE7:0402 jmp 0100 -- E9FBFD

  • 该条指令偏移值明显看出是一个字,所以指令长度3 ,下条指令地址是 405, 405 - 100 = 305 取反 FDFB,所以机器码是 E9FBFD

0AE7:0122 jmp 0110 -- EBEC

  • 124 - 110 = 14 取反是 EC 所以机器码是 EBEC

img

img

img

img

img

使用寄存器间接转移
  • 格式 jmp reg
  • reg 为通用寄存器,不涉及段寄存器
  • 功能 ip <- reg
  • 只能用于段内转移

img

使用EA的间接转移

把跳转地址存到内存, 跳转时 从 内存里取 出跳转的目标地址

img

注意:

 

在运用转移的时候需要遵循C语言的流程标准,因为类似于goto,不能从一个函数跳到另外一个函数,影响堆栈平衡。

stack segment stack    ;栈段
stack ends data segment   ;数据段g_w dw 0
data ends code segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov g_w, offset  LEABEL4 ;将 LEABEL4 的  偏移值给 g_wjmp g_w  mov ax,axxor ax,axLEABEL4:   ;带返回码的退出mov ax,4C00Hint 21 code ends 
end START 

img

img

stack segment stack    ;栈段
stack ends data segment   ;数据段g_w dw 0g_wEA dw 0g_wCS dw 0 
data ends code1 segment  ;代码段db 64 dup(0)
LEABEL3: xor ax,axxor ax,axdb 521 dup(0)code1 endscode segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov g_wEA,offset LEABEL3 ;将 LEABEL3 的  偏移值给 g_wEA;mov g_wCS,code          ;将 LEABEL3 的 段基址给 g_wCSmov  g_wCS,seg LEABEL3   ;将 LEABEL3 的  段基址给 g_wCSlea bx,g_wEA             ;将 g_wEA 的  偏移地址给 bxjmp dword ptr [bx]       ;取出偏移值为bx (即 g_wEA) 处的值,并跳转到该处 jmp g_w  mov ax,axxor ax,axLEABEL4:   ;带返回码的退出mov ax,4C00Hint 21 code ends 
end START 
2.条件跳转

依据标志位判断,条件成立则跳转,条件不成立则不跳。

单条件跳转

深色表示常用,需要掌握 ,其他的表是用的比较少,熟悉即可

jz/je

比较2个数,相等输出 eaqul 不等输出 not eaqul

stack segment stack    ;栈段
stack ends data segment   ;数据段g_w0 dw 1122Hg_w1 dw 3344Hg_w2 dw 1122Hg_szEqu db "eaqul",0dh,0ah,'$'g_szNEqu db "not eaqul",0dh,0ah,'$'
data ends code segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段mov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给ds;不直接给是因为没有立即数到段寄存器mov ax,g_w0   ;将 g_w0 的值 给 axcmp ax,g_w1   ; ax的值 和 g_w1 作比较jz  LEABEL2   ; 如果比较的值相等则跳转 LEABEL2 标号处;输出字符串  g_szNEqulea dx,g_szNEqumov ah,09Hint 21Hmov ax,g_w0   ;将 g_w0 的值 给 axcmp ax,g_w2   ; ax的值 和 g_w2 作比较jz  LEABEL2   ; 如果比较的值相等则跳转 LEABEL2 标号处;输出字符串  g_szNEqulea dx,g_szNEqumov ah,09Hint 21Hjmp EXITLEABEL2:;输出字符串  g_szEqulea dx,g_szEqumov ah,09Hint 21HEXIT:  ;带返回码的退出mov ax,4C00Hint 21H code ends 
end START 

img

jcxz

判断2个字符串是否相等,相等则输出 eaqul 否则输出 eaqul not

stack segment stack    ;栈段
stack ends data segment   ;数据段g_w0 dw 1122Hg_w1 dw 3344Hg_w2 dw 1122Hg_szEqu db "eaqul",0dh,0ah,'$'g_szNEqu db "eaqul not ",0dh,0ah,'$'
data ends code segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段cldmov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给dsmov es,ax        ;不直接给是因为没有立即数到段寄存器mov cx,offset g_szNEqu - offset g_szEqulea si,g_szEqulea di,g_szNEqurepz cmpsb       ;2个字符串进行比较,直到cx等于0,或者不等退出jcxz LEABEL2    ;如果 cx 等于 0 则跳转,否则不跳转;输出字符串  g_szNEqulea dx,g_szNEqumov ah,09Hint 21Hjmp EXITLEABEL2:;输出字符串  g_szEqulea dx,g_szEqumov ah,09Hint 21HEXIT:  ;带返回码的退出mov ax,4C00Hint 21H code ends 
end START 

C:>DEBUG JMP.EXE

-G

EAQUI

NOT

NORMALLY (0000)

PROGRAM TERMINATED

image.png

无符号数判断

image.png

有符号数判断

image.png

3.LOOP

使用频率很高 只能用于短转移

格式: loop 标号

image.png

image.png

字符串小写转大写,并输出

stack segment stack    ;栈段
stack ends data segment   ;数据段g_w0 dw 1122Hg_w1 dw 3344Hg_w2 dw 1122Hg_sz db "helloworld",0,0dh,0ah,'$'g_szEqu db "eaqul",0dh,0ah,'$'g_szNEqu db "eaqul not ",0dh,0ah,'$'
data ends code segment  ;代码段START: assume ds:data   ;指定data段 作为 ds 段cldmov ax,data      ;先把data的偏移值给axmov ds,ax        ;ax再把data的偏移值给dsmov es,ax        ;不直接给是因为没有立即数到段寄存器;输出字符串  g_szNEqulea dx,g_szmov ah,09Hint 21Hmov cx,offset g_szEqu - offset g_sz -4 ;去掉\0 和\r\n,'$'lea bx,g_szLEABELLOOP:;小写转大写mov si,cxsub byte ptr[bx+si-1], 20hloop LEABELLOOP  ;输出字符串  g_szNEqulea dx,g_szmov ah,09Hint 21HEXIT:  ;带返回码的退出mov ax,4C00Hint 21H code ends 

img

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

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

相关文章

TCP off-path exploits(又一个弄巧成拙的例子)

承接前面几篇文章的观点&#xff0c;本文用一个安全攻击的例子说明为了解决一个伤害很低的低概率问题&#xff0c;会引入多么大的麻烦&#xff0c;这次是可怕的被攻击 (⊙o⊙)。 TCP 端口号只有 16bit&#xff0c;序列号只有 32bit&#xff0c;这意味着在强大攻击算力面前&…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA&#xff08;自调制特征聚合模块&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。随着深度学习在计算机视觉中的不断进展&#xff0c;目标检测任务也在快速发展。YOLO系列模型&#xff08;You Onl…

大表:适用于结构化数据的分布式存储系统

大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行&#xff08;Row&#xff09;2.2 Column Families&#xff08;列族&#xff09; 2.2.1 设计2.2.2 column key 的格式&#xff1a;family:qualifier2.2.3 访问控制和磁盘/内存记账&#xff08;acco…

【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计

引言 在当今快节奏的生活中&#xff0c;咖啡早已不仅仅是提神醒脑的饮品&#xff0c;更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计&#xff0c;通过将咖啡与情感、魔法元素相结合&#xff0c;创造出一个充满想象力和治愈感…

xterm遇到的问题及解决方案

xterm遇到的问题及解决方案 /r插入终端导致的之后插入的数据覆盖了改行头部的数据 问题说明 如图所示&#xff0c;当在一行输入的候&#xff0c;输入的l插入到了改行的头部。 查看ws返回数据 可见ws返回的信息存在\r字符&#xff0c;在xterm.js中\r是回车字符的意思&…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来&#xff1f; 查看是否被360主页锁定&#xff0c;地址栏输入chrome://version&#xff0c;看命令行end后面&#xff08;蓝色部分&#xff09;&#xff0c;是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

描述&#xff1a;在blender中合并的模型导出为glb&#xff0c;在threejs中导入仍显示多个mesh&#xff0c;并不是统一的整体&#xff0c;导致需要整体高亮或者使用DragControls等不能统一控制。 原因&#xff1a;模型有多个材质&#xff0c;在blender中合并的时候&#xff0c;…

C语言----输入输出

目录 输入输出 1.按格式输入输出 2. 按格式输入 3. 按字符输入输出 输入&#xff1a; 输出&#xff1a; 垃圾字符回收 1. 通过空格回收 2. %*c 3.getchar&#xff08;&#xff09; 强制类型转换 输入输出 分为按格式输入输出和按字符输入输出 1.按格式输入输出 通…

计算机网络 (10)网络层

前言 计算机网络中的网络层&#xff08;Network Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

一维、线性卡尔曼滤波的例程(MATLAB)

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能&#xff0c;用于估计在存在噪声的情况下目标状态的真实值 文章目录 一维线性卡尔曼滤波代码运行代码介绍1. **初始化部分**2. **数据生成**3. **卡尔曼滤波器实现**4. **结果可视化**5. **统计输出** 源代码 总结 一维线…

【Compose multiplatform教程13】【组件】Column和Row组件

查看全部组件文章浏览阅读495次&#xff0c;点赞17次&#xff0c;收藏12次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Column 功能说明&#xff1a;将子组件按照垂直方向依次排列&#xff0c;能够设置组件之间的间距、对齐方式等属性&#xff…

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好&#xff0c;我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 观察者模式和发布-订阅模式有什么异同&#xff1f;它们在哪些情况下会被使用&#xff1f; 1000道 …

每天40分玩转Django:实操多语言博客

实操多语言博客 一、今日学习内容概述 学习模块重要程度主要内容国际化配置⭐⭐⭐⭐⭐基础设置、语言切换翻译模型⭐⭐⭐⭐⭐多语言字段、翻译管理视图处理⭐⭐⭐⭐多语言内容展示、URL处理前端实现⭐⭐⭐⭐语言切换、界面适配 二、模型设计 # models.py from django.db im…

iviewui表单验证新手教程

1、表单验证介绍 下面来讲解iviewui表单验证的实现&#xff0c;下面上示例代码&#xff1a; <template><Form ref"formInline" :model"formInline" :rules"ruleInline" inline><FormItem prop"user"><!--prop属…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

OpenHarmony开发板环境搭建

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 0.OpenHarmony 0.1 OpenHarmony OpenHarmony是一款面向全场景、全连接、全智能的…

Web前端基础知识(四)

CSS简介 CSS(层叠样式表)&#xff0c;用于定义网页样式和布局的样式表语言。 一般与HTML一起用于构建web页面的。 HTML负责定义页面的结构和内容&#xff0c;CSS负责控制页面的外观和样式。 通过CSS&#xff0c;可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景…

ESP32_h2-创建一个工程后,添加驱动文件并在调用

点击F1或者ctrlshiftP 输入组件名字&#xff1a; 创建好后&#xff0c;可以看到文件目录多了components文件夹和组件文件 &#xff08;文件夹名字uart就是组件名字&#xff09;这里更改了文件名字 在整个工程目录下找到&#xff1a; 添加路径 finish&#xff01; 调用 程…

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…