3.1 ~ 3.5

2020-03-05
2020-03-05
3 min read
Hits

  《汇编语言(第3版)》3.1 ~ 3.5、《零基础入门学习汇编语言》P13 ~ 15

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

3.1 内存中字的存储

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

3.2 DS 和 address

  CPU 要读取一个内存单元的时候,必须先给出这个内存单元的地址;

  在 8086 PC 中,内存地址由段地址和偏移地址组成。

  8086 CPU 中有一个 DS 寄存器,通常用来存放要访问的数据的段地址。

  已知的 mov 指令可完成的两种传送功能

mov ax,2     # 将数据直接送入寄存器;
mov bx,ax     # 将一个寄存器中的内容送入另一个寄存器中

  除此之外,mov 指令还可以将一个内存单元中的内容送入一个寄存器。

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

mov bx,1000H
mov ds,bx
mov al,[0]     # mov 指令的格式:mov 寄存器名,内存单元地址,“[…]”表示一个内存单元,“[…]”中的 0 表示内存单元的偏移地址

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

  执行指令时,8086 CPU 自动取 DS 中的数据为内存的单元的段地址。

  用 mov 指令从 1000H 中读取数据

  1. 10000H 表示为 1000:0(段地址:偏移地址)
  2. 将段地址 1000H 放入 ds
  3. 用 mov al,[0] 完成传送(mov 指令中的 [] 说明操作对象是一个内存单元,[] 中的 0 说明这个内存单元的偏移地址是 0,它的段地址默认放在 ds 中)

  8086 CPU 不支持将数据直接送入段寄存器的操作,ds 是一个段寄存器。(硬件设计问题)

数据 → 通用寄存器 → 段寄存器,不能直接将数据送入段寄存器

  将数据从寄存器送入内存单元

mov bx,1000H
mov ds,bx
mov [0],al

3.3 字的传送

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

3.4 mov、add、sub 指令

  已学 mov 指令的几种形式

mov ax,6     # mov 寄存器,数据
mov bx,ax     # mov 寄存器,寄存器
mov ax,[0]     # mov 寄存器,内存单元
mov [0],ax     # mov 内存单元,寄存器
mov ds,ax     # mov 段寄存器,寄存器
mov ax,ds     # mov 寄存器,段寄存器

  add 和 sub 指令同 mov 一样,都有两个操作对象

add ax,8     # add 寄存器,数据
add ax,bx     # add 寄存器,寄存器
add ax,[0]     # add 寄存器,内存单元
add [0],ax     # add 内存单元,寄存器
sub ax,9     # sub 寄存器,数据
sub ax,bx     # sub 寄存器,寄存器
sub ax,[0]     # sub 寄存器,内存单元
sub [0],ax     # sub 内存单元,寄存器

3.5 数据段

  将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

  我们将 123B0H~123BAH 的内存单元定义为数据段,我们现在要累加这个数据段中的前 3 个单元中的数据,代码如下

mov ax,123BH
mov ds,ax     # 将 123BH 送入 ds 中,作为数据段的段地址。
mov al,0     # 用 al 存放累加结果
add al,[0]     # 将数据段第一个单元(偏移地址为 0)中的数值加到 al 中
add al,[1]     # 将数据段第二个单元(偏移地址为 1)中的数值加到 al 中
add al,[2]     # 将数据段第三个单元(偏移地址为 2)中的数值加到 al 中

  累加数据段中的前 3 个字型数据

mov ax,123BH
mov ds,ax     # 将 123BH 送入 ds 中,作为数据段的段地址。
mov ax,0     # 用 ax 存放累加结果
add ax,[0]     # 将数据段第一个字(偏移地址为0)加到 ax 中
add ax,[2]     # 将数据段第二个字(偏移地址为2)加到 ax 中
add ax,[4]     # 将数据段第三个字(偏移地址为4)加到 ax 中

一个字型数据占两个单元,所以偏移地址是 0、2、4。

小结

  1. 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
  2. 用 mov 指令要访问内存单元,可以在 mov 指令中只给出单元的偏移地址,此时,段地址默认在 DS 寄存器中。
  3. [address] 表示一个偏移地址为 address 的内存单元。
  4. 在内存和寄存器之间传送字型数据时,高地址单元和高 8 位寄存器、低地址单元和低 8 位寄存器相对应。
  5. mov、add、sub 是具有两个操作对象的指令。jum 是具有一个操作对象的指令。
  6. 可以根据自己的推测,在 Debug 中实验指令的新格式。
Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 3.6 ~ 3.10