前言

有了前文的铺垫,直接开始。

正文

一个典型的cpu 由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

区别:内部总线实现cpu 内部各个器件之间的联系。

外部总线实现cpu和主板上其他器件的联系。

8086 cpu 有14个寄存器,他们的名称为: AX、BX、CX、DX、SI、DI、SP、IP、CS、SS、DS、ES、PSW。

8086 cpu所有的寄存器都是16位的,可以存放两个字节。

为什么8086的寄存器是16位的? 这个比较的好理解哈,因为要做加法,没有16位存不下去。

现在cpu 是64位,那么寄存器起码得是64位,不然没法实现加法。cpu 64位之所以可以使用32位的软件,那是因为64位的cpu兼容了32位的,往下看。

AX、BX、CX、DX 通常用来存放一般性的数据,称为通用寄存器。

寄存器的逻辑结构:

EAX 就是32位的cpu的叫法。

数据18:

二进制表示:10010

在寄存器ax中的存储。

这里可能有人疑问了,int 不是 4个字节吗? 我们常说的是int32,4个字节,16位的也只能是两个字节哈。

然后16位的寄存器存储的最大值为:2的16次方-1。这里就有人问了,万一计算的比16位还多的数字怎么办呢? 这个靠设计解决,比如说有一个32位的数字要计算,那么可以设计2个16位去处理,这种要靠设计去实现了,cpu 能做的只有这个。

8086 上一代的cpu 寄存器都是8位的;为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

然后怎么兼容的,那是因为AX 可以分为AH和AL,那么AH 是8位的。

那么其他的也是这样BX 分为BH和BL。

CX 分为CH和CL。

DX分为DH和DL。

这些分出来的就是8位的。说白了就是兼容兼容这些指令了。

AH 表示高位,AL表示低位。 hight and low 哈。

所以8位的程序,只能用到AL这种低位的。一个32位程序也不要想换成64位cpu就能跑的更快,没有这回事。

AX的低8位(0-7)构成了AL寄存器,高8位(8位-15位)构成了AH寄存器。

AH和AL寄存器可以独立使用的8位寄存器。

一个字可以存储在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。


在计算机领域, 对于某种特定的计算机设计而言,字是用于表示其自然的数据单位的术语。在这个特定计算机中,字是其用来一次性处理事务的一个固定长度的位(bit)组。一个字的位数(即字长)是计算机系统结构中的一个重要特性。

字长在计算机结构和操作的多个方面均有体现。计算机中大多数寄存器的尺寸是一个字长。计算机处理的典型数值也可能是以字长为单位。

CPU和内存之间的数据传送单位也通常是一个字长。还有而内存中用于指明一个存储位置的地址也经常是以字长为单位的。

现代计算机的字长通常为16、32、64位。其他曾经使用过的字长有:8、9、12、18、24、36、39、40、48、60位;slab是早期的另一个字长实例。

某些最早期的计算机是十进制的而不是二进制的,通常拥有10位或者12位的十进制数字作为字长,还有一些早期的计算机根本就没有固定字长。

有时候字长被定义为某个特定值是为了与早期的计算机保持兼容。

![](https://img2022.cnblogs.com/blog/1289794/202205/1289794-20220522111118361-2038768733.png)

个人计算机中最通用的微处理器(例如: Intel的Pentium系列和AMD的Athlon系列)就是一个例子。

它们中的IA-32构架是早期的具有16位字长的Intel 8086构架的扩展。而IA-32处理器仍然支持8086(x86)程序,所以在IA-32中,“字”的含义仍然为16位,尽管事实上它运行起来(特别是当默认操作数为32位时)更像一台32位计算机。

类似地,在更新型的x86-64构架中,“字”仍然是16位的,虽然64位操作数更为常见。

题目:

这个h什么意思呢? hexadecimal,16进制的意思。

把音标放出来哈:

add ax bx的意思是将ax=ax+bx 的意思哈。

然后看下结果。 8226H+8226H = 1044CH 这个很好算哈,满16进1。

但是这个寄存器只有16,所以是044CH。

题目二:

看第三行: add al,bl 这个算。 这个时候al 是1A bl就是26,相加后就是40。

这里主要的疑问在于,如果是A1 和 7A相加A+7大于16,是往高位进位呢? 还是丢弃或者存在某个地方?

题目中的这个? 就是考验这个问题了。

al = c5 ,c5+93 会对高位有影响吗? 其实不应该有影响的,因为得兼容8位的,8位可没有16位这么多,如果进高位那么跟以前的操作就不一样了。

所以? 是 0058,进位的1好像被丢弃了对吧。

这里的丢失,指的是进制位不在8位寄存器中保存,但是cpu 并不会真的丢弃这个进位值。

题目三:

下一节物理地址相关的知识。

作者:|敖毛毛|,原文链接: https://www.cnblogs.com/aoximin/p/16297522.html

文章推荐

文件输入输出处理(二)-字节流

SpringBoot Restful 接口实现

接口的幂等性如何设计?

一次生产环境的docker MySQL故障

解决库存扣减及订单创建时防止并发死锁的问题

一文讲透为Power Automate for Desktop (PAD) 实现自定义模...

Python数据分析--Numpy常用函数介绍(2)

又一位大佬「归隐」,张勇卸任淘宝天猫董事长,管理者又该如...

一篇文章带你搞定JavaScript 性能调优

记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过...

修改docker容器端口映射

手把手带你自定义 Gradle 插件 —— Gradle 系列(2)