5. 1 [bx]和Loop指令
[bx]用法
mov ax,[bx]; ds:bx地址内存数据,存入ax寄存器,2字节 (ax)=(ds)*16+bx
mov 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,0ffffh
mov ds,ax
mov bx,6; 以上地址指向ffff:6
mov al,[bx]
mov ah,0; 原地址的值
mov dx,0; 累加存储
mov cx,3; 计数器
s: add dx,ax loop s; 循环三次
mov ax,4c00h
int 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,0fffh
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
5.5 段前缀
5.6 一段安全的空间
这些空间被操作系统保护, 无法直接使用
但是我们当前是面向硬件编程, 需要忽略操作系统的控制
需要使用安全的空间
5.7 段前缀的使用
ffff:0~ffff:b的数据拷贝到0:200~0:20b单元中