5.1
[bx]
和[0]类似
[0]表示偏移地址长度,段地址默认在bs中,
但是[0]在debug中跟asm中表示的不一样,[0]在asm中ml之后会变成数值0
为解决mov ax,[1]在axm编译后变成mov ax,1;可以写成mov ax,ds:[1]
四种:mov al,[0];mov al,ds:[0];mov al,[bx];mov ds:[bx]
loop:与循环有关
(ax)=0010H;用()表示ax中的内容为
2000:1000的内容为0010:(21000H)=0010H
mov ax,[2] 描述为:(ax)=((ds)*16+2);
push ax 可以描述:
(sp) = (sp)-2
((ss)*16+(sp))=(ax)
pop ax
(ax)=((ss)*16+(sp))
(sp) = (sp)+2
约定符合idata表示常量
mov ax,[idata]
mov ax,[bx]即:(ax)=((ds)*16+(bx))
INC bx inc表示(bx)自增+1
5.2 loop指令
cx默认是存放程序的大小;
loop操作要进行两个指令:
(cx)=(cx)-1
判断cx中的值,如果不为0,则跳转到标号处执行,如果为0则向下执行
2^n次方:
assume cs:code
code segment
start:mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
三个要点:
cx存放循环次数(cx值最好是放在标号前一行)
loop指令的标号地址要放在前面
要执行的程序代码要写在标号和loop之间
实现ffff:0006单元向ax赋值
(ah)=0,(al)=(ffff6H)
mov ax,0ffffH(注意,由于汇编源程序中,数据不允许以字母开头,所以要加0)
debug引入G命令和P命令来解决循环调试问题:
如果loop指令在0012;
G 0014(偏移地址);表示之间循环完成跳转到0014处的代码;
p ;表示之间完成循环,跳转到结束后的代码
5.5loop和[bx]的联合应用
有关计算题的存储问题,一定要先考虑会不会超出存储范围;
内存单元中的数据是8位的, 不能直接加到16位中。
在多次循环中,如果仅仅是偏移地址发生变化,可以引入新的bx或者其他的通用寄存器,用来做累加
5.7一段安全的空间
随意改写内存空间很危险。
0:200h~0:2FFh是默认的安全空间
拷贝,元单元ffff:x和目标单元0:200h~0:2FFh
先将0:200~02ff表示为:0020:0~002f:f
好将偏移地址用一个变量来表示
s:mov ax,0ffffh
mov ds,ax
mov dl,[bx]
mov ax,0020h
mov ds,ax
mov [bx],dl
inc bx
loop s
因为两个数据是不同的段,所以要每次循环设置两次ds
可以借用es来将ds,ax es,ax放入循环外面