3.3 數(shù)據(jù)格式
1、Intel用術(shù)語字表示16位數(shù)據(jù)類型距辆,稱32位為雙字步藕,64位為4字。
2挑格、C語言中每種數(shù)據(jù)類型都有自己的Intel數(shù)據(jù)類型(字),并且有指定的匯編代碼后綴沾歪,[char:b, short:w, int:l, long:q, char*:q, float:s, double:l]漂彤。
3、GCC生成的匯編代碼指令都有一個字符后綴表明操作數(shù)的大小灾搏。例如movb表示傳送字節(jié)挫望,movw傳送字,movl傳送雙字狂窑,movq傳送四字媳板。
一個x86-64的cpu有16個64位的通用目的寄存器,這些寄存器用來存儲整數(shù)數(shù)據(jù)和指針泉哈。生成1蛉幸、2字節(jié)的指令會保持高位字節(jié)不變,生成4個字節(jié)的指令會把高位字節(jié)置0丛晦。
3.4.1奕纫、操作數(shù)指示符
1、大多數(shù)指令有一個或多個操作數(shù)烫沙,指示一個操作中使用的源數(shù)據(jù)值和放置結(jié)果的目標(biāo)位置匹层。源數(shù)據(jù)值可以是常數(shù)、內(nèi)存或寄存器中的值锌蓄,目標(biāo)位置可以是內(nèi)存或寄存器升筏。因此操作數(shù)可分為三種:立即數(shù)表示常數(shù)值撑柔,格式是$+整數(shù),如$58您访、$0x1F铅忿;寄存器,表示某個寄存器的內(nèi)容洋只,R[ra]寄存器集合的a寄存器辆沦;內(nèi)存引用,根據(jù)計(jì)算出來的地址訪問內(nèi)存位置识虚,Mb[addr]從addr開始的第b個字節(jié)肢扯。
2、尋址方式
3.4.2担锤、數(shù)據(jù)傳送指令
1蔚晨、MOV,把數(shù)據(jù)從源位置復(fù)制到目的位置肛循,不做任何變化铭腕。
2、分為movb多糠、movw累舷、movl、movq夹孔,分別對應(yīng)1被盈、2、4搭伤、8個字節(jié)只怎。
3、源操作數(shù)可以是一個立即數(shù)怜俐、寄存器或內(nèi)存中的值身堡,目的操作數(shù)只能是寄存器或內(nèi)存,并且源和目的不能同時是內(nèi)存拍鲤,寄存器操作數(shù)部分的大小必須和bwlq匹配贴谎。movl以寄存器作為目的時,會把寄存器高位4字節(jié)設(shè)置為0季稳。movabsq能以任意64位立即數(shù)作為源操作數(shù)赴精,并且只能以寄存器作為目的。
4绞幌、movz和movs是把小字節(jié)的源復(fù)制到大字節(jié)目的時使用的指令蕾哟,movz使用零擴(kuò)展,movs使用符號擴(kuò)展。
3.4.3 數(shù)據(jù)傳送示例
1谭确、參數(shù)是通過寄存器傳遞給函數(shù)的帘营。因?yàn)閤p是指針類型,所以xp的值需要用(%rdi)去內(nèi)存中取逐哈。
3.4.4 壓入和彈出數(shù)據(jù)
1芬迄、pushq壓入四字,popq彈出四字昂秃。
2禀梳、棧向下增長,棧頂元素地址是所有棧中元素地址最低的肠骆。
3算途、壓一個四字入棧,首先要把棧頂指針減8蚀腿,然后將值寫到新的棧頂?shù)刂贰?/p>