5. 1 [bx]和Loop指令

[bx]用法

  1. mov ax,[bx]; ds:bx地址内存数据,存入ax寄存器,2字节 (ax)=(ds)*16+bx
  2. mov al,[bx]; 1字节

5.2 Loop指令

5.2.1 loop s的执行过程

image.png

  1. (cx)=(cx)-1
  2. cx中的值不为0跳转到s所在表示的地址处执行
    为0则向下执行结束循环

    5.2.2 乘法表达

    123X236相当于123相加236次, 有如下代码
    image.png ``` assume cs:code

code segment

  1. mov ax,0ffffh
  2. mov ds,ax
  3. mov bx,6; 以上地址指向ffff:6
  4. mov al,[bx]
  5. mov ah,0; 原地址的值
  6. mov dx,0; 累加存储
  7. mov cx,3; 计数器

s: add dx,ax loop s; 循环三次

  1. mov ax,4c00h
  2. int 21h; 返回

code ends

end

  1. <a name="xwMWF"></a>
  2. ## 5.3 debug和汇编编译器的不同
  3. mov ax,[0]<br />在debug中是ds:[0]<br />在编译器是0
  4. - 用[bx]就OK
  5. - 或者显示给出ds:[0]
  6. <a name="hSj5S"></a>
  7. ## 5.4 loop和[bx]的联合应用
  8. 计算ffff:0~ffff:b单位中的数据的和,结果存在dx中
  9. <a name="XhgTH"></a>
  10. ### 5.4.1 问题考虑
  11. - dx是否能承受合的所有值大小<br />如果结果不大于65535是可以的
  12. - ffff:0~ffff:b的值是8位, dx寄存器的大小是16位<br />当然不行
  13. - 能否直接累加到dl中,dh设置为0, 来实现累加到dx的目标<br />容易造成进位丢失
  14. 存在类型不匹配和超界的问题
  15. <a name="omKnG"></a>
  16. ### 5.4.2 处理方案
  17. 目前解决方式是8位数据赋值到16位寄存器ax,再从ax累加到dx上

assume cs:code

code segment

  1. mov ax,0fffh
  2. mov ds,ax
  3. mov bx,0
  4. mov dx,0
  5. mov cx,12

s: mov al,[bx]; 通过改变寄存器中数字 mov ah,0 add dx,ax inc bx; 自增 loop s

  1. mov ax,4c00h
  2. int 21h; 返回

code ends

end ```

5.5 段前缀

image.png

5.6 一段安全的空间

image.png
image.png
这些空间被操作系统保护, 无法直接使用
但是我们当前是面向硬件编程, 需要忽略操作系统的控制
需要使用安全的空间
image.png

5.7 段前缀的使用

ffff:0~ffff:b的数据拷贝到0:200~0:20b单元中
image.png