引言
上一章我們已經(jīng)著重討論了數(shù)據(jù)傳送(或者說(shuō)復(fù)制)指令,相信各位猿友現(xiàn)在都已經(jīng)對(duì)此有一些了解了。說(shuō)真的,LZ在看第三章的過(guò)程中,不斷的被匯編的魅力深深的震撼,這些看似簡(jiǎn)單的匯編指令,卻可以將復(fù)雜的程序井然有序的執(zhí)行完畢,實(shí)在是讓人驚嘆。時(shí)至今日,這本看似枯燥無(wú)比卻實(shí)則魅力十足的書,已經(jīng)深深的將LZ吸引了。
希望各位猿友也有這樣的感覺(jué),這是一種非常好的感覺(jué),接下來(lái),各位就一起和LZ來(lái)認(rèn)識(shí)認(rèn)識(shí)新的指令吧。
算術(shù)與邏輯運(yùn)算指令
算術(shù)與邏輯運(yùn)算包括很多種,估計(jì)各位猿友也能很快的想出來(lái),比如最常見(jiàn)的加減乘除、與或非、左移右移等等。這里可能還有一個(gè)各位猿友不太容易想到的,就是取地址運(yùn)算符,不過(guò)這個(gè)運(yùn)算指令卻是LZ看過(guò)這一部分之后,覺(jué)得最精妙的一個(gè)指令。
這里面比較特別的指令就是leal(取地址指令),其余的指令都是比較常規(guī)的算術(shù)和邏輯運(yùn)算,相比之下還比較好理解,因此LZ這里重點(diǎn)介紹leal指令,對(duì)于其余的指令LZ不會(huì)一一介紹,接下來(lái)我們就認(rèn)識(shí)一下這個(gè)特別的leal指令吧。
leal指令
leal指令是非常神奇的一個(gè)指令,它可以取一個(gè)存儲(chǔ)器操作數(shù)的地址,并且將其賦給目的操作數(shù)。如果用C語(yǔ)言當(dāng)中來(lái)對(duì)應(yīng)的話,它就相當(dāng)于&運(yùn)算。
比如對(duì)于leal 4(%edx,%edx,4),%eax這條指令來(lái)講,我們假設(shè)%edx寄存器的值為x的話,那么這條指令的作用就是將 4 + x + 4x = 5x + 4賦給%eax寄存器。它和mov指令的區(qū)別就在于,假設(shè)是movl 4(%edx,%edx,4),%eax這個(gè)指令,它的作用是將內(nèi)存地址為5x+4的內(nèi)存區(qū)域的值賦給%eax寄存器,而leal指令只是將5x+4這個(gè)地址賦給目的操作數(shù)%eax而已,它并不對(duì)存儲(chǔ)器進(jìn)行引用的值的計(jì)算。