汇编语言寄存器内存访问笔记

本博客是我看王爽的汇编语言第二版,做的笔记,一是为了巩固自己的学习知识,二是为了和大家多多交流!:

CPU内存方式 字在存储器的存储

| 0| 0| 0|0|0|0|0|0|0|0|0|0|0|0|0|0|   16位的存储为
这里写图片描述

内存中字的存储

这里写图片描述

mov指令

  1. mov bx,1000H //将数据送入寄存器中
  2. mov ds,bx //将一个寄存器的内容送入另外一个寄存器中
  3. mov al,[0] //将物理地址为:DX*10+0中的内容存入al中
  4. mov [0],al //将存储器内容送入内存

mov 指令中 的[]说明操作对象是一个内存单元, []中的 0 说明这个内存单元的偏移地址是 0 ,它的段地 址默认放在 ds中,指令执行时, 8086CPU 会自动从 ds 中取出。 mov bx ,1000H mov ds ,bx 若要用 mov al,[0]完成数据从 1000:0 单元到 al 的传送,这条指令执行时, ds 中的内容 应为段地址1000H,所以在这条指令之前应该将1000H 送入 ds 。
如何把一个数据送入寄存器呢?我们以前用类似 “mov ax.l” 这样的指令来完成,从 理论上讲,我们可以用相似的方式: mov ds,1000H ,来将1000H 送入 ds 。可是,现实并 非如此, 8086CPU 不支持将数据直接送入段寄存器的操作,也是一个段寄存器,所以 mov ds,1000H 这条指令是非法的。
那么如何将 1000H 送入 ds>呢?只好用一个寄存器来进 行中转,即先将 1000H 送入一个一般的寄存器,如 bx ,再将bx 中的内容送入 ds。
为什么 8086CPU 不支持将数据直接送入段寄存器的操作?这属于 8086CPU 硬件设计 的问题,我们只要知道这一点就行了。

  1. DS段寄存器可以为0000吗?
  2. 段地址*16+偏移地址=物理地址
  3. 内部地址加法器的目的是为了获取物理地址,另外是为了地址总线匹配,达到通过内部地址加法器运算之后能够找到物理地址,达到充分利用地址总线,提高寻址能力
  4. 64位CPU内存条支持超过4G,那是因为64 位CPU寻址能力比较大,给内存条分配的空间比较多,32位CPU只能给内存条分配4G,那么是因为CPU寻址能力稍微弱,除了给内存分配之外,还要给显存,等其他设备分配逻辑地址

64位cpu并不是说地址总线是64根,而是说的是处理数据的能力是64位

32位处理器intel从奔腾Pro AMD从速龙加入PAE,将地址扩展到了36位。 64位处理器intel是40位。(intel
datasheet写的39-bit guest physical address and host physical address
widths)AMD貌似也是40位,family 15h没找到。
补充:安腾的话是50位(查于安腾9350 ),Power SPARC ARM等未查。
一般处理器多少位是指的寄存器的长度,当然数据线需要与之相同,地址线则不需要与之相等的。

下面是王爽汇编中的解释

我们说 8086CPU 的上一代 CPU(8080 、8085)等是 8 位机,而 8086 是 16 位机,也可以说 8086 是 16 位结构的 CPU 。那么什么是16 位结构的 CPU 呢?
概括地讲,16 位结构 (16 位机、字长为 16 位等常见说法,与 16位结构的含义相同) 描述了一个 CPU 具有下面几方面的结构特性。
• 运算器一次最多可以处理 16 位的数据;
• 寄存器的最大宽度为16 位:
• 寄存器和运算器之间的通路为 16 位。

猜你喜欢

转载自blog.csdn.net/kdchxue/article/details/46723037