2013-10-26 161 views
5

我正在參加這個課程,並且我非常努力地理解指令.align的概念。瞭解裝配MIPS .ALIGN和內存尋址

下面是一個例子,這是我無法理解:

enter image description here

我知道數據段裏面,有地址,從0x10010000,0x10010020等。

而且我知道,每個地址裏面有8個存儲區,每個存儲區有32位。

現在,我不明白的是,如何以及爲什麼var2裏面的地址是0x10010010? str1位於地址0x10010003之內,因爲我們爲var1保留了3位。

最後一件事是,指令.align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used究竟是對齊3`還是以上,但我真的不明白。

對不起,如果這是非常混亂的傢伙,我有點絕望在這裏。

回答

9

對齊對於MIPS處理器來說很重要,它只喜歡從數據大小倍數的地址讀取內存中的多字節值。

.ASCIIZ字段可以放在任何地方,因爲一次只讀取一個字節的字符串。所以把它放在0x10010003沒問題。

.WORD字段必須對齊到4的倍數。所以它不能放在字符串後面的下一個可用位置0x1001000E。彙編程序故意移動該值並留下兩個未使用的字節。到下一個地址是4的倍數0x10010010。

.ALIGN指令是覆蓋默認對齊規則的一種方法。指令之後的下一個字段將與n的冪對齊爲2的倍數,其中n是.ALIGN值。在你的情況下,pow(2,3)= 8字節。

這就是你看到的情況,沒有.ALIGN指令,.HALF字段將被存儲在0x10010014。不是8的倍數,因此它被移動到0x10010018。

這個例子是人造的,沒有明顯的理由在這裏使用.ALIGN指令,因爲.HALF只需要對齊到2的倍數,因此將它存儲在0x10010014就可以。

+1

正在打電話給我的答案,而沒有...你的本來就不需要另一個。 – gnometorule

+0

謝謝大家的回答!問題:0x10010010是4的倍數? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4,這是4的倍數。如果計算對您沒有意義,請再次閱讀十六進制數字。 – gnometorule

3

某些彙編指令意味着數據存儲對齊,這意味着從兩個的的地址開始。回想一下第一幾個公約在MIPS:

(1)一個 「字」 是4個字節(有時你會看到它定義爲2個字節),

(2)一個半字(.half)是2-字節和

(3).asciiz null終止字符串(如在C中)。

使用這個,你已經解釋瞭如何存儲var1和str1。爲什麼var2之前有兩個空字節的緩衝區?因爲它被聲明爲一個.word,並且(通過上面的(1))將被存儲在從4的倍數開始的內存位置。如果你聲明瞭一個.half,那麼str1之間不會有2個空字節和var2。

var2被聲明爲一個.half - 它是一個16位(2字節)地址,它適合一個。但是,在聲明它之前,對齊更改爲3.現在,檢查第一句話:這是您提高2的電源;所以我們實際上對齊到8.這意味着,直到被覆蓋之前,變量將被放置爲聲明,但是另外它們的初始存儲位置必須是8的倍數。因此,彙編程序插入4個空字節來將var3存儲爲8的倍數。