99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計(jì)算機(jī)基礎(chǔ)知識(shí)之匯編語(yǔ)言2

jf_78858299 ? 來(lái)源:前端柒八九 ? 作者:前端柒八九 ? 2023-03-31 16:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對(duì)棧進(jìn)行push 和 pop

?程序運(yùn)行時(shí),會(huì)在內(nèi)存上申請(qǐng)分配一個(gè)稱為 「?!?/strong> 的數(shù)據(jù)空間。

?

在棧中,數(shù)據(jù)在存儲(chǔ)時(shí)是從內(nèi)存的下層(大的地址編號(hào))逐漸往上層(小的地址編號(hào))累積,讀出時(shí)則是按照從上往下的順序進(jìn)行。

圖片

棧是 「存儲(chǔ)臨時(shí)數(shù)據(jù)的區(qū)域」 ,它的特點(diǎn)是通過(guò)push指令和pop指令進(jìn)行數(shù)據(jù)的存儲(chǔ)和讀出。push指令和pop指令中只有一個(gè)操作數(shù)。該操作數(shù)表示的是 「push的是什么及pop的是什么」 ,而不需要指定”對(duì)哪一個(gè)地址編號(hào)的內(nèi)存進(jìn)行pushpop“。

這是因?yàn)?,?duì)棧進(jìn)行讀寫的內(nèi)存地址是有esp寄存器(棧指針)進(jìn)行管理的。push指令和pop指令運(yùn)行后,esp寄存器的值會(huì) 「自動(dòng)進(jìn)行更新」push指令是-4,pop指令是+4),因而就沒(méi)有必要指定內(nèi)存地址了。


函數(shù)調(diào)用機(jī)制

假設(shè)存在如下的C語(yǔ)言代碼片段。

// 返回兩個(gè)參數(shù)值之和的函數(shù)
int  AddNum(int a,int b){
  return a + b;
}

// 調(diào)用AddNum函數(shù)的函數(shù)
void MyFunc(){
  int c;
  c = AddNum(123,456);
}

轉(zhuǎn)換成對(duì)應(yīng)的匯編語(yǔ)言的代碼如下。

圖片

這里我們先介紹(3)~(6)的部分,這對(duì)了解函數(shù)調(diào)用的機(jī)制很重要。

(3)(4)表示的是將傳遞給AddNum函數(shù)的參數(shù)通過(guò)push入棧。在C語(yǔ)言中,雖然記述為函數(shù)AddNum(123,456),但入棧的則會(huì)按照456、123這樣的順序,也就是位于 「后面的數(shù)值先入?!?/strong> 。

(5)call指令,把程序流程跳轉(zhuǎn)到了操作數(shù)中指定的AddNum函數(shù)所在的內(nèi)存地址處。在匯編語(yǔ)言中, 「函數(shù)名表示的是函數(shù)所在的內(nèi)存地址」 。AddNum函數(shù)處理完畢后,程序流程必須要返回到編號(hào)(6)這一行。call指令運(yùn)行后,call指令的下一行((6)這一行)的內(nèi)存地址會(huì) 「自動(dòng)」 push入棧。該值會(huì)在AddNum函數(shù)處理的最后通過(guò)ret指令pop出棧,然后程序流程就會(huì)返回到(6)這一行。

(6)部分會(huì)把棧中存儲(chǔ)的兩個(gè)參數(shù)(456123)進(jìn)行銷毀處理,也就是 「棧清理處理」 。雖然通過(guò)使用兩次pop指令也可以實(shí)現(xiàn),不過(guò) 「采用esp寄存器加8的方式更有效率」 (處理一次)。對(duì)棧進(jìn)行數(shù)值的輸入輸出時(shí),數(shù)值的單位是4字節(jié)。因此,通過(guò)在棧地址管理的esp寄存器加上4的2倍8,就可以達(dá)到和運(yùn)行兩次pop命令同樣的效果。

圖片

AddNum函數(shù)調(diào)用前后棧的狀態(tài)變化


函數(shù)內(nèi)部的處理

繼續(xù)分析執(zhí)行AddNum函數(shù)的源代碼部分。圖片

ebp寄存器的值在(1)中入棧,在(5)中出棧。這主要是為了把函數(shù)中用到的ebp寄存器的內(nèi)容,恢復(fù)到函數(shù)調(diào)用前的狀態(tài)。CPU擁有的寄存器是有數(shù)量的限制的。在函數(shù)調(diào)用前,調(diào)用源有可能已經(jīng)在使用ebp寄存器了。因而, 「在函數(shù)內(nèi)部用的寄存器,要盡量返回到函數(shù)調(diào)用前的狀態(tài)」 。

(2)中負(fù)責(zé)管理?xiàng)5刂返?code>esp寄存器的值賦值到了ebp寄存器中。這是因?yàn)椋?code>mov指令中方括號(hào)內(nèi)的參數(shù),是不允許指定esp寄存器的。因此,這里就采用了不直接通過(guò)esp,而是用ebp寄存器來(lái)讀寫棧內(nèi)容的方法。

(3)是用[ebp+8]指定棧中存儲(chǔ)的第1個(gè)參數(shù)123,并將其讀出到eax寄存器中。eax寄存器是負(fù)責(zé)運(yùn)算的累加寄存器

通過(guò)(4)add指令,把當(dāng)前eax寄存器的值同第2個(gè)參數(shù)相加后的結(jié)果存儲(chǔ)在eax寄存器中。 「函數(shù)的參數(shù)是通過(guò)棧來(lái)傳遞,返回值是通過(guò)寄存器來(lái)返回的」 。

(6)ret指令運(yùn)行后,函數(shù)返回目的地的內(nèi)存地址會(huì)自動(dòng)出棧。

圖片

AddNum函數(shù)內(nèi)部的棧狀態(tài)變化


全局變量用的內(nèi)存空間

在一些高級(jí)編程語(yǔ)言中,在函數(shù)外部定義的變量稱為 「全局變量」 ,在函數(shù)內(nèi)部定義的變量稱為 「局部變量」 。全局變量可以在源代碼的任意部分被引用,而局部變量只能在定義該變量的函數(shù)內(nèi)進(jìn)行引用。

高級(jí)程序語(yǔ)言被編譯后,會(huì)被歸類到名為 「段」 定義的組。

  • 初始化的全局變量被匯總到名為_DATA的段定義中
  • 沒(méi)有初始化的全局變量被匯總到名為_BSS的段定義中
  • 指令被匯總到名為_TEXT的段定義中

局部變量的內(nèi)存空間

「局部變量只能在定義該變量的函數(shù)內(nèi)進(jìn)行引用」 ,這是因?yàn)?,局部變量是臨時(shí)保存在寄存器和棧中的。

函數(shù)內(nèi)部利用的棧,在函數(shù)處理完畢后會(huì)恢復(fù)到初始狀態(tài),因此局部變量的值也就會(huì)被銷毀,而寄存器也可能被用于其他目的。因此,局部變量只是在函數(shù)處理運(yùn)行期間臨時(shí)存儲(chǔ)在寄存器和棧上。

圖片

用于局部變量的??臻g的申請(qǐng)分配和釋放


循環(huán)處理的實(shí)現(xiàn)方法

假設(shè)我們存在如下的代碼,將局部變量i作為循環(huán)計(jì)數(shù)器連續(xù)進(jìn)行10次循環(huán)的C語(yǔ)言源代碼。

// 定義MySub函數(shù)
void MySub(){
  // 省略部分處理
}
// 定義MyFunc函數(shù)
void MyFunc(){
  int i;
  for(i=0;i<10;i++){
    // 重復(fù)調(diào)用MySub函數(shù)10次
    MySub();
  }
}

將上述的代碼轉(zhuǎn)換成匯編語(yǔ)言如下(僅展示for片段)

圖片

C語(yǔ)言for語(yǔ)句是通過(guò)在括號(hào)中指定 「循環(huán)計(jì)數(shù)器」 的初始值(i=0)、循環(huán)的繼續(xù)條件(i<10)、循環(huán)計(jì)數(shù)器的更新(i++)這3種形式來(lái)進(jìn)行循環(huán)處理。與此相對(duì),

?在匯編語(yǔ)言的源代碼中,循環(huán)是通過(guò) 「比較指令」cmp)和 「跳轉(zhuǎn)指令」jl)來(lái)實(shí)現(xiàn)。

?

具體流程我們就不在這里贅述。這里挑選比較重要的點(diǎn)來(lái)分析下。

cmp指令是用來(lái)對(duì)第一個(gè)操作數(shù)和第二個(gè)操作數(shù)的數(shù)值進(jìn)行比較的指令。cmp ebx,10就相當(dāng)于C語(yǔ)言i<10這一處理,意思是把ebx寄存器的數(shù)值同10進(jìn)行比較。匯編語(yǔ)言中比較指令的結(jié)果,會(huì)存儲(chǔ)在CPU「標(biāo)志寄存器」 中。

最后一行的jljump on less than(小于的話就跳轉(zhuǎn))的意思。也就是說(shuō),jl short @4的意思就是,前面運(yùn)行的比較指令的結(jié)果,若 「小」 的話就跳轉(zhuǎn)到@4這個(gè) 標(biāo)簽 。


條件分支的實(shí)現(xiàn)方式

條件分支的實(shí)現(xiàn)方法同循環(huán)的實(shí)現(xiàn)方法類似,使用的也是cmp指令和跳轉(zhuǎn)指令。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217116
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7663

    瀏覽量

    90824
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141790
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50228
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    《微機(jī)原理與匯編語(yǔ)言》微機(jī)基礎(chǔ)知識(shí)

    `《微機(jī)原理與匯編語(yǔ)言》微機(jī)基礎(chǔ)知識(shí)[hide][/hide]`
    發(fā)表于 04-05 13:00

    匯編語(yǔ)言是什么?怎樣去學(xué)習(xí)匯編語(yǔ)言

    匯編語(yǔ)言是什么?怎樣去學(xué)習(xí)匯編語(yǔ)言呢?計(jì)算機(jī)怎么識(shí)別你寫的代碼呢?
    發(fā)表于 11-29 06:03

    計(jì)算機(jī)基礎(chǔ)知識(shí)

    前言《MSP430單片機(jī)應(yīng)用基礎(chǔ)與實(shí)踐》(華中科技大學(xué)出版社)------第0章------計(jì)算機(jī)基礎(chǔ)知識(shí)(本文章作備忘錄使用)1.進(jìn)制轉(zhuǎn)換2.數(shù)值數(shù)據(jù)的表示3.計(jì)算機(jī)的碼制
    發(fā)表于 11-29 06:03

    什么是匯編語(yǔ)言

    文章目錄前言一、 匯編語(yǔ)言簡(jiǎn)介1.1 什么是匯編語(yǔ)言1.2機(jī)器語(yǔ)言簡(jiǎn)介1.3 匯編語(yǔ)言的演變史1.4 匯編語(yǔ)言的廣義組成二、硬件與軟件2.1
    發(fā)表于 02-24 07:01

    計(jì)算機(jī)組成原理與匯編語(yǔ)言程序設(shè)計(jì)

    計(jì)算機(jī)組成原理與匯編語(yǔ)言程序設(shè)計(jì)是為中央電大計(jì)算機(jī)組成原理與匯編語(yǔ)言程序設(shè)計(jì)課程編寫的教材。在開始學(xué)習(xí)本書之前,請(qǐng)大家務(wù)必先認(rèn)真閱讀這篇前言,它將告訴你本課
    發(fā)表于 10-21 17:56 ?0次下載
    <b class='flag-5'>計(jì)算機(jī)</b>組成原理與<b class='flag-5'>匯編語(yǔ)言</b>程序設(shè)計(jì)

    微機(jī)原理與匯編語(yǔ)言程序設(shè)計(jì)課件

    微機(jī)原理與匯編語(yǔ)言程序設(shè)計(jì)課件為PPT文件,內(nèi)容有:第1章 基礎(chǔ)知識(shí) 4第2章 微型計(jì)算機(jī)系統(tǒng)結(jié)構(gòu) 6第3章 程序加載并執(zhí)行 4第4章 微處理器一般指令&
    發(fā)表于 12-06 22:20 ?5次下載
    微機(jī)原理與<b class='flag-5'>匯編語(yǔ)言</b>程序設(shè)計(jì)課件

    計(jì)算機(jī)組成原理與匯編語(yǔ)言習(xí)題一

    計(jì)算機(jī)組成原理與匯編語(yǔ)言習(xí)題一   硬盤低格格式化是對(duì)硬盤最徹底的初始化方式,經(jīng)過(guò)低格后的硬盤,原來(lái)保護(hù)的數(shù)據(jù)將全部丟失
    發(fā)表于 04-15 16:16 ?588次閱讀

    計(jì)算機(jī)基礎(chǔ)知識(shí)介紹

    計(jì)算機(jī)基礎(chǔ)知識(shí)計(jì)算機(jī)基礎(chǔ)知識(shí)計(jì)算機(jī)基礎(chǔ)知識(shí)
    發(fā)表于 12-03 16:13 ?0次下載

    《微機(jī)原理與匯編語(yǔ)言》微機(jī)基礎(chǔ)知識(shí)

    《微機(jī)原理與匯編語(yǔ)言》微機(jī)基礎(chǔ)知識(shí)
    發(fā)表于 12-14 15:07 ?0次下載

    計(jì)算機(jī)學(xué)習(xí)教程之指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)課件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是計(jì)算機(jī)學(xué)習(xí)教程之指令系統(tǒng)與匯編語(yǔ)言程序設(shè)計(jì)課件免費(fèi)下載包括了:1.匯編語(yǔ)言程序設(shè)計(jì),2.程序設(shè)計(jì)舉例,
    發(fā)表于 01-03 08:00 ?0次下載

    計(jì)算機(jī)的機(jī)器語(yǔ)言匯編語(yǔ)言與高級(jí)語(yǔ)言的詳細(xì)資料介紹

    計(jì)算機(jī)語(yǔ)言通常是一個(gè)能完整、準(zhǔn)確和規(guī)則地表達(dá)人們的意圖,并用以指揮或控制計(jì)算機(jī)工作的“符號(hào)系統(tǒng)”。計(jì)算機(jī)語(yǔ)言通常分為三類:即機(jī)器語(yǔ)言、匯編語(yǔ)言
    的頭像 發(fā)表于 02-06 16:11 ?6222次閱讀

    [從零學(xué)習(xí)匯編語(yǔ)言] - 計(jì)算機(jī)中的硬件與軟件

    文章目錄前言一、 匯編語(yǔ)言簡(jiǎn)介1.1 什么是匯編語(yǔ)言1.2 機(jī)器語(yǔ)言簡(jiǎn)介1.3 匯編語(yǔ)言的演變史1.4 匯編語(yǔ)言的廣義組成二、硬件與軟件2
    發(fā)表于 12-31 19:55 ?10次下載
    [從零學(xué)習(xí)<b class='flag-5'>匯編語(yǔ)言</b>] - <b class='flag-5'>計(jì)算機(jī)</b>中的硬件與軟件

    構(gòu)建 4 位計(jì)算機(jī)匯編語(yǔ)言匯編器(第 2 部分)

    一旦我們構(gòu)建了一臺(tái)計(jì)算機(jī),下一步就是開發(fā)一種匯編語(yǔ)言,然后是一個(gè)可以匯編我們程序的匯編器。 ? 在我 之前的專欄 中,我們介紹了在計(jì)算機(jī)內(nèi)存
    發(fā)表于 08-01 17:52 ?1022次閱讀
    構(gòu)建 4 位<b class='flag-5'>計(jì)算機(jī)</b>:<b class='flag-5'>匯編語(yǔ)言</b>和<b class='flag-5'>匯編</b>器(第 <b class='flag-5'>2</b> 部分)

    構(gòu)建 4 位計(jì)算機(jī)匯編語(yǔ)言匯編器(第 1 部分)

    我們已經(jīng)到了需要為 4 位 HRRG 計(jì)算機(jī)定義匯編語(yǔ)言的地步,但首先我們需要考慮某些概念。 如今,我們習(xí)慣于使用 C/C++、Java、Python 等高級(jí)語(yǔ)言對(duì)我們的計(jì)算機(jī)和微控制
    發(fā)表于 08-01 17:39 ?1252次閱讀
    構(gòu)建 4 位<b class='flag-5'>計(jì)算機(jī)</b>:<b class='flag-5'>匯編語(yǔ)言</b>和<b class='flag-5'>匯編</b>器(第 1 部分)

    計(jì)算機(jī)基礎(chǔ)知識(shí)匯編語(yǔ)言1

    在前面的文章中我們多次提到,計(jì)算機(jī)CPU能直接解釋運(yùn)行的只有 「本地代碼」 (機(jī)器語(yǔ)言)程序。用C語(yǔ)言等編寫的源代碼,需要通過(guò)各自的 「編譯器」 編譯后,轉(zhuǎn)換成本地代碼。
    的頭像 發(fā)表于 03-31 16:29 ?1864次閱讀
    <b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>基礎(chǔ)知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>匯編語(yǔ)言</b>1