5. 1 [bx]和Loop指令
[bx]用法
mov ax,[bx]; ds:bx地址内存数据,存入ax寄存器,2字节 (ax)=(ds)*16+bxmov al,[bx]; 1字节
5.2 Loop指令
5.2.1 loop s的执行过程

- (cx)=(cx)-1
- cx中的值不为0跳转到s所在表示的地址处执行
为0则向下执行结束循环5.2.2 乘法表达
123X236相当于123相加236次, 有如下代码
```
assume cs:code
code segment
mov ax,0ffffhmov ds,axmov bx,6; 以上地址指向ffff:6mov al,[bx]mov ah,0; 原地址的值mov dx,0; 累加存储mov cx,3; 计数器
s: add dx,ax loop s; 循环三次
mov ax,4c00hint 21h; 返回
code ends
end
<a name="xwMWF"></a>## 5.3 debug和汇编编译器的不同mov ax,[0]<br />在debug中是ds:[0]<br />在编译器是0- 用[bx]就OK- 或者显示给出ds:[0]<a name="hSj5S"></a>## 5.4 loop和[bx]的联合应用计算ffff:0~ffff:b单位中的数据的和,结果存在dx中<a name="XhgTH"></a>### 5.4.1 问题考虑- dx是否能承受合的所有值大小<br />如果结果不大于65535是可以的- ffff:0~ffff:b的值是8位, dx寄存器的大小是16位<br />当然不行- 能否直接累加到dl中,dh设置为0, 来实现累加到dx的目标<br />容易造成进位丢失存在类型不匹配和超界的问题<a name="omKnG"></a>### 5.4.2 处理方案目前解决方式是8位数据赋值到16位寄存器ax,再从ax累加到dx上
assume cs:code
code segment
mov ax,0fffhmov ds,axmov bx,0mov dx,0mov cx,12
s: mov al,[bx]; 通过改变寄存器中数字 mov ah,0 add dx,ax inc bx; 自增 loop s
mov ax,4c00hint 21h; 返回
code ends
5.5 段前缀
5.6 一段安全的空间


这些空间被操作系统保护, 无法直接使用
但是我们当前是面向硬件编程, 需要忽略操作系统的控制
需要使用安全的空间
5.7 段前缀的使用
ffff:0~ffff:b的数据拷贝到0:200~0:20b单元中
