首页 > 编程语言 >汇编语言学习笔记(2)寄存器

汇编语言学习笔记(2)寄存器

时间:2024-10-31 11:45:12浏览次数:3  
标签:16 汇编语言 IP 笔记 地址 指令 寄存器 ax CPU

寄存器

在CPU中:

运算器进行信息处理;

寄存器进行信息存储;

控制器控制各种器件进行工作;

内部总线连接各种器件,在它们之间进行数据的传送,

本章以8086CPU为例讲解寄存器

2.1通用寄存器

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

寄存器的逻辑结构(以AX为例)

8086CPU的上一代CPU中的存器都是8位的,为了保证兼容,使原来基于上代CPU 编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用:

AX 可分为 AH 和 AL:

BX可分为 BH 和 BL;

CX 可分为CH 和CL;

DX 可分为 DH 和 DL

以AX为例:

16 位寄存器及所分成的两个8位寄存器的数据存储情况:

2.2字在寄存器中的存储

字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。

字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。

十六进制数据表示:由于一个存储单元可存放8位数据,CPU中的寄存器又可存放n个8位的数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20 就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL里是20。这种表示方法便于许多问题的直观分析。在以后的课程中,我们多用十六进制来表示一个数据。

2.3几条汇编指令

例1:

指令不区分大小写。执行上述指令后,数据变化如下:

AX数据为044CH。分析:程序段中的最后一条指令 add ax,bx,在执行前 ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH。

例2:

AX数据为0058H。分析:程序段中的最后一条指令 add al,93H,在执行前,al中的数据为C5H,相加后所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。此时al是作为一个独立的8位寄存器来使用的,和ah没有关系。

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

错误示例:

mov ax bl  (在8位寄存器和16位寄存器之间传送数据)

mov bh ax  (在16位寄存器和8位寄存器之间传送数据)

mov al 20000  (8位寄存器最大可存放值为255的数据)

add al 100H  (将一个高于8位的数据加到一个8位寄存器中)

检测点2.1

1.写出每条汇编指令执行后相关寄存器中的值

F4A3H  31A3H  3123H  6246H  826CH  6246H 

汇编指令

mov ax,62627

AX=F4A3H

mov ah,31H

AX=31A3H

mov al,23H

AX=3123H

add ax,ax

AX=6246H

mov bx,826CH

BX=826CH

mov cx,ax

CX=6246H

mov ax,bx

AX=826CH

add ax,bx

AX=04D8H

mov al,bh

AX=0482H

mov ah,bl

AX=6C82H

add ah,ah

AX=D882H

add al,6

AX=D888H

add al,al

AX=D810H

mov ax,cx

AX=6246H

2.只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

mov ax,2H
add ax,ax
add ax,ax
add ax,ax

2.4物理地址

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

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。

2.5 16 位结构的 CPU

结构特性:

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

寄存器的最大宽度为16位;

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

内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位 CPU,能一次性处理、传输、暂时存储 16 位的地址。

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

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

逻辑结构:

如上图所示,当8086CPU要读写内存时:

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

地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址。例如,8086CPU要访问地址为123C8H的内存单元,地址加法器的工作过程如图所示(图中数据皆为十六进制表示)。

“段地址x16”有一个更为常用的说法是左移4位。计算机中的所有信息都是以二进制的形式存储的,段地址当然也不例外。机器只能处理二进制信息,“左移4位”中的位,指的是二进制位。

观察上面移位次数和各种形式数据的关系,我们可以发现:

(1)一个数据的二进制形式左移1位,相当于该数据乘以2;

(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;

(3)地址加法器如何完成段地址x16的运算?就是将以二进制形式存放的段地址左移4位。

一个X进制的数据左移1位,相当于乘以X

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

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

 “基础地址+偏移地址=物理地址”

举例说明:

2.8 段的概念

用分段的方式来管理内存。地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

例:

图1地址10000H~100FFH的内存单元组成个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H;图2地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。

有两点需要注意:段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

小结

结论1:CPU可以用不同的段地址和偏移地址形成同一个物理地址。

比如 CPU 要访问 21F60H单元,则它给出的段地址 SA 和偏移地址 EA满足SAX16+EA=21F60H 即可。

结论2:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。

比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

结论3:存储单元的地址用两个元素来描述,即段地址和偏移地址。

比如“数据在 21F60H内存单元中。” 应表述为 ①数据存在内存2000:1F60单元中:②数据存在内存的2000H段中的1F60H单元中。

检测点2.2

1.给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为到00010H~1000FH

分析:物理地址=SA*16+EA

最小值: 0001H*16+0H=00010H

最大值: 0001H*16+FFFFH=1000FH

2.有一数据存放在内存 20000H单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为1001H,最大为2000H

分析:20000H=SA*16+EA

最大值: 20000H=SA*16+0H  ==> SA*16=20000H

最小值: 20000H=SA*16+FFFFH  ==> SA*16=10001H 结果与段地址的定义冲突,是无效地址,所以要往右找最近的符合定义的有效地址为10010H,倒推到段地址即为1001H。

3.反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻到 20000H单元?

SA>2000H或SA<1000H
分析:20000H=SA*16+EA

EA的取值范围是0H~FFFFH

当SA*16+0>20000H时, 得到SA>2000H

当SA*16+FFFFH<20000H时, 得到SA<1000H

2.9段寄存器

段地址在8086CPU的段寄存器中存放。4个段寄存器:CS、DS、SS、ES。

2.10 CS 和 IP

CS为代码段寄存器,IP为指令指针寄存器,设CS中的内容为M,IP中的内容为N,8086CPU将从内存 Mx16+N单元开始,读取一条指令并执行。CPU将CS:IP指向的内容当作指令执行。

工作原理:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP=IP+所读取指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤(1),重复这个过程。

工作过程:

初始状态:

(1)CS中的内容为2000H,IP中的内容为0000H;

(2)内存 20000H~20009H单元存放着可执行的机器码;

(3)内存20000H~20009H单元中存放的机器码对应的汇编指令如下。

地址:20000H~20002H,内容:B8 23 01,长度:3Byte,对应汇编指令:mov ax,0123H

地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H

地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令:mov ax,bx

地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令:add ax,bx

CS:2000H,IP:0000H,CPU将从内存2000Hx16+0000H处读取指令执行

CS、IP中的内容送入地址加法器(地址加法器完成:物理地址=段地址X16+偏移地址)

地址加法器将物理地址送入输入输出控制电路

输入输出控制电路将物理地址 20000H送上地址总线

从内存 20000H 单元开始存放的机器指令B8 23 01通过数据总线被送入CPU

输入输出控制电路将机器指令 B8 23 01送入指令缓冲器

IP 中的值自动增加。读取一条指令后,IP 中的值自动增加,以使 CPU可以读取下一条指令。因当前读入的指令 B8 23 01长度为3个字节,所以IP 中的值加 3。此时,CS:IP指向内存单元2000:0003。

执行控制器执行指令 B8 23 01(即 mov ax,0123H)

指令 B8 23 01 被执行后 AX 中的内容为 0123H

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

2.11 修改 CS、IP 的指令

若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”的指令完成,如

jmp 2AE3:3,执行后:CS=2AE3H,IP-0003H,CPU将从2AE33H处读取指令。

jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。

“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改 IP。

若想仅修改IP的内容,可用形如“jmp某一合法寄存器”的指令完成,如

jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H

指令执行后:ax=1000H,CS=2000H,IP=1000H

指令执行前:bx=0B16H,CS=2000H,IP=0003Hjmp bx,

指令执行后:bx=0B16H,CS=2000H,IP=0B16H

“jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。

例:写出指令执行序列

  1. mov ax,6622H
  2. jmp 1000:3
  3. mov ax,0000
  4. mov bx,ax
  5. jmp bx
  6. mov ax,0123H
  7. 转到第3步执行

分析:

  1. 当前 CS=2000H,IP-0000H,则CPU从内存2000HX16+0=20000H处读取指读入的指令是:B82266(mov ax,6622H),读入后IP=IP+3=0003H;
  2. 指令执行后,CS=2000H,IP=0003H,则CPU从内存2000HX16+0003H=20003H处读取指令,读入的指令是:EA03000010jmp1000:0003),读入后IP=IP+5=0008H:
  3. 指令执行后,CS=1000H,IP=0003H,则CPU从内存1000HX16+0003H=10003H处读取指令,读入的指令是:B80000(movax.0000),读入后IP=IP+3=0006H;
  4. 指令执行后,CS=1000H,IP=0006H,则CPU从内存1000Hx16+0006H=10006H 处读取指令,读入的指令是:8BD8(movbx,ax),读入后IP=IP+2=0008H;
  5. 指令执行后,CS=1000H,IP=0008H,则CPU从内存1000HX16+0008H=10008H处读取指令,读入的指令是:FFE3(jmpbx),读入后IP=IP+2=000AH;
  6. 指令执行后,CS=1000H,IP=0000H,CPU从内存10000H处读取指令

2.12 代码段

将长度为N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。

检测点2.3

下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?

mov ax,bx
sub ax,ax
jmp ax

4次。IP值为ax=0000H。

分析:读取指令后CPU立刻修改IP,jmp ax读取完成时IP已修改三次,执行jmp ax时将ax的值赋给了IP,所以一共修改了4次。

标签:16,汇编语言,IP,笔记,地址,指令,寄存器,ax,CPU
From: https://blog.csdn.net/2201_75602177/article/details/143390990

相关文章

  • YOLOv6-4.0部分代码阅读笔记-data_augment.py
    data_augment.pyyolov6\data\data_augment.py目录data_augment.py1.所需的库和模块2.defaugment_hsv(im,hgain=0.5,sgain=0.5,vgain=0.5): 3.defletterbox(im,new_shape=(640,640),color=(114,114,114),auto=True,scaleup=True,stride=32): 4.defmixup(......
  • 学习笔记(十五):ArkUi-切换按钮 (Toggle)
    概述:提供状态按钮样式、勾选框样式和开关样式,一般用于两种状态之间的切换一、创建单选框接口形式如下:type为类型,支持三种1、Switch  不包含子组件Toggle({type:ToggleType.Switch,isOn:true}) 2、Checkbox不包含子组件Toggle({type:ToggleType.Checkbox,isOn:true}......
  • 学习笔记(十四):ArkUi-单选框 (Radio)
    概述:单选框组件,通常用于提供相应的用户交互选择项,同一组的Radio中只有一个可以被选中。单选框组件不支持自定义样式一、创建单选框接口形式如下:value为单选框名称,group为单选框所在组的名称,同一个组内最多只有一个单选框为选中状态Radio(options:{value:string,group:......
  • Servlet -个人理解笔记
    Servlet的作用        Servlet主要是为了衔接web应用的前端和后端的,作为它们俩中间数据交换的桥梁,现在很多web项目都是前后端分离的,前端写前端的后端写后端的,但是他俩所用的编程语言是有区别的,怎么实现它们之间的数据交换呢?Servlet就是为了解决这个,它是用java编写的,目......
  • 《算法导论》Ch.4_学习笔记
    <分治策略>分治策略三步骤:分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。解决:递归地求解出子问题,如果子问题地规模足够小,则停止递归,直接求解。合并:将子问题地解组合成原问题地解。递归情况:子问题足够大,需要递归求解。基本情况:子问题足够小,不再需要递归......
  • STM32学习笔记-GPIO
    参考江科大32单片机学习相关知识GPIO基本构造APB2(AdvancedPeripheralBus2)是STM32微控制器架构中的一个外设总线,用于连接一些高性能外设,如定时器、USART、ADC和GPIO等。这些外设通常对性能要求较高,需要更快的数据传输速率。相较于APB1,总线频率更高,适合用于需要快速响应......
  • 读书笔记3
    13.估算1、通过学习估算,并将此技能发展到事物的数量级有直觉的程度,你就能展现出一种魔法般的能力,确定他们的可行性。2、多准确才足够准确?130个工作日和大概6个月,是不同的,显然,前者表示的精度更高。我们在做估算的时候也需要选好描述估算时间的单位值。3、估算结果怎么来呢。首......
  • 强连通分量学习笔记+杂题
    图论系列:前言:僕は明快さ故にアイロニー優柔不断なフォローミー後悔後悔夜の果て相关题单:戳我一.强连通分量相关定义基本摘自oiwiki,相关定义还是需要了解。(实际就是搬了个oiwiki)强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。1.强连通定义强连通:对......
  • 【SQL】Hive/Spark SQL笔记之时间函数、环比/同比/时间比较计算
    获取当天:'${zdt.format("yyyy-MM-dd")}'//获取上月月末select'${zdt.lastMonth().format("yyyy-MM-dd")}'T-1上月末select'${zdt.addDay(-1).lastMonth().format("yyyyMMdd")}'1个小时前select'${zdt.addHour(-1)......
  • 读书笔记2
    6.交流交流又有技巧,与客户的交流更是如此,书中介绍了几个需要注重的方面:1.知道自己要说什么首先要自己组织好语言。围绕心中所想的框架展开阐述2.了解听众想要什么交流时双方的事,是双方希望通过交流来达到共识,所以我们需要知道听众想要听到什么,比如,你可以用以下方法展开:你想......