汇编语言基础:寄存器和寻址方式

2023-05-16

文章目录

  • 1. 寄存器
    • 1.1 通用寄存器
      • 1.1.1 数据寄存器
      • 1.1.2 指针寄存器(Pointer Register)
      • 1.1.3 索引(变址)寄存器
    • 1.2 段寄存器
    • 1.3 控制寄存器
  • 2. 寄存器寻址
    • 2.1 立即数
    • 2.2 寄存器寻址
    • 2.3 内存寻址
      • 2.3.1 直接寻址(指令中硬编码地址)
      • 2.3.2 间接寻址(地址指针)
      • 2.3.3 相对寻址(基址+偏移)
      • 2.3.4 变址寻址(基址+变址)
      • 2.3.5 相对变址寻址(基址+变址+偏移)


1. 寄存器

以16位8086构架为主说下寄存器的名称和用途,并在16位基础上说明一下32位、64位的寄存器。

寄存器分类

  • 通用寄存器
    • 数据寄存器(AX,BX,CX,DX)
    • 指针寄存器(SP,BP)
    • 索引寄存器(SI,DI)
  • 段寄存器(CS,DS,SS,ES)
  • 控制寄存器
    • 指令指针寄存器(IP)
    • 标志寄存器(FLAG)

16位的8086处理器共14个寄存器。32位和64位的x86,x64构架分别对寄存器进行了扩充。

1.1 通用寄存器

通用寄存器虽然分为了三类,但是实际上对于比较新的cpu这些寄存器功能都差不多,RISC等构架通用寄存器就是直接采用数字编号的,没有再细分功能。
当然习惯上还是把不同寄存器用于不同的用途,这也是ABI的一个重要部分。比如通常默认AX就是函数返回值,有的系统默认优先把SI,DI作为函数参数。

1.1.1 数据寄存器

AX、BX、CX、DX 一般用来存放数据,所以被称为数据寄存器。

  • AX(Accumulator Register) :累加寄存器,主要用于输入/输出和大规模的指令运算。常用于四则运算,函数返回值等。
  • BX(Base Register):基址寄存器,常用于在相对寻址(基址+偏移,见本文后续章节)中存储基址(基础访问地址)。也常用于四则运算。
  • CX(Count Register):计数寄存器,CX 寄存器在迭代的操作中会循环计数。
  • DX(Data Register):数据寄存器,也用于输入/输出操作。还与AX寄存器一起使用,用于涉及大数值的乘法和除法运算。

现代CPU的AX,BX,CX,DX几个寄存器在功能并无区别,最常见的用途是存储操作数,函数参数和运算结果等信息。
比如通常函数返回值默认都保存在AX中。

8位寄存器

AX,BX,CX,DX在8086中为16位寄存器,每个寄存器的高位和低位均可以作为8位寄存器访问。

  • AX寄存器可以分为两个独立的8位的AH和AL寄存器
  • BX寄存器可以分为两个独立的8位的BH和BL寄存器
  • CX寄存器可以分为两个独立的8位的CH和CL寄存器
  • DX寄存器可以分为两个独立的8位的DH和DL寄存器

寄存器名称通常不区分大小写,汇编语言中通常ax,bx,cx,dx和AX,BX,CX,DX相同。

x32构架

x32架构中,通用寄存器都在16位版本的基础上扩展成为32位版本,名字加了E作为前缀。

  • EAX(低位为AX):通用寄存器
  • EBX(低位为BX):通用寄存器
  • ECX(低位为CX):通用寄存器
  • EDX(低位为DX):通用寄存器

为了兼容16位模式程序,访问AX,BX,CX,DX相当于访问32位寄存器的低16位,32位寄存器的高16位不可单独访问。

x64构架

在x64架构中,通用寄存器都扩展成为64位版本,名字也进行了升级。

  • RAX, RBX, RCX, RDX
  • R8-R15:x64架构引入的8个新的通用寄存器

为了兼容32位模式程序,使用上面的名字仍然是可以访问的,相当于访问64位寄存器的低32位。高位32位模式不可访问。

1.1.2 指针寄存器(Pointer Register)

  • SP(Stack Pointer):栈指针,栈顶指针,只能访问栈顶。
  • BP(Base Pointer):基础指针,栈寄存器上的偏移量,用来定位栈上变量。用它可直接存取堆栈中的数据。

指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

  • x32构架下指针寄存器名称为ESP,EBP。是32位通用寄存器。低位可以用SP,BP访问。
  • x64构架下指针寄存器名称为RSP,RBP。是64位通用寄存器。低位可以用ESP,EBP访问。

1.1.3 索引(变址)寄存器

  • SI(Source Index):源索引寄存器。变址寄存器。常用于在变址寻址(基址+变址,见本文后续章节)中存储变址,也常用来拷贝源字符串。
  • DI(Destination Index):目的索引寄存器。目标变址寄存器。常用于在变址寻址(基址+变址,见本文后续章节)中存储变址。也常用来复制到目标字符串。

SI和DI功能和BX相同,可以用于间接寻址。主要用于存放存储单元在段内的偏移量。但是SI、DI不可分割成8位寄存器。

SI和DI两个经常搭配一起使用,执行字符串的复制等操作。有的系统默认优先把SI,DI作为函数参数。

  • x32构架下指针寄存器名称为ESI,EDI。低位地址分别对应SI和DI。
  • x64构架下指针寄存器名称为RSI,RDI。低位地址分别对应ESI和EDI。

1.2 段寄存器

在16为构架中,16位的指针只能访问64k的内存,为了访问更多的内存,使用段寄存器和指针配合访问内存地址。(x32,x64都采用段寄存器+指针地址方式访问内存)。

x86构架cpu,所有内存地址都是段地址+偏移方式引用。cpu内部根据段地址和偏移地址计算物理地址。
16位系统中物理地址=段地址*16+偏移地址 通常写作段寄存器:偏移

  • CS(Code Segment):代码段寄存器。CS:IP表示要执行代码的内存地址。
  • DS(Data Segment):数据段寄存器。DS:偏移量是数据的内存地址。
  • SS(Stack Segment):栈段寄存器。SS:SP是栈顶内存地址。
  • ES(Extra Segment):扩展段寄存器。扩展的数据段寄存器。

计算机启动后会自动找到地址CS:IP地址的指令代码运行,运行后IP自动偏移下一个指令。
数据地址默认段寄存器为DS。栈默认段寄存器为SS。

x32和x64构架段寄存器名称未变,但是扩展了两个寄存器。

  • FS(Extra Segment):数据段寄存器。扩展的数据段寄存器。
  • GS(Extra Segment):数据段寄存器。扩展的数据段寄存器。

1.3 控制寄存器

  • IP(Instruction Pointer):指令指针。是存放下次将要执行的指令在代码段的偏移量。即CS:IP执行下一条要执行的命令。

  • 32位CPU把指令指针扩展到32位,并记作EIP。EIP的低16位与IP作用相同。

  • 64位CPU把指令指针扩展到64位,并记作RIP。RIP的低16位与EIP作用相同。

在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。

2. 寄存器寻址

  • cpu执行的指令只有一种寻址方式,即CS:IP。(x32上地址为CS:EIP,x64上地址为CS:RIP
  • 数据也就是指令的操作数有七种寻址方式。
    • 立即寻址:立即数
    • 寄存器寻址:寄存器中的数
    • 内存寻址(根据段地址和给定地址找到数据)
      • 直接寻址:直接指定地址
      • 间接寻址:寄存器中指定地址
      • 相对寻址:寄存器中地址+偏移量
      • 变址寻址:寄存器中地址+变址寄存器中地址
      • 相对变址寻址:寄存器中地址+变址寄存器中地址+偏移量

2.1 立即数

常数实际上是直接放在代码中的,会在加载指令的时候,自动找到。

mov AX,80h   ; 80h就被称为立即数

2.2 寄存器寻址

数据存储在寄存器中,直接用寄存器名称调用。

mov AX,BX

寄存器寻址速度非常快。数据在寄存器中,所以不存在段地址。

2.3 内存寻址

2.3.1 直接寻址(指令中硬编码地址)

操作数存放在内存中,地址在指令中直接给出。

mov AX,[123H]

数据段的段寄存器默认为DS。

如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

mov BX,ES:[123H]

2.3.2 间接寻址(地址指针)

操作数在内存中,地址用SI、DI、BX和BP等寄存器之一来指定。

mov BX,[di]
mov AX,[si]

地址用SI、DI和BX等指定时,缺省的段寄存器为DS;
地址用BP来指定时,缺省的段寄存器为SS(即:堆栈段)。

2.3.3 相对寻址(基址+偏移)

操作数在内存中,地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和一个偏移量之和。

mov BX,[si+100H]

若地址用SI、DI、BX等加偏移量计算,缺省的段寄存器为DS;
若地址用BP加偏移量计算,缺省的段寄存器为SS。

2.3.4 变址寻址(基址+变址)

操作数在内存中,地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。

mov BX,[BX+SI]
  • 基址寄存器为BX,缺省的段寄存器为DS。
  • 基址寄存器为BP,缺省的段寄存器为SS。

2.3.5 相对变址寻址(基址+变址+偏移)

操作数在内存中,地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和一个偏移量之和。

mov AX,[BX+si+200H]   ;mov AX,200h[BX][si]或者mov AX,200h[si][BX]也是对的,多种写法
  • 基址寄存器为BX,缺省的段寄存器为DS。
  • 基址寄存器为BP,缺省的段寄存器为SS。


持续更新及修订中。

未经允许请勿转载。

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

汇编语言基础:寄存器和寻址方式 的相关文章

  • 网易云音乐NCM格式转化为mp3

    前段时间帮朋友下歌放在车上听 结果好多都是ncm格式 xff0c 伤心 xff0c 搜索了下发现基本上这格式解密有好多昂 xff0c 可惜UI我都不太想要 决定抄一下 xff0c 自己做一个 这里先记录下核心代码 xff0c 回头补充个UI
  • 旧电脑怎么升级到新版Win10

    Windows 10 2020年5月更新是最新版的win10系统 xff0c 相比以往的win10有了许多的改进 xff0c 比如说新的Cortana应用 云端重置以及Linux 2的Windows子系统等等 而Windows搜索的改进 x
  • K12教育小初高各个版本教材内的章节数据

    一个 相对 权威的资源网站 xff0c 然后把这个网站上的所有章节 教材全部爬下来 xff0c 进行保存数据库 xff0c 用于我们后续教学方面的基础数据 先说下结果 xff1a 算上小学 初中 高中三个学段 xff0c 所有学科下共计51
  • 1-FreeSwitch-CentOS7安装freeswitch1.10.2

    文章目录 一 前言二 安装2 1 安装 96 96 96 noarch 96 96 96 2 2 96 96 96 处理安装源 96 96 96 2 3 安装 96 96 96 cmake 96 96 96 2 4 安装 96 96 96
  • 「Python语法结构」输出语句示例(1)

    打印 玩具列表 字符串 功能要求 在屏幕上打印出 玩具列表 这样 实例代码 print 39 玩具列表 39 print 34 玩具列表 34 print 39 39 39 玩具列表 39 39 39 print 34 34 34 玩具列表
  • wsl导致vmmem占用高解决办法

    自从装了wsl我这个年迈的电脑就更加吃力 xff0c 尤其是内存基本上都要占到90 以上 xff0c 打开任务管理器一看内存一半以上都是被vmmem吃掉了 xff0c 于是在网上寻找解决办法 xff0c 并记录优化过程 文章目录 定期执行缓
  • wsl配置java环境以及使用vscode调试

    记录如何在wsl中配置java编译环境 xff0c 以及如何使用vscode进行编译调试 文章目录 下载jdk下载maven配置环境变量使用vscode调试java 下载jdk 点击进入到oracle jdk的下载页面 选择合适的安装包 解
  • python pip 打包指南

    一个成功的开源项目的其核心功能是打包功能 xff0c 而出色的打包功能的关键在于版本控制 因为项目是开源的 xff0c 所以您希望发布的包能够体现出开源社区所具备的优点 不同的平台与语言具有不同的打包机制 xff0c 本文主要讲述的是 Py
  • 虚拟机安装WIN系统后无法启动

    在虚拟机里安装完WINDOWS操作系统后 xff0c 无法启动 xff08 当然是GHOST版本 xff09 xff0c 启动时提示 xff1a Network boot from AMD Am79C970A Copright c 2003
  • VMware Esxi 8.0 直通Nvidia P40显卡

    目录 一 前言 二 错误信息 三 解决过程 一 前言 接到一个客户需求 xff0c 想在Esxi上直通Nvidia P40显卡 xff0c 直通后无法打开虚拟机 二 错误信息 下图是错误信息 xff0c 如图所示 xff0c 任务名称 打开
  • iOS 不规则瀑布流

    iOS 自从出了UICollectionview之后 界面的样式可谓更加的多元化 对于一些较为复杂的界面UICollectionview都可以相对轻松的实现 而且由于其 FlowLayout 子类的存在 界面的布局更可谓是随心所欲 下面就来
  • php7.4 docker 安装mongodb扩展

    Dockerfile 下面的pecl install mongodb的就是安装命令 FROM php 7 4 12 fpm RUN mv etc apt sources list etc apt sources list bak COPY
  • linux下wireshark安装和使用

    Wireshark是世界上最流行的网络分析工具 这个强大的工具可以捕捉网络中的数据 xff0c 并为用户提供关于网络和上层协议的各种信息 与很多其他网络工具一样 xff0c Wireshark也使用pcap network library来
  • HDU3700 Cat 恶心模拟题

    Problem Address xff1a http acm hdu edu cn showproblem php pid 61 3700 前言 终于又A了一道恶心的模拟题 看来HDU恶心题还是蛮多的 思路 扫描一遍 xff0c 如果有时间
  • Linux Docker最简单有效设置mysql 编码为utf8mb4解决乱码(三条命令解决)

    非常之简单高效 xff01 xff01 xff01 编辑my cnf span class token function vi span my cnf span class token comment 然后粘贴下面的并保存 span mys
  • 安利一款开源(3w star)的ssh、shell、cmd、sftp软件tabby(功能多、美观好用、支持插件)

    github地址 xff1a Tabby 官网 xff1a Tabby sh 用了之后非常之喜爱 xff0c 给作者点了个start xff0c 大家一起给这样的好开源软件点星星 自定义登录后脚本 对自己的配置可以设置快捷键快速打开一个该配
  • 远程控制ubuntu10.04

    由非linux平台连接到linux box有很多种方法 ubuntu本身就提供了XDMP VNC xff0c RDP等远程桌面登陆的方式 这些方式的实现比较简单 xff0c 没有使用多少数据压缩的技术 xff0c 因而远程时会感到比较慢 x
  • win10无线网卡共享网络给有线网卡再共享给其他电脑

    背景 xff1a 因项目主机为只有有线网卡的Linux系统 xff0c 需要联网安装一些程序 xff0c 需要win10的笔记本共享网络给项目主机 xff0c 但是调试环境下笔记本又只有连接手机热点的无线网络 xff0c 需要实现 笔记本无
  • 【解决错误】ModuleNotFoundError: No module named ‘PIL‘

    一 报错 Traceback span class token punctuation span most recent call last span class token punctuation span span class toke
  • 树莓派VNC配置教程

    VNC可以实现连接到树莓派后 xff0c 用电脑直接控制树莓派 xff0c 下面是VNC配置教程 xff1a 首先在电脑端上安装VNC xff08 官网下载地址 xff09 xff1a xff08 选择对应的版本 xff0c 下载安装即可

随机推荐

  • 用VSCode优雅的写MySQL

    一 SQL的部署 首先是部署MySQL xff0c 本地的MySQL在官网上下载包后 xff0c 按照默认的安装即可 xff0c 我使用的腾讯云的 云MySQL xff0c 可以到腾讯云官网租用 在租好数据库后 xff0c 进入控制台 xf
  • 机器学习笔记 五:逻辑回归(Logistics Regression)及两个分类案例

    目录 1 前言2 实现过程2 1 数据可视化过程2 2 Sigmoid函数2 3 代价函数 xff08 costFunction xff09 2 4 其他设置2 5 梯度下降函数2 5 1 梯度下降结果 xff08 初始参数为0 xff09
  • 器:ubnutu系统完美克隆至新硬盘,系统备份迁移至新硬盘(机器)

    一切皆为文件 xff0c 这个理念真酷 xff01 很好 xff01 ubuntu16 04 系统备份还原迁移至新机器 亲测可用 xff0c 刚刚克隆完毕 1 打包整个系统 xff1a sudo su cd tar czvpf sys ba
  • tools:nerd font debian(ubuntu maybe the same)

    i get garbled in my nerdtree try to fix this bug down load this by yourself bug nerdtree 显示图标乱码 CSDN博客 download font by
  • Ubuntu 设置环境变量问题总结

    一 动态链接库问题 最近一直被 error while loading shared libraies 错误困扰 xff0c 于是简单的总结了一下Ubuntu 环境变量的设置问题 从下面几个方面来说 xff1a 1 系统默认库 1 xff0
  • Python之配置日志的几种方式(logging模块)

    作为开发者 xff0c 我们可以通过以下3种方式来配置logging 1 xff09 使用Python代码显式的创建loggers handlers和formatters并分别调用它们的配置函数 xff1b 2 xff09 创建一个日志配置
  • 硬盘分区、挂载及Ubuntu系统安装

    Linux发行版按照打包方式划分主要包括Debian系 基于Dpkg Red Hat系 基于RPM Slackware系等 xff0c 其中Debian系 Red Hat系是我们所常见的 xff0c 前者包括Ubuntu Debian GN
  • Ubuntu安装cuDNN

    一 官网下载与自己CUDA版本匹配的安装包 cudnn xff08 版本号 xff09 tgz 二 安装cuDNN tar xzvf cudnn xff08 版本号 xff09 tgz cuda Tab sudo cp cuda inclu
  • MySQL配置SSL访问-WEB配置JDBC支持SSL

    WEB配置JDBC支持SSL Connector J 可以使用 SSL 加密 JDBC 驱动程序和服务器之间通信的所有数据 xff08 初始握手除外 xff09 启用连接加密会带来性能损失 xff0c 其严重程度取决于多种因素 xff0c
  • MySQL配置SSL访问-ETL配置JDBC支持SSL

    创建用户 SSL TLS 选项 除了基于用户名和凭据的常规身份验证之外 xff0c MySQL 还可以检查 X 509 证书属性 要为 MySQL 帐户指定 SSL TLS 相关选项 xff0c 请使用REQUIRE指定一个或多个tls o
  • Python 使用docx库操作word文档中的表格单元格内容

    1 导入库 from docx import Document 2 加载word文档对象 doc 61 Document path 3 定位表格 获取所有表格对象 tables 61 doc tables 获取word中第一个表格对象 ta
  • 人工智能导论(6)——机器学习(Machine Learning)

    文章目录 一 概述二 重点内容三 思维导图四 重点知识笔记1 概述1 1 基本概念1 2 机器学习的分类 2 常见有监督学习算法2 1 线性回归2 2 多项式回归2 3 支持向量机2 4 k 最近邻分类2 5 朴素贝叶斯2 6 决策树2 7
  • Ubuntu 22.04 Anaconda和jupyter notebook安装问题

    安装Anaconda的安装问题是 xff1a conda command not found 在terminal 输入 vim bashrc conda 初始化在最末端 xff0c 把带 都删除即可 前提是 xff0c 安装时候已经设置了路
  • 人工智能导论(10)——机器人(Robot)

    文章目录 一 概述二 重点内容三 思维导图四 重点知识笔记机器人分类工业机器人服务机器人一般机器人智能机器人机器人与人工智能 一 概述 机器人是靠自身动力和控制能力来实现各种功能的一种机器 本文将人工智能 34 机器人 34 基础知识整理为
  • Numpy系列(八):函数库之5傅里叶变换函数

    Numpy系列目录 文章目录 一 简介二 思维导图三 傅里叶变换基础知识1 傅里叶级数2 复数形式傅里叶级数3 傅里叶变换4 离散傅里叶变换 四 Numpy快速傅里叶变换1 标准FFT1 1 一维离散FFT1 2 一维离散FFT反变换1 3
  • Matplotlib系列(五):三维绘图

    Matplotlib系列目录 文章目录 一 简介二 思维导图三 Matplotlib三维图形1 绘制3d图形2 基本三维图像2 1 3d折线图2 2 3d散点图2 3 3d柱形图2 4 3d火柴图2 5 3d误差图 3 三维曲面3 1 3d
  • Seaborn系列(三):分布统计绘图(distribution)

    Seaborn系列目录 文章目录 1 分布统计绘图API概述2 displot单变量分布图 直方图 核密度 累积分布 2 1 displot函数绘制单变量分布图2 2 displot直方图kde图同时叠加绘制2 3 displot绘图同时叠
  • pytorch人工神经网络基础:线性回归神经网络(nn.Module+nn.Sequential+nn.Linear+nn.init+optim.SGD)

    线性回归是人工神经网络的基础 xff0c 线性回归属于有监督的学习 xff0c 即根据有标签 xff08 已知结果的数据 xff09 拟合线性方程权重 xff0c 然后根据拟合的方程预测未知数据 通常步骤为 xff1a 准备数据 xff1a
  • pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)

    softmax回归分类原理 对于回归问题 xff0c 可以用模型预测值与真实值比较 xff0c 用均方误差这样的损失函数表示误差 xff0c 迭代使误差最小训练模型 那么分类问题是否可以用线性回归模型预测呢 最简单的方法就是用softmax
  • 汇编语言基础:寄存器和寻址方式

    文章目录 1 寄存器1 1 通用寄存器1 1 1 数据寄存器1 1 2 指针寄存器 Pointer Register 1 1 3 索引 变址 寄存器 1 2 段寄存器1 3 控制寄存器 2 寄存器寻址2 1 立即数2 2 寄存器寻址2 3