7.7 SI和DI
si和di是8086CPU中和bx相似的16位寄存器,但是si和di不能分成两个8位的寄存器。
问题7.2
"welcome wo masm!"从偏移地址0开始存放长度为16个字节,所以,它后面的数据区的偏移地址为16,就是字符串所要存放的空间
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0 ;si指向第一个字符串
mov di,16 ;di指向目的数据区
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
注意,在程序中,用16位的寄存器进行内存单元之间的数据传送,每次复制2个字节,一共循环8次。
问题7.3
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0 ;si指向第一个字符串
mov cx,8
s:mov ax,[si]
mov [16+si],ax
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
7.8 [bx+si]和[bx+di]
我们可以用[bx+si]/[bx+di]这样的方式来指明一个内存单元。
[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si) (即bx中的数值加上si中的数值)
mov ax,[bx+si]的含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(一个字单元),存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。
指令mov ax,[bx+si]的数学化的描述为:(ax=(ds)*16+(bx)+(si))
该指令也可以写成如下格式:
mov ax,[bx][si]
问题7.4
7.9 [bx+si+idata]和[bx+di+idata]
[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata (即bx中的数值加上si中的数值再加上idata)
mov ax,[bx+si+idata]的含义:
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(一个字单元),存放一个字,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。
指令mov ax,[bx+si]的数学化的描述为:(ax=(ds)*16+(bx)+(si)+idata)
该指令也可以写成如下格式:(以idata=200举例)
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
问题7.5