寄存器详解

目录

前言:

通用寄存器

示例:

 通用寄存器的划分

 汇编指令

cpu物理地址的形成

地址加法器运算示例:

1. 相关部件提供段地址和偏移地址

 2. 段地址和偏移地址送入地址加法器

 3. 段地址*16

4. 求出物理地址

 5. 输出物理地址

段的概念

Debug的使用

1.用R命令查看,改变CPU寄存器的内容

2.用D命令查看内存中的内容

 3.用E命令改变内存中的内容

4.用U命令将内存中的机器指令翻译成汇编指令

5. 用A命令以汇编指令的格式在内存中写入机器指令

 6. 用T命令执行CS:IP处的机器指令

代码段寄存器CS与指令指针寄存器IP

修改CS与IP的指令


前言:

CPU由运算器,控制器,寄存器等器件构成,这些器件依靠内部总线相连;

在CPU中,运算器进行信息处理,寄存器进行信息存储,控制器控制各种器件进行工作,内部总线连接各种器件,在它们之间进行数据的传送

CPU中主要部件是寄存器,寄存器是CPU中可以用指令读写的部件,程序员可以各种寄存器中的内容实现对CPU的控制;

鉴于不同的CPU,寄存器的个数,结构是不同的,下述皆以8086CPU为例;

通用寄存器

1. 8086CPU中所有的寄存器都是16位,可以存放两个字节;

2. 用来存放一般性的数据,称之为通用寄存器,分别为AX BX CX DX;

示例:

数据: 18

二进制序列: 10010

寄存器AX中的存储情况:

 通用寄存器的划分

1. 由于8086CPU上一代是8位,为保证兼容性,所以将8086CPU中的AX BX CX DX这四个寄存器都可划分为两个独立使用的8位寄存器使用;

2. 通用寄存器AX的低8位(0位-7位)构成了AL寄存器,高8位(8位-15位)构成了AH寄存器;

    AH,AL寄存器是可以独立使用的8位寄存器

3. 同理,BX可分为BH与BL,CX可分为CH与CL,DX可分为DH与DL;

示例图:

 汇编指令

8086CPU一次性可以处理俩种数据

1. 字节:记为byte,1个字节由8个bit组成,可以储存在8位寄存器当中;

2. 字: 记为word , 1个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节;高位字节存储于通用寄存器中XH中,低位字节存储于通用寄存器XL中(X可取A B C D);

汇编指令举例
汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax,18将18送入寄存器AXAX=18
mov  ah ,78将78送入寄存器AHAH=78
add ax,8将寄存器AX中的数值加上8AX=AX+8
mov ax,bx将寄存器BX中的数据送入寄存器AXAX=BX
add ax,bx将AX和BX中的数值相加,结果存在于AX中AX=AX+BX

注:书写汇编指令或寄存器名称时不区分大小写;

示例:

AX中的值:0000H                 BX中的值:0000H
程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
 mov ax,4E20H4E20H0000H
add ax,1406H6226H0000H
mov bx,2000H6226H0000H
add ax,bx8226H2000H
mov bx,ax8226H8226H
add ax,bx044CH8226H

cpu物理地址的形成

CPU访问内存单元时,必须给出内存单元的地址;

所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称之为物理地址;

8086CPU具有如下结构特性:

1. 运算器一次最多可以处理16位数据;

2. 寄存器最大宽度是16位;

3. 寄存器和运算器之间的通路为16位

即在8086CPU内部,可以一次性处理,传输,暂时存储的信息最大长度是16位,也就是8086CPU只能送出16位的地址,表现出的寻址能力只有64KB,但是8086CPU有20根地址总线,可以传送20位地址,达到1MB的寻址能力,为了处理这种矛盾,8086CPU采用一种在内部用两个16位的地址合成一个20位的物理地址的方法

 8086CPU读写内存时:

  1. CPU的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址;
  2. 段地址和偏移地址通过内部总线送入地址加法器;
  3. 地址加法器将两个16位的地址合成一个20位的物理地址;
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
  5. 输入输出控制电路将20位物理地址送上地址总线;
  6. 20位物理地址被地址总线传送到内存。

地址加法器采用 段地址*16 + 偏移地址=物理地址 的方法合成物理地址;

地址加法器运算示例:

1. 相关部件提供段地址和偏移地址

 2. 段地址和偏移地址送入地址加法器

 3. 段地址*16

4. 求出物理地址

 5. 输出物理地址

 段地址*16+偏移地址=物理地址的本质含义是当CPU访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址

段的概念

内存是一个由若干存储单元组成的逻辑存储器,内存并没有分段,段的划分来自于CPU;

CPU用 段地址*16+偏移地址=物理地址 的方式给出内存单元的地址,使得我们可以用分段的方式管理内存;

示例:

 我们可以认为地址10000H-100FFH组成了一个段,该段的起始地址为10000H,段地址为1000H,大小为100H;

在编程时根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址,用偏移地址定位段的内存单元,注意以下两点

  • 段地址*16必然是16的倍数,所以一个段的起始地址为16的倍数;
  • 偏移地址为16位,即变化范围为0000H - FFFFH,寻址能力为64kb,所以一个段的长度最大为64KB

Debug的使用

debug是DOS Windows都提供的实模式程序的调试工具,使用debug,可以查看CPU各种寄存器的内容,内存的情况和在机器码级别跟踪程序的运行;

1.用R命令查看,改变CPU寄存器的内容

  • R — 查看寄存器的内容
  • R 寄存器名称 — 改变指定寄存器的内容

 

2.用D命令查看内存中的内容

  • D - 列出预设地址内存处的128个字节的内容
  • D 段地址:偏移地址-列出内存中指定地址处的内容
  • D 段地址:偏移地址 结尾偏移地址 - 列出内存中指定地址范围内的内容

 

 

 3.用E命令改变内存中的内容

  •  E段地址:偏移地址 数据1 数据2 ...
  •  E 段地址:偏移地址  (逐个询问式修改,空格-接受,继续   回车-结束)

 

4.用U命令将内存中的机器指令翻译成汇编指令

  • E 段地址:偏移地址 数据-以机器码的形式写入内存
  • D 段地址:偏移地址 - 查看机器码写入内存是否成功
  • U 段地址:  偏移地址 - 查看机器码所对应的汇编指令

5. 用A命令以汇编指令的格式在内存中写入机器指令

  • a 段地址:偏移地址 — 写入汇编指令
  • d 段地址:   偏移地址 — 查看汇编指令所对应的机器码
  • u 段地址:   偏移地址 — 查看代码

 6. 用T命令执行CS:IP处的机器指令

 

代码段寄存器CS与指令指针寄存器IP

任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从物理地址=M*16+N的内存单元读取一条指令并执行;

即任意时刻,CPU将CS:IP指向的内容当做指令执行;

CPU工作过程:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
  2. IP中的值自动增加,使得CPU可以读取下一条指令此时IP指向下一条指令
  3. 执行指令(回到步骤1,重复此过程)

修改CS与IP的指令

能够修改CS IP的指令统称为转移指令,简介可以修改CS IP 的jmp指令

  • 同时修改CS IP ;可以采用 jmp 段地址:偏移地址; 该指令的功能是用指令给出的段地址修改CS ,偏移地址修改IP;
  • 只修改IP的内容 ;jmp 某一合法寄存器 ;该指令的功能用寄存器中的值修改IP

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

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

相关文章

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具,下面总结下他的基本指令有哪些,顺便温习一下。 前言 一般项目中长存2个分支: 主分支(master) 和开发分支(develp) 项目存在三种短期分支 &#xff1a…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据,y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…

vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder

inputPlaceholder:请填写理由, 方法实现如下: this.$prompt(, 是否确认&#xff1f;, { confirmButtonText: 确定, cancelButtonText: 取消, inputPlaceholder:请填写理由, }).then(({ value }) > { if(value null || value ""){ Message({message: 请填…

Modbus tcp转ETHERCAT在Modbus软件中的配置方法

Modbus tcp和ETHERCAT是两种不同的协议&#xff0c;这给工业生产带来了很大的麻烦&#xff0c;因为这两种设备之间无法通讯。但是&#xff0c;捷米JM-ECT-TCP网关的出现&#xff0c;却为这个难题提供了解决方案。 JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&…

新概念英语的网盘资源

新版新概念英语1-4册全部视频和课本_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/18wyeA#l…

EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?

目录 1 EXCEL里如何显示序号&#xff1f; 2 如何重新排序&#xff1f; 3 怎么取得排序后的序号&#xff1f; 3.1 rank() 的序号可能不连续 3.2 方法2&#xff1a;SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号&#xff1f;如何重新排序…

Vue模版语法

目录 接下来学习click 例题&#xff1a;修改背景颜色 例题&#xff1a;反复点击button按钮&#xff0c;可以不断切换背景颜色 先看以下例题是回顾vue的用法 <body><div id"box">{{myname}} - {{myage}}</div><script>var vm new Vue({el…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功…

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…

二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…

获取淘宝商品详情数据的几种方法(商品标题、商品价格、商品销量、详情图片、商品主图

淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品信息和用户数据。对于电商从业人员和数据分析师来说&#xff0c;了解淘宝商品详情数据是非常重要的。本文将介绍几种获取淘宝商品详情数据的高效方法&#xff0c;并详细探讨每种方法的优缺点。 一、淘宝 API 淘宝开放…

Flink - souce算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 从Java的集合中读取数据 2. 从本地文件中读取数据 3. 从HDFS中读取数据 4. 从Socket中读取数据 5. 从Kafka中读取数据 6. 自定义Source 官方文档 - Flink1.13 1. 从Java的集合中读取数据 …

【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

每个人能力有限&#xff0c;水平高低不同&#xff0c;我们身在大环境里&#xff0c;虽然在同一个起跑线上&#xff0c;但是时间久了&#xff0c;你会发现&#xff0c;并越来越感觉到和身边其他人有了差距&#xff0c;慢慢的会有一定的落差感&#xff0c;怎么办呢&#xff01;通…

接口相似数据结构复用率高?Apipost这招搞定!

在API设计和开发过程中&#xff0c;存在许多瓶颈&#xff0c;其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作&#xff1a;在每个API中都编写相同的数据&#xff0c;这不仅浪费时间和精力&#xff0c;还容易出错并降低API的可维护性。 为了解决这个问题&a…

SAS-数据集SQL水平合并

一、SQL水平合并基本语法 sql的合并有两步&#xff0c;step1&#xff1a;进行笛卡尔乘积运算&#xff0c;第一个表的每一行合并第二个表的每一行&#xff0c;即表a有3行&#xff0c;表b有3行&#xff0c;则合并后3*39行。笛卡尔过程包含源数据的所有列&#xff0c;相同列名会合…

【LeetCode每日一题】——566.重塑矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 566.重塑矩阵 四【题目描述】 在 MATLAB 中&…

【QT学习】01:helloqt

helloqt OVERVIEW helloqt一、helloqt1.使用向导创建2.手动创建3.pro文件4.Qt应用程序框架 二、按钮创建main.cppmywidget.cpp 三、对象模型1.对象树引入2.存在的问题 一、helloqt 创建一个qt项目&#xff0c;可以使用creator的向导创建&#xff0c;也可自己手动创建&#xff…

时间复杂度为O(n2)的三种简单排序算法

1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置&#xff0c;重复n次&#xff0c;就完成了n个数据的排序工作。 /*** …

JavaEE初阶之网络初识

一、网络发展史 1.1独立模式 独立模式:计算机之间相互独立; 1.2网络互连 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。 数据共享本质是网络数据…