[BX]

ax,[bx] = ax,ds*16+bx(物理地址)

cx 和 loop 指令配合实现循环要点

  1. 在 cx 中 存放循环次数
  2. loop 指令中的标号所标识的地址要在前面
  3. 要循环执行的程序段,要写在标号和 loop 指令的中间

用 cx 和 loop 指令相配合实现循环的功能程序框架如下:

  1. mov cx,循环次数
  2. s: add ax,ax
  3. loop s

问题 5.2

用加法计算 123*236,结果存在 ax 中;可以用循环完成,将236加123次。

assume cs:code
code segment
  mov ax,0
  mov cx:123
s:add ax,236
  loop s
  mov ax,4c00h
  int 21h
code ends
end

5.4 Debug和汇编编译器 masm 对指令的不同处理

  1. mov ax,[0]

Debug 中表示将 ds:0出的数据送入ax中,masm编译器中表示 mov ax,0;那么在 masm中如何定义的,有两种方式:
a. 可以将偏移地址送入 bx 寄存器中 ,这样每次都需要通过 bx 间接的给出偏移地址,比较麻烦。

mov ax,2000h
mov ds,ax
mov bx,0
mov al,[bx]

b. 显式地给出段地址所在的段寄存器,比如访问 2000:0 内存单元的数据

mov ax,2000h
mov ds,ax
mov al,ds:[0]

5.7 一段安全的空间

  1. 我们需要直接向一段内存中写入内容;
  2. 这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误;
  3. DOS方式下,一般情况,0:2000:2ff空间中没有系统或其他程序的数据或代码;
  4. 以后,我们需要直接向一段内存中写入内容时,就使用0:2000:2f这段空间。

    实验4 [bx]和 loop 的使用

    ```shell assume cs:code code segment mov ax,0000h mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,64 s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end

```

注意事项

注意程序中的第一条指令mov ax,0fh。我们知道,大于9FFFh的十六进制数据A00OH、A001H..C0O0H、c001H..FFFEH、FFFFH等,在书写的时候都是以字母开头的。而在汇编源程序中,数据不能以字母开头,所以要在前面加0。比如,9138h在汇编源程序中可以直接写为“9138h”,而A000在汇编源程序中要写为“0A000h”。