汇编语言中各种寄存器的总结

2023-11-06

早期的8086cpu中共有14个寄存器:
分别为:AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES
按照功能来分,大致可分为三类

1、通用寄存器

数据寄存器

AX

Accumulator:累加寄存器,也称之为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的外部设备的输入输出指令都只能使用AL或AX作为数据寄存器。

BX

BX (Base):基地址寄存器,可用于数据寄存器,访问存储器时、可以存放被访问内存的地址,是具有双重功能的寄存器

CX

CX (Count):计数器寄存器;在循环、串操作指令中用作计数器。如在loop循环中用作计数器。

DX

DX (Data):数据寄存器;在乘除法中作为数据累加器,在输入输出操作中存放端口的地址。此外,在做双字长乘除法运算时,DX 与AX合起来存放一个双字长数(32位),其中DX存放高16位(余数),AX存放低16位(商)。

指针寄存器

SP

Stack Pointer:堆栈指针寄存器,存放栈顶的偏移位置,供堆栈操作使用,常用SS搭配进行使用

BP

Base Pointer:基指针寄存器;存放堆栈内数据的基地址

变址寄存器

SI

Source Index:源变址寄存器;主要用于存放地址,在字符串操作中存放源操作数的偏移地址。变址寄存器内存放 的地址在数据传送完成后,具有自动修改的功能。

DI

Destination Index:目的变址寄存器;主要用于存放地址,在字符串操作中存放目的操作数的偏移地址。

2、控制寄存器

IP

IP(Instruction Pointer):指令指针寄存器,常与CS进行配合使用,用于共同寻址。

FLAG

标志寄存器

3、段寄存器

  1. CS(Code Segment):代码段寄存器
  2. DS(Data Segment):数据段寄存器
  3. SS(Stack Segment):堆栈段寄存器
  4. ES(Extra Segment):附加段寄存器

CS:代码段寄存器

基本概念解释

CS,代码段寄存器常与IP(指令指针寄存器)共同使用,指示cpu当前将要读取的指令的地址。

那么cpu如何知晓该执行指令的地址呢?

当我们运行一个可执行文件时,我们需要另外一个程序来将这个可执行文件加载到内存当中,

一般是通过操作系统的外壳程序(也就是 Shell 程序),

Shell 将可执行文件加载到内存中以后,就会设置 CPU 中的两个寄存器,即设置 CS:IP 两个寄存器指向可执行文件的起始地址,此后 CPU 便从这个起始地址开始读取内存中的指令,并且执行。

start作用

start用于标记可执行文件的起始地址。

DS:数据段寄存器

DS,全称:Data Segment register,为数据段寄存器,其作用主要用于访问内存中的数据,常与偏移地址共同使用,那么ds的作用是什么呢?通俗点来说就是寻找数据。cpu要读写一个内存单元时,必须要知晓这个内存单元在哪,因此便可以通过ds(数据段寄存器)和偏移地址两个参数,来确定这个内存单元在哪。

访问内存中的数据的方式

方式一:段地址(ds):[偏移地址]
方式二:[偏移地址],等同于ds:[偏移地址]

需要注意 在访问内存中数据的时候,段地址不能直接写数值而必须由段地址寄存器来提供,比如:

mov ax 3423h
mov 1000h:[0h] ,ax//这种写法就是错误的

而正确的写法

mov ax, 3423h
mov bx, 1000h // 现将内存段地址写书数据寄存器中
mov ds,bx // 将数据寄存器中的内存段地址写入 数据段寄存器中
mov ds:[0], ax // 将数据段寄存器中的数据 写入内存地址、(ds:[0]) 中

DS常见的误用

段寄存器是不支持将数据直接写入的,而是需要借用其他寄存器将数据写入:
如:

mov ds,1000h
//这种方式是错误的

//正确写法
mov bx,1000h
mov ds,bx

SS

堆栈寄存器,一般作为栈和sp搭档,其中ss用作堆栈段的首地址,sp用于堆栈段的偏移地址。
当放入数据时,sp应当先进行移位,再放入数据;当释放数据时,应当先释放数据,sp再进行移位。

ES

扩展段寄存器。

总结

每个寄存器都是16位的,即dword双字节,除了数据寄存器外的寄存器均不可分为两个8位的寄存器使用。

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

汇编语言中各种寄存器的总结 的相关文章

随机推荐

  • QT结构体中定义QString注意点

    当需要进行多进程通讯时 结构体中出现字符串时尽量采用C 标准类型 尽量少用QT特有类型QString字符串 尽量采用char 类型替代 这样在多进程通讯时 可直接通过memcpy直接复制内存的方式 而不用担心内存异常问题 由于QString
  • 动手搭建第一个小程序音视频Demo

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 小程序音视频产品经理 腾讯云提供了全套技术文档和源码来帮助您快速构建一个音视频小程序 但是再好的源码和文档也有学习成本 为了尽快的能调试起来 我们还提供了一个免费的一键部署服务 您
  • 华为OD机试 - 最长连续子序列(Java )

    题目描述 有N个正整数组成的一个序列 给定整数sum 求长度最长的连续子序列 使他们的和等于sum 返回此子序列的长度 如果没有满足要求的序列 返回 1 输入描述 第一行输入是 N个正整数组成的一个序列 第二行输入是 给定整数sum 输出描
  • 02 电阻容模型的创建

    打开状态栏 画电阻 电容的封装 实操要点 1 SCH Library一定要先选中 出现元件库的列表 2 放置完元件可以按ESC取消 3 Ctrl C V可以复制粘贴用 4 多余的线可以使用Delete删除 5 可以按鼠标右键轻微的拖动屏幕
  • ViLT:最简单的多模态Transformer

    原文链接 感谢原作者 ViLT 最简单的多模态Transformer 陀飞轮 复
  • 两台外网计算机远程桌面访问(内网穿透)

    背景 如图所示 项目中需要远程访问项目现场的外网计算机 通过外网计算机再访问到现场内网环境中的另外一台计算机 原计划通过市面上的远程桌面软件 如向日葵 ToDesk AnyDesk等 建立两台外网计算机的远程连接 在使用windows自带的
  • UmiJS介绍--mock(四)

    umi 里约定 mock 文件夹下的文件即 mock 文件 文件导出接口定义 支持基于 require 动态分析的实时刷新 支持 ES6 语法 以及友好的出错提示 1 引入 Mock js Mock js是常用的辅助生成模拟数据的第三方库
  • 编写过滤器jar包并植入到项目中

    公司有项目有个需求 就是希望可以写一个统一的权限管理 每次开发新项目的时候 可以通过添加依赖包进行权限的获取 验证 至于为什么不使用aop 拦截器二使用过滤器 是因为在java中 如果3者同事存在 最先执行的是过滤器 一 新建第三方过滤器j
  • QT 使用 qtasome图标 (python版)

    首先安装 qtawesome 库 然后到图标库找到需要的图标 图标名称为 fa xxx 图标库链接 http www fontawesome com cn faicons 在 retranslateUi 模块中 对相应 按钮 进行操作 运行
  • 6_机器翻译与Seq2Seq模型

    文章目录 一 Sequence to Sequence Model Seq2Seq 1 1 Machine Translation Data 机器翻译数据 1 2 Tokenization Build Dictionary 分词和建造字典
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • 0.面向对象的设计模式与原则

    面向对象的设计模式与原则 设计模式与面向对象 面向对象编程语言的三大机制 面向对象编程语言 OOPL 并非面向对象的全部 重新认识面向对象 从设计原则到设计模式 几条更具体的设计原则 1 单一职责原则 SRP 2 里式替换原则 LSP 3
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记16 The Dao

    这个是接着北京大学肖臻老师的课记的笔记 由于前面的笔记在 https blog csdn net Mu Xiaoye article details 104299664 已经有前人写好了 并且写的不错 所以这里直接给出链接 然后这个是剩下的
  • 通过主机名字获取与端口号获取对应的IP地址

    利用boost asio中的库函数获取本地主机的名字和通过主机名字获取与端口号获取对应的IP地址 源代码如下 Boost others network function cpp 此文件包含 main 函数 程序执行将在此处开始并结束 inc
  • C++ 默认析构函数

    1 与构造函数一样 假如我们不指定自己的析构函数 那么编译器将为我们创建一个默认析构函数 析构函数 Destructor 也是一种特殊的成员函数 没有返回值 不需要用户调用 而是在销毁对象时自动执行 与构造函数不同的是 析构函数的名字是在类
  • 自定义线程池—学习原理,设计思想,独立实现

    自定义线程池 0 概念与模型 主线程不断地生产任务 直接交付线程执行 当前线程池数量 lt 核心数 否则 加入阻塞任务队列 等到线程池中空闲的线程获取执行 否则 阻塞队列已满 开发接口 拒绝策略 等待 超时等待队列不满时加入队列 放弃任务
  • Docker带ce和不带ce的区别

    Docker带ce和不带ce的区别
  • 第十一届蓝桥杯 2020年国赛真题 (Java 大学A组)

    蓝桥杯 2020年国赛真题 Java 大学 A 组 A 合数个数 B 含 2 天数 归纳法 C 本质上升序列 动态规划 D 咫尺天涯 动态规划 E 玩具蛇 F 游园安排 最长单调子序列 G 画廊 动态规划 H 奇偶覆盖 扫描线 I 补给 J
  • VC++ 源码实现通达信公式管理器

    效果图 前段时间 因业务需要 写了这样一个软件 同样的页面已经是第2次写了 第1次大约5年前的事情了 因为代码遗失 于是重新写 页面看似复杂 实现起来非常简单 第一步 参照通达信的公式管理器核心文件TCalc dll 导出资源文件 TCal
  • 汇编语言中各种寄存器的总结

    汇编语言中各种寄存器的总结 1 通用寄存器 数据寄存器 AX BX CX DX 指针寄存器 SP BP 变址寄存器 SI DI 2 控制寄存器 IP FLAG 3 段寄存器 CS 代码段寄存器 基本概念解释 start作用 DS 数据段寄存