汇编语言读书笔记 第二章

 

第二章从寄存器的逻辑结构和CPU寻址开始,到后面再讲到CPU是如何进行执行代码(涉及CS和IP两个寄存器),最后介绍了一个实验,说实在的,前面的讲解真的很具体,做了实验才出了一些问题。 寄存器 register

 

细细回忆一下。

 

====================================

首先,寄存器是可以存放多位二进制数的逻辑结构。8086中,一个寄存器只能存16位二进制数。16位是2个字节,但是规定16位是1个字。也就是说,一个寄存器可以放1个字。1个字可以分为高位和低位,分别是1个字节。这样一个16位的寄存器就又可以被拆为高8位和低8位两个寄存器。这样,我就大致对寄存器有了概念。

 

下面是我的理解图。

AX--通用寄存器之一

 15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0

【0】【0】【0】【0】【0】【0】【0】【0】【0】【0】【1】【0】【0】【1】【0】【0】

  7    6    5    4    3    2    1    0 || 7    6    5    4    3    2    1    0

                  AH       || AL

 

 

======================================

然后,就是CPU寻址。

CPU是先形成物理地址再来寻找地址的。物理地址的形成是依赖一个段加偏移的逻辑算法。这里有个问题,为什么CPU的设计要这样,寄存器是16

 

位,而地址总线要弄20这样的值?

对于段加偏移,书上的比喻让我们理解很恰当。不过我觉得这样理解会更好。

比如我们在用谷歌地图手动找一个城市。首先我们明白地球上有很多国家,有很多城市。我们显然不会忽略国家的概念而直接去找城市,因为那样很困难。假设我们要找重庆,我们就先找到中国,然后在想办法找到重庆。这里的国家的位置就相当于“段”,城市的位置就相当于“偏移”

。所以在用CPU寻址的时候,我们首先要明白有很多段和很多偏移,然后还要知道“段”是我们自定义的,这不像现在的国家基本固定,这样我们就可以自由定位了。

 

段地址*16+偏移地址=物理地址

 

对二进制而言,这里的段地址和偏移地址都是16位的,因为它们都是通过寄存器处理的。这里的段地址*16即段地址向左移4位,后边的位数用0补上,这样就形成了一个20位的数据。偏移地址是任意的16位,故可以偏移64K大小的位置,也就是只有16根地址总线时能寻址的范围大小。这样只需要16个段地址就可以覆盖20位地址总线能够寻址范围。而段地址的自定义性,更是可以大大加大了寻址的灵活性。

 

 

=====================================

接下去,介绍的是CS和IP两个寄存器。它们的组合实现了CPU对代码段的寻址(我们很自然的就明白了这两个分别代表了段和偏移)。CS-Code Segment  IP-Instruction Pointer(自己认为的原英文词)。

 

这里需要说明一下,段寄存器有4种,其中CS是代码段寄存器。也许到这里,我可以大概明白了上面自己提出的问题,为什么CPU要弄个段加偏移的寻址方式?有了段就可以对内存中不同的数据内容进行分类。就像CS段只指向代码段。而且很显然段加偏移的概念应该跟地址总线的数量无关。

 

在这一部分又强调了 内存中,指令和数据没有任何区别。也就是说CPU必须应该能够在一大堆1和0中知道哪些是代码,哪些是数据。于是寄存器又在这里发挥作用了,有专门的寄存器来参与实现代码段物理地址的形成。CS-代码段寄存器,提供段地址。IP-指令指针寄存器,提供偏移地址。

 

=====================================

最后是一个实验

先总结一下操作方法:

 

* R-查看、改变CPU寄存器的内容

* D-查看内存中的内容

* E-改写内存中的内容

* U-将内存中的机器指令翻译成汇编指令

* T-执行一条机器指令

* A-以汇编指令的格式在内存中写入一条机器指令

 

-r 查看寄存器的内容

-r ax 修改ax的内容 键入回车后 出现“:”在其后填入要赋予的值

-d 1000:1 查看从1000:1开始的128个字节的内容 每行16个共8行

-d 1000:0 9 查看10000到10009的10个字节

-e 1000:0 1 2 3 4 5 6 7 8 9 修改从10000开始的10个字节的数据

-e 1000:0 输回车 可以一个一个修改 按空格跳到下一个

-e 1000:0 “adfasf” 2 ‘a’ 可以输字符串 字符 数字

-u 1000:0 查看1000:0开始的机器指令和对应的汇编指令

-a 1000:0 从1000:0位置开始写汇编指令 很方便

-t 执行当前CS:IP位置的机器指令

 

做实验过程中,我开了好几个cmd窗口,竟然发现对其中的修改竟然互不影响。后来才明白我是在虚拟下运行的。虚拟8086模式,确实是一个不错的想法。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值