问题:SI和DI寄存器的使用
2018-08-16 本文已影响0人
柠檬就是酸
题目:
用寄存器SI和DI实现将字符串“welcome to masm!”复制到它后面的数据区中
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
分析:
因为“welcome to masm!”从偏移地址0开始存放,长度为16个字节,所以,它后面的数据区的偏移地址为16,就是字符串所要存放的空间。题目要求使用SI和DI寄存器,所以使用ds:SI指向要复制的原始字符串,使用ds:DI来指向复制的目的空间,然后用一个循环来完成复制。
在程序中,使用的是16位的寄存器进行内存单元的传输,一次复制两个字节,一共循环8次。
代码:
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,0 ;源地址是0
mov di,16 ;目标地址是16
mov cx,8 ;一次传输两个字节,共8次
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
联系一下数组的思维,也就是[bx(si或di)+idata]的方式,来使程序变的简洁。
修改后的代码:
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,0 ;源地址是0
mov di,16 ;目标地址是16
mov cx,8 ;一次传输两个字节,共8次
s:mov ax,[si+0]
mov [si+16],ax
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
采用数组的思维后,就可以只使用一个寄存器就够了,而且每次循环少一次add。
在说明下,这里是用的是SI寄存器,也可以换成BX和DI寄存器都是有一样的