匯編語言--變量及數(shù)值操作

在高級(jí)語言中倔丈,變量和數(shù)值操作是很基本的語法喻鳄,基本所有語言都有扼倘,但是其在匯編級(jí)別上是怎么實(shí)現(xiàn)的?或者拓展了說除呵,在計(jì)算機(jī)上再菊,變量和數(shù)值操作的實(shí)現(xiàn)邏輯是怎樣的?

主要內(nèi)容

  • 匯編與機(jī)器碼
    首先竿奏,我們要知道袄简,在計(jì)算機(jī)架構(gòu)中腥放,最重要的兩層抽象是指令集和虛擬內(nèi)存泛啸。前者是所有計(jì)算機(jī)程序的最小邏輯單元,即所有的計(jì)算機(jī)程序秃症,都會(huì)被轉(zhuǎn)換為一連串的計(jì)算機(jī)指令并運(yùn)行候址。而虛擬內(nèi)存則是計(jì)算機(jī)對程序可訪問內(nèi)存的一層抽象,因?yàn)檫@層抽象存在种柑,每一個(gè)運(yùn)行在計(jì)算機(jī)上的程序可以認(rèn)為內(nèi)存是一個(gè)只有自己和OS在使用超級(jí)大的字節(jié)數(shù)據(jù)岗仑。

    而計(jì)算機(jī)上存儲(chǔ)、使用的數(shù)據(jù)都是二進(jìn)制數(shù)(機(jī)器碼)的形式聚请,因此荠雕,所有的計(jì)算機(jī)指令都會(huì)被轉(zhuǎn)換為對應(yīng)的二進(jìn)制數(shù),計(jì)算機(jī)最終會(huì)根據(jù)這些不同的二進(jìn)制數(shù)執(zhí)行相應(yīng)的計(jì)算機(jī)指令驶赏。但是二進(jìn)制數(shù)是機(jī)器的語言炸卑,如果我們要直接使用二進(jìn)制數(shù)進(jìn)行編程,先不提各個(gè)機(jī)器上的相同指令對應(yīng)機(jī)器碼之間的差異性和代碼的可讀性問題煤傍,記憶各個(gè)指令對應(yīng)的二進(jìn)制數(shù)無疑是困難的盖文。而如果我們設(shè)計(jì)一種人類可以很容易理解、記憶的語言蚯姆,它與計(jì)算機(jī)指令有一一對應(yīng)的關(guān)系五续,而我們只要再創(chuàng)建一個(gè)計(jì)算機(jī)指令編譯器,將這種新語言轉(zhuǎn)換對應(yīng)的機(jī)器碼龄恋,即解決了上述提到的各個(gè)問題疙驾。

    而匯編語言就是上面說的“新語言”,它只是對各個(gè)計(jì)算機(jī)指令二進(jìn)制數(shù)的簡單字符抽象郭毕,匯編語言的格式與編譯器最終轉(zhuǎn)換為的二進(jìn)制數(shù)形式數(shù)據(jù)并沒太大區(qū)別荆萤。下面是一個(gè)簡單的代碼實(shí)例:
    【待補(bǔ)充】

  • 數(shù)據(jù)類型
    在計(jì)算機(jī)上沒有常規(guī)意義的數(shù)據(jù)類型的概念,即沒有Integer,String類型之分链韭。在 匯編語言中偏竟,只存在不同長度的二進(jìn)制數(shù),但是使用二進(jìn)制數(shù)時(shí)敞峭,指令參數(shù)只有以下三種:

    1. 標(biāo)量踊谋,例如$1$22旋讹,當(dāng)它出現(xiàn)在指令參數(shù)時(shí)殖蚕,參數(shù)的值就是其對應(yīng)的二進(jìn)制數(shù),$符號(hào)只是在匯編的寫法習(xí)慣沉迹,在實(shí)際的二進(jìn)制代碼中并不存在$前綴睦疫。
    2. 寄存器,例如%rax鞭呕,%rsi蛤育,當(dāng)它出現(xiàn)在指令參數(shù)時(shí),表示的值為存儲(chǔ)在寄存器中的二進(jìn)制數(shù)葫松。和上面的標(biāo)量表示一樣瓦糕,匯編的寫法上一般會(huì)在寄存器名前加上%做為標(biāo)識(shí)。使用寄存器作為參數(shù)時(shí)腋么,需要注意咕娄,當(dāng)指令要操作不同長度的二進(jìn)制數(shù)時(shí),我們要使用對應(yīng)長度的寄存器名珊擂。例如圣勒,寄存器%rax的64位、32位摧扇、16位和8位的名稱分別為%rax圣贸,%eax%ax扳剿,%al旁趟,那么當(dāng)計(jì)算機(jī)指令操作16位數(shù)據(jù)時(shí),需要用%ax標(biāo)識(shí)該寄存器庇绽,8位則使用%al锡搜,需要與指令類型嚴(yán)格一致。
    圖片來自《深入理解計(jì)算機(jī)系統(tǒng)》
    1. 內(nèi)存數(shù)據(jù)瞧掺,例如0x100耕餐,(%rdi),當(dāng)指令參數(shù)沒有$|%前綴時(shí)辟狈,那么他就表示的是存放在內(nèi)存某個(gè)位置的二進(jìn)制數(shù)肠缔。這個(gè)時(shí)候夏跷,該二進(jìn)制數(shù)的長度只取決于指令類型。 ()表示的是一種特殊的內(nèi)存地址計(jì)算規(guī)則明未,計(jì)算規(guī)則為:
      匯編語言內(nèi)存計(jì)算.PNG
      例如槽华,100(, %rdi, 2),其中%rdi的值為0x1趟妥,則最終結(jié)果為100 + 1 * 2 = 102猫态,即內(nèi)存地址為102。
  • 訪問數(shù)據(jù)(未完)

  • 算術(shù)邏輯操作

思考:

  • 在匯編語言中披摄,如何表示高級(jí)語言中的變量亲雪?
    在高級(jí)語言中,變量往往就代表著程序的操作對象疚膊,可以作為計(jì)算結(jié)果的存儲(chǔ)地點(diǎn)义辕、程序的操作對象,甚至可以表示一段程序的執(zhí)行過程寓盗。但是對于匯編語言來說灌砖,不管是可操作的數(shù)據(jù),還是計(jì)算機(jī)指令本身贞让,都只是一連串的二進(jìn)制數(shù)周崭,這些二進(jìn)制數(shù)的具體含義柳譬,僅依賴于其在匯編程序中的上下文(指令類型及參數(shù)位置)喳张。
    但是在匯編語言中并不存在變量的概念,匯編語言的操作對象是各個(gè)寄存器和內(nèi)存數(shù)據(jù)美澳,那么匯編語言是怎么表示高級(jí)語言中變量的語義的呢销部?
    我們先看一段代碼,對于C語言函數(shù):
    void concat_char(char a, char b, char *dest){
      dest[0] = a;
      dest[1] = b;
    }
    
    其轉(zhuǎn)換的匯編語言可能是這樣的:
    concat_char:
      movb  %dil, (%rdx)          %dil表示第一個(gè)參數(shù)所在的寄存器制跟,%rdx表示第三個(gè)參數(shù)所在寄存器地址舅桩,由于第三個(gè)參數(shù)是指針,因此需要加上()表示取其指向的內(nèi)存地址
      movb  %sil, (%rdx, $1, 1)   %sil表示第二個(gè)參數(shù)所在的寄存器雨膨,$1表示標(biāo)量擂涛,即$1就表示了數(shù)值1,(%rdx, $1, 1)的語義為(%rdx + 1 * 1)指向的內(nèi)存地址
      ret                         表示函數(shù)結(jié)束
    
    上面的匯編代碼中聊记,movb表示移動(dòng)一個(gè)字節(jié)撒妈,參數(shù)有兩個(gè),第一個(gè)參數(shù)為源地址排监,第二個(gè)參數(shù)為目標(biāo)地址狰右。從上面匯編代碼可以看出,對于匯編語言舆床,不同的參數(shù)類型只代表著不同的數(shù)據(jù)大小棋蚌。
    即使考慮更復(fù)雜的變量類型 ---- JAVA中的對象嫁佳,其存儲(chǔ)于計(jì)算機(jī)中也只是一連串的二進(jìn)制數(shù)據(jù),對于匯編語言來說也只有使用上的區(qū)別谷暮,即JVM轉(zhuǎn)換為機(jī)器碼時(shí)蒿往,可能會(huì)以不同的指令(同一類型指令,但是操作不同大小的數(shù)據(jù))去操作對應(yīng)對象數(shù)據(jù)的各個(gè)一部分(對應(yīng)著對象實(shí)例的不同的字段類型)湿弦,但是變量本身卻只對應(yīng)著某個(gè)寄存器或某個(gè)內(nèi)存地址熄浓。
    總的來說,我們或許可以這樣認(rèn)為省撑,在匯編語言并不存在變量的概念赌蔑,但是我們可以通過操作不同數(shù)據(jù)大小的不同指令,結(jié)合寄存器和內(nèi)存地址來模擬實(shí)現(xiàn)變量的效果竟秫。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娃惯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肥败,更是在濱河造成了極大的恐慌趾浅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馒稍,死亡現(xiàn)場離奇詭異皿哨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纽谒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門证膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鼓黔,你說我怎么就攤上這事央勒。” “怎么了澳化?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵崔步,是天一觀的道長。 經(jīng)常有香客問我缎谷,道長井濒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任列林,我火速辦了婚禮瑞你,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘席纽。我一直安慰自己捏悬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布润梯。 她就那樣靜靜地躺著过牙,像睡著了一般甥厦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寇钉,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天刀疙,我揣著相機(jī)與錄音,去河邊找鬼扫倡。 笑死谦秧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撵溃。 我是一名探鬼主播疚鲤,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缘挑!你這毒婦竟也來了集歇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤语淘,失蹤者是張志新(化名)和其女友劉穎诲宇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惶翻,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姑蓝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吕粗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺荧。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溯泣,靈堂內(nèi)的尸體忽然破棺而出虐秋,到底是詐尸還是另有隱情榕茧,我是刑警寧澤垃沦,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站用押,受9級(jí)特大地震影響肢簿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜻拨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一池充、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缎讼,春花似錦收夸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厘灼。三九已至,卻和暖如春咽瓷,著一層夾襖步出監(jiān)牢的瞬間设凹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工茅姜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闪朱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓钻洒,卻偏偏與公主長得像奋姿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子素标,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記享潜,在此感謝他和像他一樣...
    Gibbs基閱讀 37,141評論 8 114
  • 組件 計(jì)算機(jī)是一種數(shù)據(jù)處理設(shè)備困鸥,它由CPU和內(nèi)存以及外部設(shè)備組成。CPU負(fù)責(zé)數(shù)據(jù)處理剑按,內(nèi)存負(fù)責(zé)存儲(chǔ)疾就,外部設(shè)備負(fù)責(zé)數(shù)...
    哆啦灬少A夢閱讀 1,576評論 1 2
  • 王爽匯編全書知識(shí)點(diǎn)大綱 第一章 基礎(chǔ)知識(shí) 機(jī)器語言 匯編語言的產(chǎn)生 匯編語言的組成 存儲(chǔ)器 cpu對存儲(chǔ)器的讀寫 ...
    2c3ba901516f閱讀 2,408評論 0 1
  • 一彈指六十剎那,一剎那九百生滅艺蝴。 --《仁王經(jīng)》 組件 計(jì)算機(jī)是一種數(shù)據(jù)處理設(shè)備猬腰,它由CPU和內(nèi)存以及外部設(shè)備組成...
    歐陽大哥2013閱讀 21,288評論 15 147
  • Vector List deque stack queue heap set map
    狼之足跡閱讀 2,205評論 1 3