《汇编语言》- 读书笔记 - 第2章-寄存器

news2024/12/24 11:35:22

《汇编语言》- 读书笔记 - 第2章-寄存器

  • 2.0 8086CPU 寄存器
    • 段地址:偏移地址
  • 2.1 通用寄存器
  • 2.2 字在寄存器中的存储
  • 2.3 几条汇编指令
    • 表2.1汇编指令举例
    • 表2.2 程序段中指令的执行情况之一
    • 问题 2.1
    • 表2.3 程序段中指令的执行情况之二
    • 问题 2.2
  • 2.4 物理地址
  • 2.5 16位结构的CPU
  • 2.6 8086CPU给出物理地址的方法
  • 2.7 “段地址X16+偏移地址=物理地址”的本质含义
  • 2.8 段的概念
  • 内存单元地址小结
  • 2.9 段寄存器
  • 2.10 CS和IP
  • 2.11 修改 CS、IP 的指令
  • 2.12 代码段
  • 2.9~2.12 小结

CPU由运算器控制器寄存器等构成,内部总线连接这些器件,外部总线连接主板上其他器件。
对于汇编程序员来说,寄存器最主要的部件,我们能做的就是通过改变寄存器中的内容控制CPU
不同CPU的寄存器个数和结构不同。8086CPU有14个寄存器,包括:
通用寄存器:AX、BX、CX、DX
段寄存器:CS、SS、DS、ES
偏移指针寄存器:SI、DI、SP、BP、IP
标志寄存器:PSW

2.0 8086CPU 寄存器

寄存器EN全称功能
通用寄存器
AXAccumulator Register累加器,用于算术运算和数据传输。可拆成高8位ah和低8位al分开使用。
BXBase Register基地址寄存器,用于存放内存地址。可拆成高8位bh和低8位bl分开使用。
CXCount Register计数器,用于循环计数或者数据传输。可拆成高8位ch和低8位cl分开使用。
DXData Register数据寄存器,也可以用于 I/O 操作。可拆成高8位dh和低8位dl分开使用。
段寄存器
DSData Segment Register数据段寄存器,存放程序的数据的基地址。
ESExtra Segment Register附加段寄存器,存放一些额外数据的基地址。
SSStack Segment Register堆栈段寄存器,存放堆栈的基地址。
CSCode Segment Register代码段寄存器,存放当前执行指令的代码段的基地址。
偏移指针寄存器
IPInstruction Pointer指令指针,寄存器。
SPStack Pointer栈指针,指向当前堆栈顶部。
BPBase Pointer基址指针,用于访问堆栈中的参数和局部变量
SISource Pointer源变址指针,用于源操作数的偏移地址
DIDestination Pointer目的变址指针,用于目的操作数的偏移地址
标志寄存器
PSWProgram Status Word程序状态寄存器,主要用于反映处理器的状态和ALU运算结果的某些特征及控制指令的执行。

段地址:偏移地址

段地址:偏移地址说明
CS:IP指向下一条指令的物理地址
SS:SP指向当前堆栈顶部的物理地址
DS:BX指向数据的物理地址
DS:SI指向数据的物理地址。例:复制中的源
DS:DI指向数据的物理地址。例:复制中的目标

2.1 通用寄存器

8086CPU 的所有寄存器都是 16 位的,可以存放两个字节。
AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。

  • 数据在寄存器中的存储情况

在这里插入图片描述

  • 四个通用寄存器都可以拆分为高低位,分开使用。

在这里插入图片描述

2.2 字在寄存器中的存储

8bit(位)组成一个Byte(字节)。2字节组成一个
所以一个字包含两个字节。共16位。

在这里插入图片描述
我们再看个例子:9527H这个字的数据可以当作整体来用,表示:
9527H = 10010101 00100111 =38183
也可以把高低位拆开分别使用,表示:
高位:95H = 10010101B = 149
低位:27H = 00100111B = 39

进制寄存器值高位低位
169527H9527
21001010100100111B1001010100100111
103818314939

补充:10进制数直接与高低位对应很难理解。需要转为216进制分出高低位再转成10进制。

2.3 几条汇编指令

  1. 汇编指令寄存器名时,不区分大小写。
  2. 下面的两个"问题"主要是介绍了寄存器执行加法后溢出的问题。

表2.1汇编指令举例

汇编指令控制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

表2.2 程序段中指令的执行情况之一

(原 AX 中的值:0000H,原 BX 中的值:0000H)

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov ax,4E20H4E20H0000H
add ax,1406H6226H0000H
mov bx,2000H6226H2000H
add ax,bx8226H2000H
mov bx,ax8226H8226H
add ax,bx?(参见问题2.1)8226H

问题 2.1

  • 指令执行后AX中的数据为多少?

8226H + 8226H = 1044CH
AX 只有16位(对应4个16进制数)
所以溢出了,最高位的1丢失。
最后AX中剩下的就只有044CH

表2.3 程序段中指令的执行情况之二

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov ax,001AH001AH0000H
mov bx,0026H001AH0026H
add al,bl0040H0026H
add ah,bl2640H0026H
add bh,al2640H4026H
mov ah,00040H4026H
add al,85H00C5H4026H
add al,93H?(参见问题2.2)4026H

问题 2.2

指令执行后AX中的数据为多少?

C5H + 93H = 158H
AL 只有8位(对应2个16进制数)
所以溢出了,最高位的1丢失。
最后AL中剩下的就只有58H
注意:add al,93H进行的是 8 位运算。单独使用AL时,它作为一个独立的8位寄存器,和AH无关。并不会把溢出的1放到 AH中去。

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:

  • 正确
mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add ax,20000
  • 错误
mov ax,bl		 ; 在8位存器和16位存器之间传送数据
mov bh,ax		 ; 在16位寄存器和8位存器之间传送数据
mov al,20000	 ; 8位存器最大可存放值为255的数据
add al,100H		 ; 将一个高于8位的数据加到一个8位存器中

2.4 物理地址

CPU 访问内存单元时,需要使用物理地址。
所有的内存单元构成一个线性空间,每个内存单元在其中有唯一的地址,这就是所谓的物理地址
不同的 CPU 可以采用不同的方式来形成物理地址。对于 8086CPU,在发送物理地址到地址总线之前,它需要先在内部生成物理地址。

2.5 16位结构的CPU

  • 运算器一次最多可以处理 16 位的数据;
  • 寄存器的最大宽度为 16位;
  • 寄存器和运算器之间的通路为 16 位。

8086CPU是16位结构,一次性能够处理传输暂存信息长度最大为16位。(内存单元的地址也是信息)

2.6 8086CPU给出物理地址的方法

8086CPU有20地址总线,达到1MB寻址能力。
也就是说地址总线一次能收发20辆车。
但CPU一单只能打包16车货。
如果CPU来一单,就发车。那地址总线上就要跑4辆空车。
为了不浪费。
CPU决定一次发两单,每单都少装点货,拼到一起刚好20车,至于谁多谁少,程序员可以根据自己调配。
一单是段地址,一单是偏移地址。
CPU中有一个地址加法器,它用来计算最终的物理地址:
物理地址 = 段地址x 16 + 偏移地址
在这里插入图片描述

  • 如图 2.6所示,当8086CPU 要读写内存时:
  1. CPU中的相关部件提供两个16 位的地址,一个称为段地址,另一个称为偏移地址;
  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  3. 地址加法器将两个 16 位地址合成为一个 20 位的物理地址;
  4. 地址加法器通过内部总线将 20 位物理地址送入输入输出控制电路;
  5. 输入输出控制电路将 20 位物理地址送上地址总线;
  6. 20 位物理地址被地址总线传送到存储器。

在这里插入图片描述
在这里插入图片描述

2.7 “段地址X16+偏移地址=物理地址”的本质含义

段地址x16+偏移地址=物理地址的本质含义是:CPU 在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,得出内存单元的物理地址。
基础地址+偏移地址=物理地址这种寻址模式的一种实现方案。
例1:
在这里插入图片描述
这里如果应用 基础地址+偏移地址=物理地址的寻址模式。2000可视作基址,826可视作偏移地址。

例2:
在这里插入图片描述

2.8 段的概念

内存中没有的概念。是8086CPU使用 基础地址+偏移地址=物理地址方式寻址,来分段管理内存。
在这里插入图片描述

  1. 段地址是x16得来的。段起始地址一定是16的倍数。
  2. 偏移地址有16位,范围0000h~FFFFh。所以一个段最大为64KB
  3. 可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

内存单元地址小结

  1. CPU可以用不同的段地址偏移地址组成同一个物理地址,也就是说同一个物理地址可以有很多种组合方式获得。
  2. 数据在21F60H内存单元中。对于8086PC机一般表达为:
    2.1. 数据存在内存2000:1F60单元中;
    2.2. 数据存在内存的2000H段中的1F60H单元中。

2.9 段寄存器

8086CPU 有4 个段存器:CS、DS、SS、ES。用来存放内存单元的段地址。
见:8086CPU 寄存器

2.10 CS和IP

CS:代码段寄存器。存放当前执行指令的代码段的基地址。
IP:指令指针寄存器。保存着将要执行的指令在段中的偏移量。
CS:IP:指向接下来要执行的指令的物理地址。

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,P=0000H,
即在 8086PC 机刚启动时,CPU 从内存 FFFFOH 单元中读取指令执行,
FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。

8086机中,任意时刻,CPU将 CS:IP 指向的内容当作指令执行。.
执行过的一段信息对应的内存单元必然被 CS:IP 指向过。

图 2.10 展示了 8086CPU 读取、执行指的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为十六进制)。
在这里插入图片描述
图2.10说明如下。

  1. 8086CPU当前状态:CS 中的内容为 2000HIP 中的内容为 0000H;
  2. 内存20000H~20009H单元存放着可执行的机器码;
  3. 内存20000H~20009H单元中存放的机器码对应的汇编指令如下。
地址内容长度对应汇编指令
20000H~20002HB8 23 013Bytemov ax,0123H
20003H~20005HBB 03 003Bytemov bx, 0003H
20006H~20007H89 D82Bytemov ax,bx
20008H~20009H01 D82Byteadd ax,bx

下面的一组图(图2.11~图 2.19),以图 2.10 描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对 8086CPU 的描述,是在逻辑结构、宏观过程的层面上进行的,目的是使读者对 CPU 工作原理有一个清晰、直观的认识,为汇编语言的学习打下基础。其中隐蔽了 CPU 的物理结构以及具体的工作细节)。

在这里插入图片描述

总结 8086CPU的工作过程可以简要描述如下:

  • 首先:
    CSIP 送入地址加法器,得到CS:IP
    例:CS = 2000h, IP = 0000h
CS:IP =     CS * 16 + IP
CS:IP =  2000h * 16 + 0000h  ;16进制数 *16 等于左移1位。(进位了嘛)
CS:IP = 20000h      + 0000h
CS:IP = 20000h
  • 然后
    1、 从 CS:IP 指向的内存单元读取指令,读取的指令进入指令缓冲器;
    2、 IP=IP+本条指令的长度,从而指向下一条指令;
    3、 执行指令。转到步骤(1),重复这个过程:
  1. 20003H~20005H 获取 mov bx, 0003H 执行, IP=IP+3
  2. 20006H~20007H 获取 mov ax,bx 执行, IP=IP+2
  3. 20008H~20009H 获取 add ax,bx 执行, IP=IP+2

2.11 修改 CS、IP 的指令

在 CPU 中,程序员能够用指令读写的部件只有寄存器,通过改变寄存器中的内容实现对 CPU 的控制。程序员改变CS、IP 就实现了控制 CPU执行目标指令。

mov 不能修改 CSIP 它有专用的指令如:jmp

指令说明
jmp 2AE3:3用给定的地址修改CSIP
执行后:CS=2AE3HIP=0003H
jmp ax用寄存器ax中的值修改IP
执行前:ax=1000HCS=2000HIP=0003H
执行后:ax=1000HCS=2000HIP=1000H

CPU将从修改后的地址读取指令。

2.12 代码段

在2.8 段的概念中我们知道了什么是段。
那么这段内存中如果存放的是指令,我们认为代是个代码段。
但它本质还只是内存中的一堆01,当CS:IP指向它,CPU就会把它当指令来执行。
例:

mov ax, 0000	(B8 00 00)
add ax, 0123H	(05 23 01)
mov bx, ax		(8B D8)
jmp bx			(FF E3)

这段长度为 10个字节的指令,存放在 123B0H~123B9H 的一组内存单元中。
假如(使用 jmp)将CS:IP设置为123B:0000 (指向了代码段中的第一条指令的首地址)。CPU就会执行它了。

2.9~2.12 小结

  1. 段地址在8086CPU的段寄存器中存放。当8086PU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址
  2. CS存放指令的段地址,IP存放指的偏移地址。8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
  3. 8086CPU的工作过程:
    1. CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
    2. IP指向下一条指令;
    3. 执行指令。(转到步骤1,重复这个过程。)
  4. 8086CPU提供转移指令修改CS、IP的内容。

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

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

相关文章

数据埋点1

文章目录 1 什么是数据埋点2 为什么需要数据埋点3 数据埋点能采集哪些用户数据4 数据埋点的分类及方式5 主流的数据上报技术5.1 客户端上报5.2 服务端获取 1 什么是数据埋点 互联网的海量数据是通过数据埋点技术采集用户行为数据而产生的,用户行为数据采集及上报流…

我又不当程序员还要学Python吗?人工智能AI的出现我知道,我错了

Python(可读音:派森) 时代要淘汰你,连招呼都不会打! 这句话近些年我们常在媒体上听到,有点残酷,但却又很现实。 最近,人工智能AI技术火爆全网,而且它所表现出来的“超…

浅谈Spring中的BeanFactory与FactoryBean

前言 理解FactoryBean是非常非常有必要的,因为在Spring中FactoryBean最为典型的一个应用就是用来创建AOP的代理对象,不仅如此,而且对理解Mybatis核心源码也非常有帮助!如果甘愿crud,做个快乐的码农,那我就哦…

Springcloud--docker快速入门

认识docker docker相关操作 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…

『Linux』第九讲:Linux多线程详解(三)_ 线程互斥 | 线程同步

「前言」文章是关于Linux多线程方面的知识,上一篇是 Linux多线程详解(二),今天这篇是 Linux多线程详解(三),内容大致是线程互斥与线程同步,讲解下面开始! 「归属专栏」Li…

剑指 Offer 54. 二叉搜索树的第k大节点【37】

难度等级:容易 上一篇算法: 226. 翻转二叉树【58】 力扣此题地址: 剑指 Offer 54. 二叉搜索树的第k大节点 - 力扣(Leetcode) 1.题目:剑指 Offer 54. 二叉搜索树的第k大节点 给定一棵二叉搜索树&#xff0c…

springboot第15集:MyBatis分页

我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 是的,输出 SQL 可以帮助我们更好地理解代码的执行流程和结果。在控制台输出 SQL 可以让我们看到实际执行的 SQL 语句,这样就能够更…

武忠祥老师每日一题||定积分基础训练(一)

若积分区间相同,最常用的思想: 若 f ( x ) > g ( x ) , 则 ∫ a b f ( x ) > ∫ a b g ( x ) 若f(x)>g(x),则\int_{a}^{b}f(x)>\int_{a}^{b}g(x) 若f(x)>g(x),则∫ab​f(x)>∫ab​g(x) 但 是 往 往 等 号 只 是 在 有 限 个 点 成…

Java实现添加文字水印、图片水印功能

Java实现添加水印功能 添加水印Java 2D API介绍绘制文字水印绘制图片水印循环添加文字水印 添加水印 为图片添加水印的主要作用是保护图片版权,防止图片被未经授权的人使用或传播。为图片添加水印是一种常用的图片处理技术。在Java 中可以使用JDK自带的 Graphics2D …

快速上手Django(九) -Django下载文件、Django上传文件、Django实现excel导入导出

文章目录 快速上手Django(九) -django 上传文件request.FILES,下载文件一、Django下载文件1. Django下载文件方案和思路2. HttpResponse、StreamingHttpResponse和FileResponse区别和选择StreamingHttpResponse和FileResponse对象的对比和选择使用HttpResponse使用S…

浏览器安全之XSS跨站脚本

基本概念 跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。 攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javas…

采用.Net Core技术框架开发的B/S版区域检验管理系统(云LIS)

实验室信息管理系统云LIS源码 SaaS模式运维管理系统 云LIS系统源码是一款全面的实验室信息管理系统源码,其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统,支持远程运维&…

AtCoder Beginner Contest 300——A-G题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提! Hello, 大家好哇!本初中生蒟蒻讲解一下AtCoder Beginner Contest 300这场比赛的A-G题! A - N-choice question 原题 Problem Statement Given integers A A A and…

数据埋点2

文章目录 1 数据埋点流程2 六个步骤实现数据埋点设计2.1 确认事件与变量2.2 明确事件的触发时机2.3 明确事件的上报机制2.4 设计数据表结构2.5 统一字段命名规范2.6 明确优先级 3 以电商购物成交转化为例实现数据埋点设计 作为数据分析师的你,是否和我一样经常会被业…

基于改进的离散PSO算法的FJSP的研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

排位赛结果“测谎”

甲乙丙丁说的关于排位赛结果只正确一半,根据甲乙丙丁说的信息求出正确的排位赛结果顺序。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那…

chatGPT免费入口-ChatGPT国内中文版网站

chatgpt怎么使用 如果您有Chat GPT的API Key并想要使用Chat GPT进行自然语言处理或生成处理,您可以按照以下步骤操作: 安装必要的软件和工具 在使用Chat GPT之前,您需要先安装一些必要的软件和工具,例如Python解释器、HTTP客户…

【Android车载系列】第11章 系统服务-SystemServer自定义服务

1 编写自定义系统服务 1.1 AIDL接口定义 系统源码目录/frameworks/base/core/java/android/app/下新建AIDL接口IYvanManager.aidl package android.app;/** * 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl */ interface IYvanManager{String …

YOLOV5入门讲解+常用数据集

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

TIM-输出比较(PWM)——STM32

TIM-输出比较——STM32 Oc (Output Compare) 输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道…