Assembly 數(shù)組詳解

2018-10-29 12:00 更新

一組數(shù)組是內(nèi)存中的一個連續(xù)數(shù)據(jù)列表塊。在這個列表中的每個元素必須是同一種類型而且使用恰好同樣大小的內(nèi)存字節(jié)來儲存。因為這些特性,數(shù)組允許通過數(shù)據(jù)在數(shù)組里的位置(或下標)來對它進行有效的訪問。如果知道了下面三個細節(jié),任何元素的地址都可以計算出來:


1、數(shù)組第一個元素的地址

2、每個元素的字節(jié)數(shù)

3、這個元素的下標


0(正如在C中)作為數(shù)組的第一個元素的下標是非常方便的。使用其它值作為第一個下標也是可能的,但是這將把計算弄得很復雜。


定義數(shù)組

在data和bss段中定義數(shù)組

在data段定義一個初始化了的數(shù)組,可以使用標準的db,dw,等等指示符。NASM同樣提供了一個有用的指示符,稱為TIMES ,它可以用來反復重復一條語句,而不需要你手動來復制它。圖5.1展示關于這些的幾個例子。

在bss段定義一個示初始化的數(shù)組,可以使用resb,resw,等等指示符。記住,這些指示符包含一個指定保留多少個內(nèi)存單元的操作數(shù)。圖5.1同樣展示了關于這種類型定義的幾個例子。

定義數(shù)組

以局部變量的方式在堆棧上定義數(shù)組

在堆棧上定義一個局部數(shù)組變量沒有直接的方法。像以前一樣,你可以首先計算出所有局部變量需要的全部字節(jié),包括數(shù)組,然后再用ESP減去這個數(shù)值(或者直接使用ENTER指令)。例如,如果一個函數(shù)需要一個字符變量,兩個雙字整形和一個包含50個元素的字數(shù)組,你將需要1+2+4+50X2 = 109個字節(jié)。但是,為了保持ESP在雙字的邊界上,被ESP減的數(shù)值必須是4的倍數(shù)(這個例子中是112。)圖5.2展示了兩種可能的方法。第一種排序的未使用部分用來保持雙字在雙字邊界上,這樣可以加速內(nèi)存的訪問。

堆棧數(shù)組排列

訪問數(shù)組中的元素

跟C不同的是,在匯編語言中沒有[ ]運算符。要訪問數(shù)組中的一個元素,必須將它的地址計算出來??紤]下面兩個數(shù)組的定義:

array1      db      5, 4, 3, 2, 1         ; 字節(jié)數(shù)組
array2      dw     5, 4, 3, 2, 1          ; 字數(shù)組

下面是使用這些數(shù)組的例子:

1           mov     al, [array1]             ; al = array1[0]
2           mov     al, [array1 + 1]        ; al = array1[1]
3           mov [array1 + 3], al            ; array1[3] = al
4           mov ax, [array2]                 ; ax = array2[0]
5           mov ax, [array2 + 2]            ; ax = array2[1] (不是array2[2]!)
6           mov [array2 + 6], ax            ; array2[3] = ax
7           mov ax, [array2 + 1]            ; ax = ??

在第5行,引用了字數(shù)組中的元素1,而不是元素2。為什么?因為字是兩個字節(jié)的單元,所以移動到字數(shù)組的下一元素,你必須向前移動兩個字節(jié),而不是一個。第7行將從第一個元素中讀取一個字節(jié)再從第二個元素中讀取一個字節(jié)。在C中,編譯器會根據(jù)一個指針的類型來決定使用指針運算的表達式需移動多少字節(jié),而程序員就不需要管這些了。然而,在匯編語言中,當需要從一個元素移動到另一個元素時,它取決于程序員認為的數(shù)組元素的大小。

元素求和

圖5.3展示了一個代碼片段:對前面樣例代碼中的數(shù)組array1中的元素進行了求和。第7行,AX與DX相加。為什么不是AL?首先,ADD指令的兩個操作數(shù)必須為同樣的大小。其次,這樣做對于對字節(jié)求和后得到一個太大以致不能匹配一個字節(jié)的總數(shù)是非常容易的。通過使用DX,達到65,535的總數(shù)是允許。然而,認識到AH同樣被相加了是非常重要的。這
就是第3行為什么AH被置為0的緣故了。1

圖5.4和圖5.5展示了兩種可以替換的方法來計算總數(shù)。斜體字的行替換了圖5.3中的第6行和第7行。

數(shù)組中的元素



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號