99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Assembly 數(shù)組詳解

2018-10-29 12:00 更新

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


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

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

3、這個(gè)元素的下標(biāo)


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


定義數(shù)組

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

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

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

定義數(shù)組

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

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

堆棧數(shù)組排列

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

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

array1      db      5, 4, 3, 2, 1         ; 字節(jié)數(shù)組
array2      dw     5, 4, 3, 2, 1          ; 字?jǐn)?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行,引用了字?jǐn)?shù)組中的元素1,而不是元素2。為什么?因?yàn)樽质莾蓚€(gè)字節(jié)的單元,所以移動(dòng)到字?jǐn)?shù)組的下一元素,你必須向前移動(dòng)兩個(gè)字節(jié),而不是一個(gè)。第7行將從第一個(gè)元素中讀取一個(gè)字節(jié)再從第二個(gè)元素中讀取一個(gè)字節(jié)。在C中,編譯器會(huì)根據(jù)一個(gè)指針的類型來決定使用指針運(yùn)算的表達(dá)式需移動(dòng)多少字節(jié),而程序員就不需要管這些了。然而,在匯編語言中,當(dāng)需要從一個(gè)元素移動(dòng)到另一個(gè)元素時(shí),它取決于程序員認(rèn)為的數(shù)組元素的大小。

元素求和

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

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

數(shù)組中的元素



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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)