ARM匯編指令:.align理解和用法
對(duì)齊偽指令A(yù)LIGN
對(duì)齊偽指令格式:
ALIGN Num
其中:Num必須是2的冪,如:2、4、8和16等。
偽指令的作用是:告訴匯編程序,本偽指令下面的內(nèi)存變量必須從下一個(gè)能被Num整除的地址開(kāi)始分配。
如果下一個(gè)地址正好能被Num整除,那么,該偽指令不起作用,否則,匯編程序?qū)⒖粘鋈舾蓚€(gè)字節(jié),直到下一個(gè)地址能被Num整除為止。
先看以下代碼:
str1:
str:
reset:
這段代碼在編譯時(shí)不會(huì)出現(xiàn)任何問(wèn)題,但是實(shí)際在執(zhí)行中并不會(huì)按照預(yù)定的要求執(zhí)行;
編譯鏈接后,通過(guò)反匯編如下:
30008000:
30008004:
30008008:
3000800c:
30008010:
30008014:
30008018:
3000801c
3000801c:
30008020
30008020:
30008024:
30008026
30008026:
3000802a:
3000802c:
30008030:
通過(guò)反匯編我們可以看出,前面所有的指令都是4的倍數(shù),而在reset這個(gè)地址處的指令卻不是4的倍數(shù),我們知道ARM是32位處理器,如果在ARM指令狀態(tài)下,所有指令的執(zhí)行都是按照4的倍數(shù)進(jìn)行執(zhí)行的,而到reset這個(gè)地址處時(shí),發(fā)現(xiàn)地址為30008026不是4的倍數(shù),于是就自動(dòng)歸到30008024處執(zhí)行,當(dāng)然會(huì)出錯(cuò)了。
在指令出現(xiàn)非對(duì)齊情況下,可以在下面插入.align偽指令,如下:
str1:
str:
reset:
通過(guò)編譯后反匯編如下:
30008000:
30008004:
30008008:
3000800c:
30008010:
30008014:
30008018:
3000801c
3000801c:
30008020
30008020:
30008024:
30008028
30008028:
3000802c:
30008030:
加上.align匯編語(yǔ)句后,指令就對(duì)齊!
.align $
評(píng)論