匯編語言之尋址方式
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)階人工智能(鏈接)