第二章 寄存器

2.0 寄存器的引入

汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)

看了这么两段话,唯一有用的一句——8086CPU有14个寄存器。

2.1 通用寄存器

汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)

通用寄存器AX(Accumulator [əˈkjuːmjəleɪtə( r )]):通常称为累加器,它可用于加减乘除、输入/输出等操作,它们的使用频率很高。
通用寄存器BX(Base Register):称为基地址寄存器,它可作为存储器指针来使用。
通用寄存器CX(Count Register):称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数。
通用寄存器DX(Data Register):称为数据寄存器,在进行乘、除运算时,它可作为默认的操作数参与运算;也可用于存放I/O的端口地址。
说来也巧,刚好是ABCD。


有个很有意思的问题:以AX为例,AX由AH、AL两个八位寄存器组成,AH和AL中的H和L很好理解,是high和low的缩写,分别代表着高位和低位,那么AX、BX、CX、DX中的X呢?这个X为什么不是R(Register的缩写)?( 这个问题就只是学习之余拿来放松放松的问题,就是老外的规定嘛!)X总归是缩写吧,我们记英语单词比记字母肯定来的深刻,还能提高词汇量呢!
大概有两种“猜想”:第一是英语单词mix的缩写,AX由AH和AL组成,X代表着高低位寄存器的混合,毕竟AX不是一个完整的16位寄存器,而是两个8位寄存器的组成。第二个是英语单词hexadecimal [ˌheksəˈdesɪml] (通常缩写成hex),十六进制的意思,毕竟通用寄存器是十六位寄存器。不管什么说法,这两个单词是学到了,X我也记下来了。

汇编第二课预习——寄存器(1)

2.2 字在存储器中的存储

汇编第二课预习——寄存器(1)
数据在8086CPU寄存器中的存储可以看作是一个十六位二进制数,也可以看作两个八位二进制数。

2.3 几条汇编指令

汇编第二课预习——寄存器(1)
两条汇编指令:movadd ,分别代表着赋值算术加
汇编第二课预习——寄存器(1)
add ax,bx表示将ax和bx的数据相加再存储到ax里,那么就是:ax=8226H+8226H=1044CH,但是ax是十六位的啊,1044C是5*4=20位二进制数,多了4位二进制数(一位16进制数),那是不是应该把十六进制最高位的那一位给舍去?变成044CH?继续看!
汇编第二课预习——寄存器(1)
bingo!
汇编第二课预习——寄存器(1)
add al,93H,意思是将十六进制数93加上al中的数据,即al=93H+C5H=158H,这也超出了al的位数,舍去最高位的进位,最后结果是0058H,康康答案。
汇编第二课预习——寄存器(1)
bingo! 但是现在也有一个问题:那要是不是add al,93H而是add ax,93H呢,这个低位的进位还能不能传递?书上紧接着还真是这个问题,哈哈。
汇编第二课预习——寄存器(1)
哦!完全懂了!就是刚才那一节的知识点!数据在寄存器中的存储,是有两种形式的:十六位或者八位,要么看成16位、要么看成8位!就要视具体情况而定了!

汇编第二课预习——寄存器(1)
这一点注意事项要牢记!

2.4 物理地址

汇编第二课预习——寄存器(1)
物理地址就是地址呗,编号。

2.5 十六位结构的CPU

汇编第二课预习——寄存器(1)

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

汇编第二课预习——寄存器(1)
具体实现的逻辑结构:
汇编第二课预习——寄存器(1)
我们知道单纯两个十六位二进制数相加,最大不过十七位数,FFFFH+FFFFH=(10000+10000-2)H=1FFFEH,(没算错吧),用二进制数表示17位足够了。还是不能变成20位的,所以必不可能是单纯的相加就完事儿的。
汇编第二课预习——寄存器(1)
因为一般地址都用十六进制表示,转化过程就少去了,变成直接左移一位。如果必须是用二进制表示,也可以是直接用二进制左移四位。(24=16)

现在的问题就是这种算法20位是没问题,但能保证取遍所有的数吗?我证明不来,因为还有个问题没懂:就是 段地址偏移地址 的概念了,到底它们是什么呢?怎么来的呢?

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

汇编第二课预习——寄存器(1)
书上还有类比:
汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)
我大概明白编书人的意思了,来说说自己的理解:我们不必要从一个很高的角度去看待这个式子:“物理地址=段地址×16+偏移地址”,这只是一个求法。段地址和偏移地址可以说只是为了求出物理地址而出现的两个概念,将一个多位数的数据拆分成两个较少位数的部分,再通过两个较少位数的运算返回一个原有的多位数的值(因为我们不能直接存储一个多位数的值),这便是一个算法而已。不过,说不定基于这个式子,让段地址和偏移地址又被赋予了更多的意义。不知道理解的对不对,哈哈哈。

2.8 段的概念

汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)
汇编第二课预习——寄存器(1)
摆正位置!内存没有实质上的分段,而是为了让一个本没意义的算法式子变得有意义,结果发现这么做还就确实更好了,这才逐步改正说法。

相关文章: