[BX]和loop指令
[bx]和内存单元的描述
如 mov ax,[bx]:
将一个内存单元的内容送入ax,长度为2个字节,因为ax的长度是2个字节,偏移地址在bx中,段地址在ds中
loop
循环
我们定义的描述性的符号:“()”
(ax)表示ax中的内容,(al)表示al中的内容
(2000H)表示内存单元2000H中的内容
((ds)*16+(bx))
表示ds中的内容addr1x16 + bx中的内容addr2的地址单元的内容
也可以理解为以addr1为段地址,addr2为偏移地址的内容
()里面可以有三种元素:寄存器名,段寄存器名,物理地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/59e1b4eeac8b43259ea6f435810afc83.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiA5p2h6am0,size_20,color_FFFFFF,t_70,g_se,x_16)
约定符号idata表示常量
[BX]
mov ax,[bx] 表示将偏移地址为bx的内存的值写入到ax寄存器
mov [bx],ax 表示将ax寄存器的值写入偏移地址为bx的内存空间
loop指令
指令格式:loop 标号
CPU执行执行操作
(cx) = (cx) - 1
判断cx的值,不为0则转至标号处执行程序,为零则向下执行
assume cs:codesg
codesg segment
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
codesg ends
end
在DEBUG中跟踪用loop指令循环的程序
DEBUG和汇编编译器masm对指令的不同处理
在masm中
mov ax, 1000H
mov ds, ax
mov al, [0]
[idata]会被翻译为idata
mov ax, 1000H
mov ds, ax
mov al, ds:[0]
这样子就是将ds偏移地址0的内容写入ax
[BX]和loop的联合应用
assume cs:a
a segment
mov ax,ffff
mov ds,ax
mov ax,0
mov bx,0
mov cx,12
s: mov bl,ds:[ax]
add dx,bx
inc ax
loop s
mov ax,4c00h
int 21h
a ends
end
段前缀
段前缀格式:ds:[xx]
一段安全的空间
在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间可能存在重要的数据或者代码
一般情况下dos方式,0:200f ~ 0:2ff空间时可用的
段前缀的使用
将ffff:0~ffff:b单元的数据复制到0:200~0:20b单元
mov ax:ffff
mov ds:ax
mov bx:0000
mov dx:200
mov cx:6
s: add dx,ax
mov bx:[dx],ds:[ax]
inc ax
loop s