BX 寄存器在内存寻址的作用
mov ax, 2000H |
最后得到的内存分布
loop指令的使用
assume cs:code |
cx 作为循环的计数器
计算乘法,123*236
assume cs:code |
注意:在汇编程序中,数据不能以字母开头
g
指令可以直接执行到指定的位置
p
会自动重复直到 cx == 0
为止
Debug和masm对指令的不同处理
在汇编源程序中,我们需要这么写
mov ax, 2000h |
如果没有指定段寄存器
mov al,[0] |
则 masm
理解成
mov al, 0 |
当然如果是寄存器的话
mov al, [bx] |
则段寄存器默认存在是 ds
问题
计算 ffff:0 ~ ffff:b
单元中的数据的和,结果存储在 dx 中
由于每一个数据都是字节的,不能直接加到16位的寄存器dx中,那么我们是不是可以用dh和dl呢,但是这样可能导致进位丢失
所以我们需要将8位的数据赋值到16位寄存器然后再与dx相加
cs:code |
如何使用内存空间
assume cs:code |
程序出问题了,无法继续运行
DOS方式下,一般情况,0:200 ~ 0:2ff
空间中没有系统或其他程序的数据或代码
问题
将内存 ffff:0 ~ ffff:b 单元中的数据复制到 0:200 ~ 0:20b 单元中
可以将两个段的地址保存到两个寄存器中
assume cs:code |
实验
- 编程,向内存 0:200 ~0:23F 依次传送数据 0 ~63(3FH)
代码
assume cs:code |
运行结果
- 编程,向内存 0:200~0:23F 一次传递数据 0~63(3FH),程序中只能使用9条指令
如果只能用9条指令,那么可以这么改运行结果assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,0
mov cx,40h
s: mov [bx+200h],bx ;去掉了 ax,只用bx一个寄存器就可以做到
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,20h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
于是可以推测出 CX=17h
完整代码如下
assume cs:code |
可以看到成功复制了