汇编语言基本概念(续6)
前面已经讲述了几种不同的寻址方式,这些寻址方式总结出来,就在于偏移地址的表示方式,偏移地址可以用常量也可以用变量,或者常量加上变量。这些方式都是可以接收的。另外8086CPU还设置了两个独立的寄存器SI,DI用来辅助BX,这两个寄存器都是16位的,因此,不能分成两个8位,同时书写方式也同前面所述的一样,可以灵活如下:
D:\Temp\NPP593~1.BIN\tmp>debug
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1400 ES=1400 SS=1400 CS=1400 IP=0100 NV UP EI PL NZ NA PO NC
1400:0100 0000 ADD [BX+SI],AL DS:0000=CD
-d 2000:1000 BE 00 06 00 00 00
^ Error
-e 2000:1000 BE 00 06 00 00 00
-d 2000:1000
2000:1000 BE 00 06 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2000:1070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-a
1400:0100 mov ax,2000
1400:0103 mov ds,ax
1400:0105 mov bx,1000
1400:0108 mov si,0
1400:010B mov ax,[bx+si]
1400:010D inc si
1400:010E mov cx,[bx+si]
1400:0110 inc si
1400:0111 mov di,si
1400:0113 add cx,[bx+di]
1400:0115
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1400 ES=1400 SS=1400 CS=1400 IP=0103 NV UP EI PL NZ NA PO NC
1400:0103 8ED8 MOV DS,AX
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=0105 NV UP EI PL NZ NA PO NC
1400:0105 BB0010 MOV BX,1000
-t
AX=2000 BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=0108 NV UP EI PL NZ NA PO NC
1400:0108 BE0000 MOV SI,0000
-t
AX=2000 BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=010B NV UP EI PL NZ NA PO NC
1400:010B 8B00 MOV AX,[BX+SI] DS:1000=00BE
-t
AX=00BE BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=010D NV UP EI PL NZ NA PO NC
1400:010D 46 INC SI
-t
AX=00BE BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0001 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=010E NV UP EI PL NZ NA PO NC
1400:010E 8B08 MOV CX,[BX+SI] DS:1001=0600
-t
AX=00BE BX=1000 CX=0600 DX=0000 SP=FFEE BP=0000 SI=0001 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=0110 NV UP EI PL NZ NA PO NC
1400:0110 46 INC SI
-t
AX=00BE BX=1000 CX=0600 DX=0000 SP=FFEE BP=0000 SI=0002 DI=0000
DS=2000 ES=1400 SS=1400 CS=1400 IP=0111 NV UP EI PL NZ NA PO NC
1400:0111 89F7 MOV DI,SI
-t
AX=00BE BX=1000 CX=0600 DX=0000 SP=FFEE BP=0000 SI=0002 DI=0002
DS=2000 ES=1400 SS=1400 CS=1400 IP=0113 NV UP EI PL NZ NA PO NC
1400:0113 0309 ADD CX,[BX+DI] DS:1002=0006
-t
AX=00BE BX=1000 CX=0606 DX=0000 SP=FFEE BP=0000 SI=0002 DI=0002
DS=2000 ES=1400 SS=1400 CS=1400 IP=0115 NV UP EI PL NZ NA PE NC
1400:0115 0000 ADD [BX+SI],AL DS:1002=06
-
总结一下前面所述的寻址方式如下:
【1】[idata]用一个常量来表示地址,可以直接定义一个内存单元,在MASM中用ds:[20],段前缀
【2】[bx]用一个变量来表示内存地址,可以间接定义一个内存单元,这里除了bx之外还可以si,di
【3】[bx+idata]用一个变量加上常量来表示内存地址,可在一个起始地址的基础上用变量间接定位一个内存单元,常用的写法有idata[bx]或[idata+bx]及[bx].idata
【4】[bx+si]用两个变量来表示地址
【5】[bx+si+idata]用两个变量加一个常量来表示地址,其写法同第三个一样也有三种。
D:\Temp\NPP593~1.BIN\tmp>debug
-e 2000
补充:软件开发 , 其他 ,