汇编——寄存器的分类和功能

2023-11-14

在汇编中,个人感觉最重要的部分其实就是寄存器了,这次我们了解一下寄存器的分类和功能。
先说一下寄存器是什么吧,其实就是一部分的空间,我们可以使用这些空间来存储内容
寄存器的空间都是16位的(80x86中,后来有增长),也就是1个字的空间。

堆栈则有一点不一样,我们的堆栈空间是在程序中定义的,可以存储很多个16位二进制数。
注意事项

  1. 堆栈的栈顶指针最开始是在栈顶的,栈顶为高位,也就是存储是从高到低的。
  2. 我们压栈出栈的过程本质上其实就是将我们寄存器的内容进行复制,而不是将寄存器就行移动(不会真的有人感觉是将寄存器拿走了吧,像数据结构那样)

我们一般将寄存器分为:通用寄存器、变址寄存器、指针寄存器和专用寄存器,最后还有一个段寄存器。

通用寄存器

就是我们经常拿来进行数据存放、数据使用的段,一共有四个:AX、BX、CX、DX。
AX:累加器,一般是用于计算
BX:基址寄存器,用来存放存储器地址
CX:计数器,循环操作中常用
DX:数据寄存器,在dos功能调用(比如输出显示)、乘除法中,都用来存储数据,作为默认项(乘除法的指令中我们默认的结果存放位置就有dx寄存器),还可以作为双字数据的高位。(比如一个32位数,我们就可以将16-31放在DX,低位习惯放在AX中)

(当然除了这些特殊性的行为,剩下的情况中这些寄存器基本上没有区别。)

上述的寄存器都是可以进行拆分的(其他的都不行),AX = AH+AL。
也就是我们可以将AH和AL当成两个8位的寄存器进行使用。

变址寄存器

比如数组,或者更具体的字符串,因为寄存器每次只能存储16位数据,所以一个字符串应当一位位的读取(尤其是字符串类型为 dw ),这里就涉及到了一个变址的问题,也就是在数组名这个地址基础上,我们当前的位置进行了多少的移动。
寄存器:SI(源寄存器)和DI(目的寄存器)

如果只有一个数组,两个寄存器用起来差不多,我们一般将SI/DI和DS联用(DS是后面讲的段寄存器),来确定数据段中某一个存储单元的地址。

如果是两个字符串操作,比如字符串的复制操作,我们就需要将原串放在SI,目的串放在DI,调用指令来处理。
而且一般我们将SI与DS段寄存器联用,用来确定源操作数的地址,DI与ES段寄存器联用,用来确定目的操作数的地址

程序:将mess2复制为mess1
在这里插入图片描述
这里我们使用的指令为lea,将数组的首地址给寄存器的意思。
cx寄存器放置的就是整个数组的大小,也就是我们需要移动的元素个数。
cld指令确定字符串是从左到右的顺序,rep movsb是循环指令,在字符串操作中常用的。

可以看出,我们并没有对si和di 的值进行修改,这是因为两者是可以自增的。

指针寄存器

之前提到的堆栈,我们所需要的指针就是存储在指针寄存器中。
指针寄存器分为两个,
一个是SP:堆栈指针寄存器,用于存放栈顶指针的位置
另一个是BP:基址指针寄存器,用于寻找栈内的元素。

比如我将几个元素都进行了压栈,然后发现自己需要栈内的一个元素,那么我们就可以修改SP指针,或者是使用SP指针来进行寻址,比如[SP+8]这样的方式。

专用寄存器

专用寄存器分为两大部分,首先是指令指针寄存器,然后是标志寄存器。

怎么还有指针寄存器?
我们的代码部分,如果在子程序或者循环部分进行单步调试查看IP寄存器的内容,可以发现在进行跳转的过程中IP指针发生了跳动,而正常情况下则是不断自增
我们要知道,其实在我们一行行的实现程序的过程中,我们的一条条指令都是有一个地址存放的,这样就需要有一个指针来指向当前的指令位置,方便我们取出,进行操作。这个寄存器就是IP寄存器。
IP寄存器在存储指令地址的时候,还有一个CS的段寄存器进行辅助,用来判断是哪一个代码段(我们可能不止一个代码段),这就和地址跳转扯上了关系,这里不多说,给出博客链接,感兴趣看一下,不看也不影响。

另一个标志寄存器FLAGS,存储了一些标志位,分为两种。
第一种:状态标志

  1. 进位标志CF
  2. 零标志ZF
  3. 符号标志SF
  4. 奇偶标志PF
  5. 溢出标志OF

其中CF又称为无符号数的溢出,而OF为有符号数的溢出。
几点前提:

  • 溢出只能发生在同类型相加或者不同类型相减
    如果是无符号数,那么就只可能是在相加时溢出。
  • a求补得到-a,再次求补为a

不论是有符号数还是无符号数,程序不需要知道,程序员知道就行;
程序员不需要知道结果是多少,只需要看数据类型对应的溢出标志位是0还是1,就能知道结果是否正确(虽然溢出了某种程度上也算正确)。

第二种是控制标志

  1. 方向标志DF
  2. 中断允许标志IF
  3. 陷阱标志TF

方向标志是在字符串操作中,我们通过这个标志位的数据来决定串的遍历方向,DF = 0则是从低到高。

中断允许标志控制外部可屏蔽中断是否可以被处理器响应,听起来有一点玄学,主要是用于中断的优先级问题上,这个开始还用不到,等到功能调用时中断会比较常见。(IF = 1,优需中断)

陷阱标志位TF
控制处理器是否进入单步操作方式,TF = 1,进入。
说白了其实就是单步调试的问题,单步过程中每运行一条指令就给一个单步中断,让处理器停止工作,等待下一条指令。

段寄存器

段寄存器主要就是确定该段在内存中的起始位置,感觉段寄存器和其他的寄存器就有一点像数组首地址和偏移地址的感觉。

主要原因还是8086的地址线为20条,但是我们的寄存器只有十六位,多的4位也不好不用,所以我们就采取了物理地址 = 段地址+偏移地址的寻址方式。
其中的段地址就在这些段寄存器中,而偏移地址的求法就千奇百怪了,在寻址的博客中有详细讲解,不影响我们的介绍。

段寄存器分为四个:

  • 代码段寄存器CS,和IP配合找到下一条指令的位置。
  • 数据段寄存器DS,能用来干很多事。
  • 堆栈段寄存器SS,和SP配合寻找栈顶。
  • 附加段寄存器ES,和DI配合用于串指令。

其中的CS和SS主要是针对多个代码段和堆栈段时,如何知道我们当前是哪个段的哪个位置。
DS就是万金油的感觉,在寻址过程中很多情况下的默认段寄存器都是DS。
ES用的会比较少,但是在串部分,我们会将es和di配合使用。

上面的寄存器肯定是不全,下面我们给出一个比较全的默认组合:

  1. CS IP
  2. SS SP or BP
  3. DS BX、DI、SI或一个16位数
  4. ES DI(用于串指令)

总结

这样我们就介绍了8086的寄存器种类,简单讲述了分工。
有一些确实只是在特定的情况下才会遇到,直接上去说就会显得很繁琐,碰到具体问题会进行详细阐述的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编——寄存器的分类和功能 的相关文章

  • 分析常见数据结构在内存中的存储形式

    本文会在x64dbg中分析vector list map的内存存储特点 目录 分析vector在内存中的存储形式 x32dbg分析vector数组 总结一下vector的内存布局 分析 list 在内存中的存储形式 x32dbg分析 lis
  • ARM 64 协程切换上下文的汇编代码解读

    ARM 64协程切换上下文的汇编代码解读 贺志国 2023 8 11 在ARM 64位架构中 有一组通用寄存器 General Purpose Registers 一组浮点寄存器 Floating point Registers 和一组特殊
  • 汇编笔记

    更新于20190929 1 Intel和AT T汇编 参数是反的 AT T寄存器前加 常量前加 Intel mov rax rcx rcx gt rax mov cl 2 对应AT T movq rcx rax rcx gt rax mov
  • CSAPP-BinaryBomb实验

    目录 一 实验目的与要求 二 实验原理与内容 三 实验过程与结果 1 程序编码 汇编 2 拆解过程 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Secret phase 一 实验目的与要求
  • xorl %eax, %eax

    这是GNU的汇编 xorl eax eax 这句起什么作用 按位异或 相同的位置为0 不同的位置为1 eax和eax的每一位都相同 所以相当于清零 movl 8 ebp ecx testl ecx ecx 这句起什么作用 jle L3 8
  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4
  • 汇编语法

    1 通用寄存器 EAX EBX ECX EDX ESI EDI ESP EBP 它 们 的低 16 位就是 8086 的 AX BX CX DX SI DI SP BP 它们的含义如下 EAX 累加器 EBX 基址寄存器 Base ECX
  • 为什么每个程序执行都有内核地址空间和程序地址空间?

    为什么每个用户态的程序映射到虚拟地址空间 都需要有内核地址空间和程序地址空间呢 因为程序地址空间最终都会调用系统调用 也就是内核的东东 所以每个程序要想执行 就必须有内核地址空间 也必须有程序地址空间 所用的application程序要想使
  • 链接、装载与库——编译与链接

    从第二章开始不再按照目录的顺序总结 而是将大块知识点总结在一起 第二章 编译和链接 集成开发环境 IDE 一般都将编译和链接的过程一步完成 此过程成为构建 Bulid 但其掩盖了系统软件运行机制 gcc hello c a out 一个可执
  • arm汇编指令详细整理及实例详解

    目录 一 简介 二 ARM 汇编指令说明 2 1 32位数据操作指令 2 2 32位存储器数据传送指令 2 3 32位转移指令 2 4 其它32位指令 三 实例讲解 3 1 MRS 3 2 MSR 3 3 PRIMASK 3 4 FAULT
  • ARM中的程序状态寄存器(CPSR)

    31 30 29 28 27 8 7 6 5 4 3 2 1 0 N Z C V 保留 I F T M4 M3 M2 M1 M0 N Negative Less Than I IRQ disable Z Zero F FIQ disable
  • Base64编码(汇编版,未做过多优化,性能自认为还可以)

    感谢 DelphiGuy 于 2010 10 08 17 27 37 给出的提醒 function GetSizeCoder3To4 InputCount Integer Integer inline begin Result InputC
  • 反汇编笔记

    1 OD中ctrl f9 运行到返回 就是运行到当前断点所在的函数末尾 retn xxx 处 若xxx 10 那么 10等于10进制的16 就是说这个函数有4个参数 一个参数默认是占4字节 所以就是retn 10 2 调试程序时 在OD内部
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使
  • 汇编 跳转指令: JMP、JCXZ、JECXZ、JA、JE、JNA、JNE、JZ、JB、JS、JC、JNC、JG、JNBE、JO、JP、JL、JPO、JGE、JLE 汇编语言

    以下为JCXZ和JECXZ JMP
  • 机器语言->汇编语言->高级语言

    在硬件层面来看 计算机的运行就是高底电压的变化 这种高低电压的变化在早期是通过开关或插拔电线来控制的 计算机中用0和1来表示低电压和高电压 这些0和1的序列就可以控制计算机CPU进行各种动作 一组一组的0 1序列就是一个一个的指令 这些指令
  • 8259初始化命令字(ICW1-ICW4)

    8259A的中断操作功能很强 包括中断的请求 屏蔽 排队 结束 级联以及提供中断类型号和查询等操作 并且其操作的方式又有不同 它既能实现向量中断 又能进行中断查询 它可以用于16位机 也可用于8位机 因此 使用起来感到复杂且不好掌握 为此
  • 汇编——单字符输入输出+字符串输入输出(换行实现)

    单字符输入输出 默认采用ML6 11汇编程序 DATAS SEGMENT CHAR DB CHAR存储输入的字符 CHANGELINE DB 13 10 用来表示换行符 DATAS ENDS STACKS SEGMENT DB 128 DU
  • ads+jlink和keil+jlink调试环境配置

    ads1 2 and jlinkv8 1 安装ads1 2和jlink驱动Setup JLinkARM V408i exe 安装ads1 2时 最后在100 时如果持续时间长 耐心等一下吧 没有等待而点了cancel 则之后就不好重装了 解
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确

随机推荐

  • 创业公司融资,股权是如何一步步被稀释的?

    转自 https 36kr com p 5054730 融资过程中 股权的稀释总是难免的 本文作者 新元 股书 Kapbook 微信ID Kapbook 完整的股权激励在线解决方案 很多人并没有意识到 他们在加盟公司时拿到的期权比例 并非最
  • 记一次事务报错问题 Transaction synchronization is not active

    问题场景 在一次请求的返回结果中出现了这个错误信息 Transaction synchronization is not active 意思是 事务同步器没有激活 看着不像是业务代码里返回的提示 猜测是spring事务框架报出来的异常没有被
  • 基于SRS的视频直播服务器搭建

    srs提供的一个demo实例 包括实时流的rtmp播放 hls播放 视频会议 ffmpeg视频变换 jwplayer播放 OSMF播放 vlc播放等等功能 下面是在Centos 6 x环境下的编译搭建流程 1 下载或更新源码或者使用git更
  • MVC项目案例

    MVC项目 1 需求 访问链接 http localhost 8080 car get 得到JSON数据 name 保时捷 color 红色 price 641000 0 2 项目结构 cn tedu 放启动类 存子包 cn tedu se
  • [nodejs] 运行的nodejs代码走代理连接外网

    1 背景 nodejs后端调用三方服务sdk 运行主机在公司内外有网址过滤 无法连接到三方服务地址 设置代码走代理后服务调用正常 2 方法 修改node modules rest facade src Client js代码 让网络连接能够
  • Xorm 使用手册,增删改查之查

    Xorm 使用手册 增删改查之查 Xorm轻松学习 个人博客站点 简书 猫轻王 https www jianshu com u 6cce817646be 掘金 猫轻王 https juejin cn user 164091868034745
  • R 实践深度学习

    特点 将帮助您了解流行的深度学习架构及其在 R 中的变体 并为它们提供现实生活中的示例 涵盖了用于预测和分类的基本深度学习技术和概念 将了解神经网络 深度学习架构以及使用 R 实现深度学习的基础知识 将引导您使用重要的深度学习库 如 Ker
  • 4.28黄金双线收官会跌吗?今日如何稳健布局?

    近期有哪些消息面影响黄金走势 双线收官黄金多空该如何研判 黄金消息面解析 现货黄金价格周五 4月28日 小幅收跌 在美国公布第一季GDP增速低于预期后 金价在过去五个交易日内第四次收于2000美元下方 在今年初高通胀 利率继续上行和银行业危
  • 数字通信实验1 调制解调的matlab实现_实验要求

    实验1 调制解调的matlab实现 一 实验目的 掌握2ASK 2FSK 2PSK 2DPSK的调制解调实现流程 二 实验内容 完成2ASK相干解调的收发端完整程序 并画出已调制信号波形 功率谱密度波形 接收端各关键点波形 分别完成2FSK
  • 经验分享:如何运用R的MICE包对数据集中不同变量采用不同方法及跳过部分变量进行多重插补

    运用R的MICE包对数据集进行多重插补 multiple imputation 遇到两个具体需求 1 只需针对缺失值较高的部分变量而不是全部变量进行填充 但仍想将全部变量纳入数据集中 2 对于不同的具体变量 采用不同的多重插补具体方法 如处
  • 微信小程序——如何获取到输入框的值

    在微信小程序中 可以通过以下几种方式来获取输入框的值 使用 bindinput 绑定输入事件 通过 event detail value 获取输入框的值 具体操作如下
  • 拔叉零件的加工工艺,设计18铣槽的铣床夹具

    目 录 一 序言 1 二 零件的分析 3 1 零件的作用 3 2 零件的工艺分析 3 三 确定毛坯 4 四 工艺规程设计 5 五 夹具设计 14 六 总结 17 七 参考文献 18 一 序 言 机械制造工艺学课程设计使我们学完了大学的全部基
  • mock拦截axios请求,以及axios请求拦截设置token

    直接上源码
  • 投中网发布!持安科技荣登中国企业服务产业最佳投资案例TOP10

    近日 2022年度投中榜发布 持安科技凭借业内领先的零信任产品创新力 出众的方案落地实力及广阔的市场发展潜力 成功入选 投中2022年度中国企业服务产业最佳投资案例TOP10 投中榜 是投中信息秉承专业 严谨 客观 公正的原则 对中国私募股
  • 算法通过村第八关-树(深度优先)白银笔记

    文章目录 前言 1 最大深度问题 2 判断平衡树 3 最小深度 4 N叉树的最大深度 总结 前言 提示 我的整个生命 只是一场为了提升社会地位的低俗斗争 埃莱娜 费兰特 失踪的孩子 这一关我们看一些比较特别的题目 关于二叉树的深度和高度问题
  • 笔记-Flutter 之点击空白处取消TextField焦点

    本人是做iOS开发的 点击空白处取消TextField焦点这个需求是非常简单的 在学习Flutter过程中 面对这个需求走了不少弯路 现在得到了一个感觉不错的解决方案 这里和大家分享一下 也希望对小伙伴们有所帮助 GestureDetect
  • 程序设计语言-软件设计(二十一)

    数据结构与算法 二十 快速排序 堆排序 四 https blog csdn net ke1ying article details 129269655 这篇主要讲的是 编译与解释 文法 正规式 有限自动机 表达式 传值与传址 多种程序语言特
  • Taylor公式和插值多项式

    Taylor公式和插值多项式 笔记总结自 复旦大学 陈纪修 数学分析 课程 第5章第3节 Taylor公式和插值多项式 文章目录 Taylor公式和插值多项式 一 Taylor公式 带Peano余项的Taylor公式 带Lagrange余项
  • java代码实现分页_Java分页实现(示例代码)

    首先我们要清楚java分页的思路 第一我们要明白前端页面需要向java后台传递当前页码数以及每页显示多少条数据 第二java后台代码需要向前端页面传递每页显示的数据 以及总条数以及总页数 代码如下 首先我们要创建一个分页类用来存储数据 pu
  • 汇编——寄存器的分类和功能

    在汇编中 个人感觉最重要的部分其实就是寄存器了 这次我们了解一下寄存器的分类和功能 先说一下寄存器是什么吧 其实就是一部分的空间 我们可以使用这些空间来存储内容 寄存器的空间都是16位的 80x86中 后来有增长 也就是1个字的空间 堆栈则