-
2020-01-09 16:06:04
寄存器地址和寄存器位之间的关系?
答:8位为一个字节,题中32位即4个字节,10个寄存器为40个地址。
更多相关内容 -
CPU和寄存器详解
2022-01-21 18:59:041.CPU 编译器是一个将用用程序语言写的程序翻译成特殊结构...时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一目录
1.CPU
-
编译器是一个程序,它可以将我们所写的程序翻译成特殊的机器语言结构。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。
-
电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率,即每秒15亿次的时钟脉冲。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一个指令需要跳动的次数(或就像他们经常说的执行周期)依赖CPU的产生和模仿。周期的次数取决于它之前的指令和其他因素。
2.程序内存需要分段(以8086CPU为例)
- 内存按访问的方式来看,就像长方形的带子,地址依次升高。内存是一个随机读写设备,即可以访问内部任何一处,不需要从头开始找,只要直接给出实际物理地址即可。
- 而分段是内存访问的机制,是给CPU用的访问内存的方式,只有CPU才会关注段
- 8086CPU有20根地址线,最大可寻址内存空间为1MB,2^20Byte。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为若干个段,每段不超过64KB,在8086中设置4个16位的段寄存器,用于管理4
种
段,注意这里是种
,不是个
(内存是分成四种段,这是考虑到程序执行时需要的四个部分。但是,内存不止四个段,只是同时最多只有四个段在工作,其他的在“睡眠”,需要时再“唤醒”。),具体种类为:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。 - 内存分段后,内存的地址(又称物理地址)就由两部分组成:段地址和段内偏移地址,段寄存器管理的是段地址。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
- 上述便是段地址×16(或者左移四位)+偏移地址=物理地址”的寻址模式的由来。
- 8086CPU有20根地址线,最大可寻址内存空间为1MB,2^20Byte。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为若干个段,每段不超过64KB,在8086中设置4个16位的段寄存器,用于管理4
- 第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。
3.CPU的不同型号
-
8088,8086:
这些CPU从编程的观点来看是完全相同的。它们是用在早期PC机上的CPU。它们提供一些16位的寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS。它们仅仅支持1M字节的内存,而且只能工作在实模式下。在这种模式下,一个程序可以访问任何内存地址,甚至其它程序的内存!这会使排除故障和保证安全变得非常困难!而且,程序的内存需要分成段。每段不能大
于64K,即2^16Byte(16位的寄存器)。 -
80286:
这种CPU使用在AT系列的PC机中。它在8088/86的基本机器语言中加入了一些新的指令。然而,它主要的新的特征是16位保护模式。在这种模式下,它可以访问16M字节的内存和通过阻止访问其它程序的内存来保护程序。可是,程序依然是分成不能大于64K的段,即2^16Byte(16位的寄存器)。 -
80386:
这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一个新的32位保护模式。在这种模式下,它可以访问4G字节。程序同样分成段,但是现在每段大小同样可以到4G,即2^32Byte(32位的寄存器) -
还有很多CPU型号这里不在列出,毕竟我们不做CPU的芯片开发,我们学习结构较为简单的CPU,了解其原理即可。
4.十六位寄存器(以8086为例,即x86架构)
寄存器是CPU内部的存储部件与内存空间没有关系,设置寄存器的原因是为了减少CPU与内存交换数据的次数,以提高计算机的工作速度。
8086 CPU 中寄存器总共为 14 个,即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,且都为16位。4.1通用寄存器:
通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI 。
4.1.1数据寄存器:
AX,BX,CX,DX 称作为数据寄存器,都可以暂存一般的数据,他们还具有其他的特殊用途,具体的特殊用途如下:
-
AX (Accumulator)
:累加寄存器,也称之为累加器,除了做加法以外,还可以做乘法或除法,当操作的数是16位的时候经常与DX搭配使用,如下:-
做除法(DIV)运算时:
除数可以存放在寄存器中或者是内存单元中
,被除数默认放在AX或(DX和AX)中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,那么被除数就为32位,存放在DX和AX两个寄存器中,高16位存放在DX,低16位存放在AX。
即除数可以是 8 位或者是 16 位的:- 当除数是 8 位时,被除数一定会是 16 位的,并且默认是放在 AX 寄存器中,如果除数是 8 位的,则在 AL 中会保存此次除法操作的商,而在 AH 中则会保存此次除法操作的余数,
- 而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。
-
做乘法(MUL)运算时:
两个相乘的数要么都是 8 位,要么都是 16 位:- 如果两个相乘的数都是 8 位的话,则一个默认是放在 AL 中,而另一个 8 位的乘数则位于其他的寄存器或者说是内存字节单元中,当 MUL 指令执行完毕后,如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中,
- 而如果两个相乘的数都是 16 位的话,则一个默认存放在 AX 中,另一个 16 位的则是位于 16 的寄存器中或者是某个内存字单元中。
同时,而如果是 16 位的乘法运算的话,则默认乘法运算的结果有 32 位,其中,高位默认保存在 DX 中,而低位则默认保存在 AX 中。
-
-
BX (Base)
:基地址寄存器;
BX 主要还是用于其专属功能 :存储偏移地址(与段寄存器搭配,可以寻址物理地址)。
如果未额外指明寄存器,会默认使用 DS 段寄存器,例如 [BX],相当于DS:[BP]
段地址×16(或者左移四位)+偏移地址=物理地址 -
CX (Count)
:计数器寄存器;
CX 中的 C 被翻译为 Counting 也就是计数器的功能,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:- 一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;
- 还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。
-
DX (Data)
:数据寄存器;
在做除法(DIV)或者乘法(MUL)运算的时候可以搭配AX使用,请参考上面关于AX详细用法的讲解。
4.1.2指针寄存器:
SP (Stack Pointer)
:堆栈指针寄存器;
段地址使用默认的 SS 寄存器中的值
在任何时刻,SS:SP 都是指向栈顶元素BP (Base Pointer)
:基指针寄存器;
段地址使用默认的 SS 寄存器中的值
bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址。
sp会随着带有堆栈操作的指令(比如PUSH、CALL、INT、RETF)产生变化,而BP不会,所以在带参数的子过程中用BP来获取参数和访问设在堆栈里面的临时变量。
每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。如下
在函数进入时:
push bp // 保存bp指针 mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。 // 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。 ..... ..... 函数结束时: mov sp,bp // 将原sp指针传回给sp pop bp // 恢复原bp的值。 ret // 退出子函数
只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。
他们也是通用寄存器,在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。4.1.3变址寄存器
SI (Source Index)
:源变址寄存器;
SI会默认使用 DS 段寄存器DI (Destination Index)
:目的变址寄存器;
DI 会默认使用 DS 段寄存器
两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,但是在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。
4.2段寄存器:
- CS (Code Segment):代码段寄存器;
- DS (Data Segment):数据段寄存器;
- SS (Stack Segment):堆栈段寄存器;
- ES (Extra Segment):附加段寄存器;
16位CS,DS,SS 和ES 寄存器是段寄存器。它们指出程序不同部分所使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在后面的文章中。
4.3控制寄存器
- IP (Instruction Pointer):指令指针寄存器;
指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。 - FLAG:标志寄存器;
FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之为0。并不是所有指令都修改FLAGS里的位。
5. 三十二位寄存器(80386 )
- 80386及以后的处理器扩展了寄存器。例如:16位AX寄存器扩展成了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,ESI 和EDI 。
- 许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用寄存器,在32位保护模式下只有这此寄存器的扩展形式被使用。
-
-
汇编学习笔记1 通用寄存器和段寄存器详解
2019-03-08 15:49:30一、通用寄存器 寄存器 编号(二进制) 编号(十进制) 64位 32位 16位 8位 累加寄存器 RAX EAX AX AL 000 0 计数寄存器 RCX ECX CX ...一、通用寄存器
寄存器 编号(二进制) 编号(十进制) 64位 32位 16位 8位 累加寄存器 RAX EAX AX AL 000 0 计数寄存器 RCX ECX CX CL 001 1 数据寄存器 RDX EDX DX DL 010 2 基址寄存器 RBX EBX BX BL 011 3 堆栈顶指针 RSP ESP SP AH 100 4 堆栈基指针 RBP EBP BP CH 101 5 变址寄存器 RSI ESI SI DH 110 6 指令寄存器 RDI EDI DI BH 111 7
数据寄存器 EAX, EBX, ECX, EDX (Data Register)数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器:- AX可分为AH和AL.
- BX可分为BH和BL.
- CX可分为CH和CL.
- DX可分为DH和DL.
每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器AX通常称为累加器(Accumulator Register),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
寄存器BX称为基址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
指针寄存器 EBP, ESP (Pointer Register)
32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。指针寄存器主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
寄存器BP称为基址指针寄存器(Base Pointer);
寄存器SP称为堆栈指针寄存器(Stack Pointer)。
变址寄存器 ESI, EDI (Index Register)
32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。变址寄存器主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
寄存器SI称为源变址寄存器 (Source Index);寄存器DI称为目的变址寄存器(Destination Index)。
二、段寄存器
段寄存器是因为对内存的分段管理而设置的。(存储单元的内容采用“高高低低”的原则来存放数据)
段寄存器 说明 指令指针寄存器(Instruction Pointer) IP 用来存储将要执行的下一条指令的偏移量 代码段寄存器(Code Segment) CS 一般用于存放代码;
通常和IP 使用用于处理下一条执行的代码
数据段寄存器(Data Segment) DS 般用于存放数据;
ds地址对应的数据 相当于c语言中的全局变量
堆栈段寄存器(Stack Segment) SS 一般作为栈使用 和sp搭档;
ss地址对应的数据 相当于c语言中的局部变量
ss相当于堆栈段的首地址 sp相当于堆栈段的偏移地址附加段寄存器(Extra Segment) ES 扩展段寄存器 FS 扩展段寄存器 (FS、GS 是从 32位CPU 80386 开始增加的,没有全称) GS 扩展段寄存器 标志寄存器(Flags) Flags 表现微处理器当前状态和某些控制 16位CPU 段寄存器
16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。
段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器。
32位CPU 段寄存器
32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:
(1)、在实方式下,段寄存器的值就是段地址;
(2)、在保护方式下,段寄存器的值不是段地址,是段地址的“选择器”。它间接指出一个32位的段地址。代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。
在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。但在不同的方式下其堆栈指针有所不同:
(1)、在实方式下,32位微机把ESP的低16位SP作为指向堆栈的指针,所以,我们可以认为栈顶单元是由SS和SP来指定的。这就与16位微机访问栈顶单元的方法相一致;
(2)、在保护方式下,堆栈指针可用32位的ESP和16位的SP。数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。
另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。
一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。
段寄存器及其指针寄存器的引用关系
访问存储器方式 缺省的段寄存器 可选用的段寄存器 偏移量 取指令 CS IP 堆栈操作 SS SP 一般取操作数 DS CS、ES、SS 有效地址 串操作 源操作数
DS CS、ES、SS SI 目标操作数
ES DI 使用指针寄存器BP
SS CS、DS、ES 有效地址 由上表可以看出16位CPU在段寄存器的引用方面有如下规定:
1、取指令所用的段寄存器和偏移量一定是用CS和IP;
2、堆栈操作所用的段寄存器和偏移量一定是SS和SP;
3、串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
4、其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。 -
寄存器
2020-02-23 21:24:19四种寄存器容量都为两个字节,是十六位寄存器,表示范围0-65535,216 上述四种寄存器都可以分割成对应的2个8位寄存器, AX = AH + AL,高八位成为AH寄存器,H是high的意思,低八位是AL寄存器,L是low的意思 BX = BH...通用寄存器
- AX,BX,CX,DX,是四种通用寄存器,用于保存数据,是数据寄存器
- 四种寄存器容量都为两个字节,是十六位寄存器,表示范围0-65535,216
- 上述四种寄存器都可以分割成对应的2个8位寄存器,
- AX = AH + AL,高八位成为AH寄存器,H是high的意思,低八位是AL寄存器,L是low的意思
- BX = BH + BL
- CX = CH + CL
- DX = DH + DL
上述的八位寄存器,表示范围0-255
- 将16位寄存器分为两种寄存器:
- 为了兼容性,低位寄存器是为了保证原先的八位的就程序也能够读取,原先的CPU仅仅有八位寄存器去书写程序
- 8X86CPU一共有16条数据线,一次可以处理8位数据和16位数据,两种数据
- 8位数据,字节型数据 byte = 8 bits;16位数据,字型数据,2 byte = 16bits,一个字型数据有两个字节型数据构成,分别是高位字节和低位字节,高位字节存在AH,BH,CH,DH,低位字节存放在AL,BL,CL,DL
寄存位实验
寄存器实验1,移动数据
- 在用寄存器移动数据时,数据的位数要和寄存器的容量相适应,AX寄存器是16位寄存器,对应的应该是四个16位进制的数字,不能够将AL八位寄存器的数据转移到十六位寄存器中去,同样的,也不可以将AX16位寄存器中的数据直接传给AL8位寄存器中去
寄存器实验二,加法
八位寄存器,进行八位运算,并不会将多出来的位进到高位寄存器中去,仅仅只会自动清零,然后再接着运算,
总结:
- 寄存器是相互独立的,并不会出现进位的,如果八位计算超出了八位,那就仅仅保存最后的八位,多余的消失。
- 寄存器的加法是与位数相关的,八位寄存器和八位寄存器相加,十六位寄存器和十六位寄存器相加。八位相加出现多于八位,仅保留八位。
- 基本操作 a——输入基本的指令
* r——展示寄存器的值
地址寄存器
- 基本操作 摁“r”,然后在摁“d”,显示出对应的寄存器
- 073F:0100》》段地址:偏移地址
- 段地址:DS,ES,CS,SS
- 偏移地址:SP,BP,SI,DI,IP,BX
- 寄存器的位数是16位,但是CPU是有20根地址线,寄存器的表达局限性,限制了CPU的寻址能力,为了让16位能够表达二十位,就出现了地址加法器,地址的计算方式,将十六位表达,变成二十位表达。
- 地址加法器:段地址 X 16 (十进制的16,10H在十六进制之下) + 偏移地址 = 物理地址
- 段地址 X 16 = 基础地址(就是往后移了一位,扩大了一位,使之能够满足二十位的需求),基础地址 + 偏移地址 = 物理地址
- 实际操作:一个最终的物理地址只要满足公式,都可以找到同样的物理地址,段地址的范围是0 - ffff,只要满足公式,那么最终到达的物理地址都是相同的。
练习题
有一个数据放在内存为20000H的单元格,现在给段地址位SA,若想将偏移地址寻找到此单元格,则SA应该满足的条件最小:10H,最大1001H,这是一个问题,十六位的范围:0 - FFFF,始终少了一个一,而整除的时候会自动舍弃末位的1,所以不可取。
CPU如何区分数据和指令
- u指令:将某个内存地址开始的字节,全部当作指令
- d指令:将某个内存地址开始的字节,全部当作数据
- 两次相同的地址,但是是完全不同的指令,显示的结果也不同
- 两次相同的地址,但是是完全不同的指令,显示的结果也不同
- r + 空格 + ds,修改对应的段地址寄存器的值;r 显示CPU中所有寄存器的值。:
- 虽说内存中的数据和指令是一致的,但是CPU还是能够区分出来,CPU是将CS:IP地址所指向的内容全部当作指令来执行。
在8086CPU,在任意时刻,CPU将CS:IP所指向的内容,全部当作指令去执行
实验——CPU区分指令和数据
将我输入的对应的二进制代码,变成对应的命令去执行,修改CS:IP的地址,让其去执行对应的输入的代码,用e指令修改2000:0的地址,使其为下列相关的地址,去执行。
执行之后,指令行左侧地址已经改变,读取地址,就按照地址里的数据进行执行,问题在于,平常读取数据难道会切换吗?
为什么每一次u都是不一样的,难道再写入数据吗?指令执行的过程
- CPU从CS:IP所指向的内存单元中读取指令,存放到指令缓存器中去
- IP = IP + 所读指令的长度,从而指向下一条指令
- 执行指令缓存器中的内容,回到步骤一
IP寄存器指令的长度关系
在2000:0中输入如下的数字
修改控制寄存器的命令,然后进行运算。第一次运算,是以b8204e作为第一个控制指令开始计算的,mov占了三个字节,下一次执行,ip的值就会加3。
分别对应的是:
CS:IP 当前控制符的对应的字符串 控制指令 操作的数据
问题是:操作的数据从哪里来?
第一次执行
第二次执行
下述显示的是073F:0100对应的数据形式
下述显示的是073F:0100对应的汇编指令的形式
下述时开始运行
未运行时
JMP指令
- 转移指令,可以修改CS和IP这两个寄存器,决定了CPU从哪里读取数据
-
为什么SFR寄存器和internal RAM高128字节地址相同?
2020-09-04 11:17:31最早先的单片机internal RAM只有128字节,而特殊功能寄存器SFR不在internal RAM上,它们是属于很多其它不同的模块,为了方便访问,才把它们编在internal高128字节上。 后来人们发现internal RAM128不够用了,想扩展... -
理解CPU/寄存器/内存之间的关系
2018-10-08 23:35:35CPU/寄存器/内存 因为要了解多线程,自然少不了一些硬件知识的科普,我没有系统学习过硬件知识,仅仅是从书上以及网络上看来的,如果有错误请指出来。 CPU,全名Central Processing Unit(中央处理器)。这是... -
寄存器和存储器
2018-04-12 12:43:48内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分,附一张内核体系结构照片 可以看到内核所处的位置: CPU 中央处理器(CPU,Central Proce... -
单片机S52片内RAM高128H字节和特殊功能寄存器各自的物理空间不同,但是编址重复
2021-01-04 11:18:18单片机S52片内RAM高128H字节和特殊功能寄存器各自的物理空间分别哪里,不是说他们的分处不同的物理区域吗 就是复在不同的物理区域,但地制址相同2113(编址重复),访问方5261式和结构有所不同4102; 高128是... -
汇编程序设计-19-IP寄存器和指令长度的关系
2022-01-09 14:27:181.CPU从当前的CS和IP指向的内存单元读取指令,然后将读取的指令进入到指令缓冲器(CPU中保存指令的地方)中。 2.改变IP寄存器的内容。IP = IP +所读指令的字节数(长度),从而指向下一条指令。 3.执行指令缓冲器中... -
【汇编语言】寄存器和地址
2021-03-04 18:40:57寄存器和地址 主要内容: 一、寄存器 (1)透明寄存器 (2)可编程寄存器 1.通用寄存器 2.专用寄存器 二、地址 (1)存储模型 (2)存储空间分段管理 (3)物理地址与逻辑地址 (4)操作数寻址过程 -
单片机的内存和寄存器是什么?代码中的变量和内存之间有什么关系?
2019-11-22 11:20:08单片机有寄存器和内存。 内存就是RAM、ROM/FLASH,这里的内存的概念和电脑的不太一样,不要搞混,眼着于单片机即可。 ROM/FLASH:程序存储区(只读存储器),不变的东西都存这俩里头,并且存里头的东西只读。 RAM:... -
[从零学习汇编语言] -寄存器详解
2021-10-27 20:58:07上一章我们曾简单的介绍过计算机中的一些硬件和软件的相关概念,还不熟悉的小伙伴可以点击下面的链接进行预习: [汇编语言] - 汇编语言基础知识梳理 一、 存储器与通用寄存器 1. 存储器 每一天清晨,当我们在梦中... -
寄存器和RAM之间的区别
2020-06-23 00:02:07寄存器和RAM之间的区别概述寄存器CPU上的通用寄存器外围功能的控制寄存器RAM可以放入任意数据可以按顺序保存大量数据逻辑构成与C编译器的关系 概述 寄存器是“存储设备”,主要用于存储和检查微型计算机的状态。 ... -
STM32学习——什么是寄存器(存储器映射和寄存器映射)
2021-12-27 11:14:29若与电脑类比,内核与外设就如同电脑上的CPU和主板、内存、显卡、硬盘的关系。 STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计,ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如... -
(1)寄存器
2021-08-30 20:09:28内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。 在CPU中: 运算器进行信息处理 寄存器进行信息存储 控制器控制各种器件进行工作 内部总线连接各种器件,在他们之间进行数据的... -
汇编语言存储及寄存器原理解析
2021-05-23 09:13:55这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下字的存储一个16位寄存器可以存放一个字(16位)或者一个字节(8位... -
51单片机的IO口和寄存器
2020-07-10 16:21:34可是程序是软件,而这些管脚是硬件,它们之间有啥关系啊?这就是涉及到51单片机的内部结构了,学过数字电子技术的同学知道,集成电路的结构太复杂了,简单的逻辑与或非还行,什么锁存器、时序电路、组合电路简直让人... -
汇编语言入门教程(堆、栈、寄存器和内存模型)
2019-04-20 10:59:54学习汇编语言,首先必须了解两个知识点:寄存器和内存模型。 先来看寄存器。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。但是,CPU 的运算速度远高于内存的... -
[转载]汇编eax寄存器和AX,AH,AL之间的关系
2019-10-20 16:54:2600000000 00000000 00000000...|=EAX=|—32个0,4个字节,2个字,1个双字 |AX=|—16个0,2个字节,1个字 |AH=|-----------8个0,1个字节 |=AL|—8个0,1个字节 AX,AH,AL AH是AX的高8位,AL是AX的低8位 AX是EAX的低16位 ... -
四个通用寄存器:AX,BX,CX,DX
2021-07-04 15:40:34一、AX,BX,CX,DX寄存器作用 ...因为8086CPU寄存器是16位结构,所以一个寄存器可以存放两个字节,同时为了兼容性,这四个寄存器中每一个寄存器也可以单独分为两个独立的寄存器。即AX=AH(高八位)+AL -
Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?
2022-03-22 08:34:02这其实是Modbus协议的数据模型和地址模型。 Modbus协议的数据模型 数据模型是对从站设备可访问的数据进行抽象,Modbus协议的数据模型定义了四种可访问的数据: 数据区块 数据类型 ... -
寄存器和栈
2016-10-30 10:52:13结论:任何两个地址连续的内存单元,N和N+1号单元,可以将他们看作2个内存单元,也可以看成一个地址为N的字单元的高位字节单元和低位字节单元。2、DS和地址 在8086PC中,内存地址由段地址和偏移地址组成; 8086CPU中... -
STM32寄存器的简介、地址查找,与直接操作寄存器
2019-01-11 11:15:15寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 简单来说,寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器... -
汇编----寄存器
2022-04-21 08:21:53寄存器-它有什么分类?又该怎么操作? -
内存、寄存器、GPIO地址、存储器之间的关系
2018-04-03 17:33:07内存、寄存器、GPIO地址、存储器之间的关系1、如上图,0x0000 0000表示第一个地址字节,代码使用这个16进制时,指针会指向这个物理地址,对4字节的GPIO控制单元来说,这4个字节的物理地址就叫寄存器,当我们把IO口... -
MODBUS-寄存器与功能码学习
2018-10-26 14:35:25首先是定义的寄存器地址范围,应结合不同单片机RAM的大小和项目得实际需求定义起始范围和大小。方法如在RAM区的不同区域定义不同功能的数组: IOX[N]:输出线圈,用来进行继电器的操作 IX[M]:开关输入 ,... -
字节数据和地址之间的关系
2018-09-03 18:33:56字节 (byte) 习惯用B来表示 1byte=8bit 地址值 :变量占用空间的起始地址,地址值由分配时决定,之后不再改变直到变量撤销。地址值是一个常量 int a; int *p=&a; a=1 &a=0x23 int * ... -
cpu与寄存器
2020-08-01 15:29:44累加寄存器:储存运行的数据和运算后的数据。 标志寄存器:用于反应处理器的状态和运算结果的某些特征以及控制指令的运行。 程序计数器:程序计数器是用于存放下一条指令所在单元的地址的地方。 基址寄存器:储存... -
寄存器用途和英文全称
2020-12-01 13:12:57寄存器类别和用途 基本程序执行寄存器(basic program execution registers)。8 个通用寄存器,6 个段...同样的重叠关系也存在于 EAX、EBX、ECX 和 EDX 寄存器中: 32 位 16 位 8 位(高) 8 位(低)