0%

汇编语言学习笔记(三)

第三章 寄存器(内存访问)

3.1 内存中字的存储

在0地址处开始存放20000(4E20H):

截屏2021-06-04 上午12.10.10

小端模式:高字节存放高地址位,低字节存放低地址位(0号单元是低地址单元,1号单元是高地址单元)

问:1地址单元存放的字型数据是多少?

答:124EH

结论:任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

3.2 DS和[address]

  • CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址
  • 在8086PC中,内存地址由段地址和偏移地址组成
  • 8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址

例如:我们要读取10000H单元的内容可以用如下程序段进行:

mov bx, 1000H

mov ds, bx

mov al, [0]

上面三条指令将10000H(1000:0)中的数据读到al中

mov指令的功能

  1. 将数据直接送入寄存器

    mov ax,2

  2. 将一个寄存器中的内容送入另一个寄存器

    mov bx,ax

  3. 将一个内存单元中的内容送入另一个寄存器

    mov al, [0]

    • 格式:mov 寄存器名, 内存单元地址
    • […]表示一个内存单元,[…]中的0表示内存单元的偏移地址。
    • 执行指令时,8086CPU自动取DS中的数据为内存单元的段。

注意:8086CPU不支持将数据直接送入段寄存器 (由于硬件设计问题)

mov ds, 1000H是非法的 ❌

正确做法:数据->通用寄存器->段寄存器 ✅

怎样将数据从寄存器al送入内存单元10000H?(反向操作~)

mov bx, 1000H

mov ds, bx

mov [0] al

3.3 字的传送

因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。

比如:

mov bx 1000H

mov ds, bx

mov ax, [0] ;1000:0处的字型数据送入ax

mov [0], cx ; cx中的16位数据送到1000:0处

问题3.3

TODO: P14

问题3.4