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