0%

05:8086CPU_Learning(4)

为了进一步的使用对内存单元进行灵活的操作,所以使用[BX]和loop指令对其进行操作

[BX]和loop指令

在开始学习之前,需要对一些符号进行讲解

  1. [bx]和内存单元的描述

    要完整的描述一个内存单元,需要两种信息:

    • 内存单元的地址
    • 内存单元的长度(类型)

    这里[bx]表示一个内存单元,段地址默认为ds,偏移地址存储在bx中

  2. loop

    loop在英文中有循环的含义,所以这个指令肯定和循环有关,我们在后面进行详细的说明

  3. 我们定义的描述性的符号:“( )”

    为了描述上的简洁我们用一个描述性的符号”()“来表示一个寄存器或者一个内存单元中的值

    现在我们可以把[bx]的物理地址表示为((ds)*16+(bx))

    “(X)”所表示的数据有两种类型:1)字节;2)字 数据类型由寄存器名称或者具体的运算决定

  4. 约定符号idata表示常量

    之前我们说在”[…]“里用一个常量0表示内存单元的偏移地址,现在我们可以把所有常量都作为[idata]

[BX]

指令功能:

1
mov ax,[bx]

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax) = ((ds)*16+(bx))

1
mov [bx],ax

bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax处的数据送入SA:EA处,即((ds)*16+(bx)) = (ax)

Loop指令

loop指令的格式是:loop 标号,CPU执行loop指令的时候,需要进行两步操作:

  • (cx) = (cx) - 1
  • 判断cx中的值,不为0则转至标号处执行程序,如果为0就向下执行

在此我们可以看出cx的值影响了loop指令的执行结果。通常我们用loop来实现循环功能,cx中存放循环次数

这里我们通过一个程序引出关于loop的使用:

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code
code segment
mov ax,2

mov cx,11
s: add ax,ax
loop s

mov ax,4c00h
int 21h
code ends
end

我们注意到这里使用了标号”s” ,在汇编语言中标号代表一个地址,它实际上标识了一个地址

我突然发现 这样一点一点敲很慢,所以我打算先学完再总结下来

反正这也不是教程 哈哈