1.[bx] 和内存单元的描述
要完整的描述一个内存单元,需要俩种信息:1.内存单元的地址,2.内存单元的长度。
[bx]是什么呢? [bx] 表示一个内存单元,它的偏移地址在bx中, 例如 mov ax,[bx] 将一个内存单元的内容送入ax,这个内存单元的长度为2字节(一个字单元)
mov ax,[bx]
功能:bx 中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。即 (ax)=((ds)*16+(bx))。
mov [bx],ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA出,即((ds)*16+(bx))=(ax)。
注:inc的含义是 让后面的寄存器内容+1
2.loop
循环。通常情况下 cx中的值代表着循环次数。
如下:想计算2^12 需要11条重复指令 add ax,ax
代码如下
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
(1)标号
在汇编语言中,标号代表一个地址,程序5.1中有一个标号S 。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
(2)loop s
CPU 执行loop s 的时候,需要进行俩步操作
1(cx)=(cs)-1;
2 判断cx中的值,不为0 则转至s所表示的地址处执行。为零则执行下一条指令
3.loop 和 [bx] 的联合使用
assume cs:code code segment mov ax,0ffffh mov ds,ax mov bx,0 mov dx,0 mov cx,12 s:mov al.[bx] mov ah,0 add dx,ax inc bx loop s mov ax,4c00h int 21h code ends end
实际编程中,经常会遇到用同一种方法处理地址连续的内存单元中的数据的问题。
我们需要用循环来解决问题,同时我们必须能够在每次循环的时候按照同一种方法来改变要访问的内存单元的地址。这是,就不能用常量来给出内存单元的地址 而应用变量,mov al,[bx] 中的bx 就可以看作一个代表内存单元地址的变量。
4.段前缀
指令"mov ax,[bx]"中,内存单元的偏移地址 由bx给出,而段地址默认在ds中,我们可以在访问的内存单元的指令中,显式地给出内存单元的段地址所在的段寄存器。
比如:mov ax,ds:[bx]
mov ax,cs:[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址在bx中,段地址在cs中
这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的"ds:" "cs:" 称为段前缀。
5.一段安全的空间
在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段内容空间中可能存放着重要的系统数据和代码。
如果随意更改,会引发错误。