匯編語言之尋址方式

1、內(nèi)存單元和[bx]的描述

要完整地描述一個內(nèi)存單元,需要兩種信息:1.內(nèi)存單元的地址;2.內(nèi)存單元的長度(即是字節(jié)單元還是字單元)。

如:mov ax, [2a78]

表示將一個內(nèi)存單元中的數(shù)據(jù)送入ax,這個內(nèi)存單元的長度為2字節(jié)(字單元),存放一個字,偏移地址為2a78H,段地址

在DS中。

如:mov al, [10f3]

表示將一個內(nèi)存單元中的數(shù)據(jù)送入al,這個內(nèi)存單元的長度為1字節(jié)(字節(jié)單元),存放一個字節(jié),偏移地址為10f3H,段

地址在DS中。

一個內(nèi)存單元,段地址默認(rèn)在DS中,偏移地址可以直接給出,單元的長度可以由具體指令中的其它操作對象(比如說寄存

器)指出。

上面兩條指令中,內(nèi)存單元[2a78]和[10f3],它們的偏移地址分別是2a78H和10f3H,第一條指令中,ax為16位寄存器,

這意味著[2a78]是字單元;第二條指令,al為8位寄存器,這意味著[10f3]是字節(jié)單元(8位相當(dāng)于單字節(jié),16位相當(dāng)于雙字

節(jié))。

再看下面兩條指令:

Mov ax, [bx]    mov al, [bx]

[bx]同樣也表示一個內(nèi)存單元,它的偏移地址就是bx的數(shù)值。

2、[bx+idata]

請看下面的指令:

Mov ax, [127a]    mov ax, [30e0]    mov ax, [c950]

指令中的127a、30e0、c950都是常量,我們可以用idata來表示:mov ax, [idata]。

再看下面的指令:

Mov bx, 123aH   mov bx, 8762H    mov bx, 4c0eH

指令中的123aH、8762H、4c0eH都是常量,我們可以用idata來表示:mov bx, idata。

Idata是常量的代表。


在上一節(jié)中,我們用[idata]和[bx]的方式來指明一個內(nèi)存單元,還可以用一種更為靈活的方式來指明內(nèi)存單元:[bx+idata],

它的偏移地址為bx中的數(shù)值加上idata。

我們看一下指令mov ax, [bx+200]的含義。將內(nèi)存單元[bx+200]中的數(shù)據(jù)送入ax,長度為2個字節(jié)(字單元),偏移地址

為bx中的數(shù)值加上200,段地址在DS中。

該指令也可以寫成如下常用格式:

Mov ax, [200+bx]    mov ax, 200[bx]    mov ax, [bx].200

3、SI和DI

SI是源變址寄存器,DI是目的變址寄存器,它們的功能與BX相近,但它們不能分成兩個8位寄存器。

指令:mov bx, 13b2H

      Mov ax, [bx]    ;把內(nèi)存單元[13b2]中的數(shù)據(jù)送入ax。

同樣地,可以:mov si, 13b2H

              Mov ax, [si]    ;把內(nèi)存單元[13b2]中的數(shù)據(jù)送入ax。

也可以:mov di, 13b2H

        Mov ax, [di]    ;把內(nèi)存單元[13b2]中的數(shù)據(jù)送入ax。

指令:mov bx, 2a7cH

      Mov ax, [bx+123]    ;把內(nèi)存單元[2a7c+123]中的數(shù)據(jù)送入ax。

同樣地,可以:mov si, 2a7cH

              Mov ax, [si+123]    ;把內(nèi)存單元[2a7c+123]中的數(shù)據(jù)送入ax。

也可以:mov di, 2a7cH

        Mov ax, [di+123]    ;把內(nèi)存單元[2a7c+123]中的數(shù)據(jù)送入ax。

4.1節(jié)我們用[bx]的方式來指明一個內(nèi)存單元,同樣地我們可以用[si]或[di]的方式來指明一個內(nèi)存單元,它們的含義基本相同。

4.2節(jié)我們用[bx+idata]的方式來指明一個內(nèi)存單元,同樣地我們可以用[si+idata]或[di+idata]的方式來指明一個內(nèi)存單元,它

們的含義基本相同。

4、[bx+si]和[bx+di]

本節(jié)我們學(xué)習(xí)比前面幾節(jié)講解的更為靈活的指明一個內(nèi)存單元的方式:[bx+si]和[bx+di]。

[bx+si]和[bx+di]的含義相似,我們以[bx+si]為例進(jìn)行講解。

[bx+si]表示一個內(nèi)存單元,它的偏移地址為bx的數(shù)值加上si的數(shù)值。

指令mov ax, [bx+si]的含義如下:

將一個內(nèi)存單元[bx+si]中的數(shù)據(jù)送入ax,這個內(nèi)存單元的長度為2字節(jié)(字單元),存放一個字,偏移地址為bx的數(shù)值加上

Si的數(shù)值,段地址在DS中。

    該指令也可以寫成如下常用格式:mov ax, [bx][si]

5、[bx+si+idata]和[bx+di+idata]


本節(jié)講解一種最為靈活的指明一個內(nèi)存單元的方式:[bx+si+idata]和[bx+di+idata]。

[bx+si+idata]和[bx+di+idata]的含義相似,我們以[bx+si+idata]為例進(jìn)行講解。

[bx+si+idata]表示一個內(nèi)存單元,它的偏移地址為bx的數(shù)值加上si的數(shù)值再加上idata的和。

指令mov ax, [bx+si+200]的含義如下:

將一個內(nèi)存單元[bx+si+200]中的數(shù)據(jù)送入ax,這個內(nèi)存單元的長度為2字節(jié)(字單元),存放一個字,偏移地址為bx的

數(shù)值加上si的數(shù)值再加上200的和,段地址在DS中。

該指令也可以寫成如下常用格式:

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

 

6、尋址方式的含義

前面我們學(xué)習(xí)了幾種定位內(nèi)存地址的方法,現(xiàn)在總結(jié)一下:

1.[idata]用一個常量來表示地址,可用于直接定位一個內(nèi)存單元。

2.[bx]用一個變量來表示內(nèi)存地址,可用于間接定位一個內(nèi)存單元。

3.[bx+idata]用一個變量和常量表示地址,可在一個起始地址的基礎(chǔ)上用變量間接定位一個內(nèi)存單元。

4.[bx+si]用兩個變量表示地址。

5.[bx+si+idata]用兩個變量和一個常量表示地址。

可以看到,從[idata]一直到[bx+si+idata],我們可以用更加靈活的方式來定位一個內(nèi)存單元的地址。以上這幾種定位內(nèi)存地

址的方法就稱作尋址方式。


 

 






作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)