您的位置:首页 > 其它

不同的寻址方式灵活运用(di,si)

2014-07-15 10:33 411 查看
si和di是8086cpu中和必须功能最相近的寄存器,si和di不能给凤城二个8位寄存器来使用。下面3组指令实现了相同的功能。

1: 

mov bx,0

mov ax,[bx]   ;ax=16*ds+bx

2:

mov si,0

mov ax,[si]    ;ax=16*ds+si

3:

mov di,0

mov ax,[di] ;ax=16*ds+di

4:

mov bx,0

mov ax,[bx+123] ;ax=(16*ds)+(bx+123)

5:

mov s1,0

mov ax,[si+123] ;ax=(16*ds)+(si+123)

6:

mov di,0
mov ax,[di+123] ;ax=(16*ds)+(di+123)

;将'welcome to masm!'复制到后面的数据中
assume cs:code,ds:data
data segment
db 'welcome to masm!' ;16字节
data ends

code segment
start:

mov ax,data
mov ds,ax
mov	si,0
mov di,16

s:
mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s

mov ax,4c00H
int 21H
code ends

end start
;16位寄存器最多复制2个字节,一共复制8次


用更少的代码实现

;将'welcome to masm!'复制到后面的数据中
assume cs:code,ds:data
data segment
db 'welcome to masm!' ;16字节
data ends

code segment
start:

mov ax,data
mov ds,ax
mov	si,0

s:
mov ax,0[si]
mov 16[si],ax
add si,2
loop s

mov ax,4c00H
int 21H
code ends

end start


不同的寻址方式灵活运用

[bx+si]和[bx+di]

mov ax,[bx+si]  ;ax=(16*ds)+(bx+si)  ;moc ax,[bx][si]

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

[idata]用常量来表示地址,可以用于直接定位一个内存单元

[bx]用一个变量来表示内存地址,可以间接定位一个内存单元

[bx+idata]用于一个变量和常量表示地址,可以在一个初始地址的基础上用变量间接定位一个内存单元

[bx+si]用于二个变量表示地址

[bx+si+idata]用于二个变量和一个常量表示地址

;将datags段中每个单词的头字母改为大写字母
assume cs:code,ds:data
data segment
db '1. file         ' ;16字节
db '2. edit         ' ;
db '3. search       ' ;
db '4. view         ' ;
db '5. options      ' ;
db '6. help         ' ;
data ends

code segment
start:

mov ax,data
mov ds,ax
mov	si,0

s:
mov ax,3[si]
and ax,11011111b
mov 3[si],ax
add si,16
loop s

mov ax,4c00H
int 21H
code ends

end start
将datasg段每个单词改成大写字母
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm             '
db 'dec             '
db 'doc             '
db 'vax             '
datasg ends

stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
start:
mov ax,stacksg
mov ss,ax				;指定初始栈地址
mov sp,16				;指定栈大小
mov ax,datasg
mov ds,ax				;指定内存指向地址
mov bx,0				;指定内存偏移量
mov cx,4
s0:
push cx					;外循环压栈
mov si,0
mov cx,3
s:
mov al,[bx+si]			;内循环si内存偏移计数,bx外循环偏移量计算
and al,1101111b
mov [bx+si],al
inc si					;si+
loop s

and bx,16				;bx+16
pop cx					;cx弹出
loop s0

codesg ends
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: