问题:SI和DI寄存器的使用

题目:

用寄存器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寄存器都是有一样的

你可能感兴趣的:(问题:SI和DI寄存器的使用)