精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

計算機基礎知識之匯編語言2

jf_78858299 ? 來源:前端柒八九 ? 作者:前端柒八九 ? 2023-03-31 16:30 ? 次閱讀

對棧進行push 和 pop

?程序運行時,會在內存上申請分配一個稱為 「棧」 的數據空間。

?

在棧中,數據在存儲時是從內存的下層(大的地址編號)逐漸往上層(小的地址編號)累積,讀出時則是按照從上往下的順序進行。

圖片

棧是 「存儲臨時數據的區域」 ,它的特點是通過push指令和pop指令進行數據的存儲和讀出。push指令和pop指令中只有一個操作數。該操作數表示的是 「push的是什么及pop的是什么」 ,而不需要指定”對哪一個地址編號的內存進行pushpop“。

這是因為,對棧進行讀寫的內存地址是有esp寄存器(棧指針)進行管理的。push指令和pop指令運行后,esp寄存器的值會 「自動進行更新」push指令是-4,pop指令是+4),因而就沒有必要指定內存地址了。


函數調用機制

假設存在如下的C語言代碼片段。

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

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

轉換成對應的匯編語言的代碼如下。

圖片

這里我們先介紹(3)~(6)的部分,這對了解函數調用的機制很重要。

(3)(4)表示的是將傳遞給AddNum函數的參數通過push入棧。在C語言中,雖然記述為函數AddNum(123,456),但入棧的則會按照456123這樣的順序,也就是位于 「后面的數值先入棧」

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

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

圖片

AddNum函數調用前后棧的狀態變化


函數內部的處理

繼續分析執行AddNum函數的源代碼部分。圖片

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

(2)中負責管理棧地址的esp寄存器的值賦值到了ebp寄存器中。這是因為,在mov指令中方括號內的參數,是不允許指定esp寄存器的。因此,這里就采用了不直接通過esp,而是用ebp寄存器來讀寫棧內容的方法。

(3)是用[ebp+8]指定棧中存儲的第1個參數123,并將其讀出到eax寄存器中。eax寄存器是負責運算的累加寄存器

通過(4)add指令,把當前eax寄存器的值同第2個參數相加后的結果存儲在eax寄存器中。 「函數的參數是通過棧來傳遞,返回值是通過寄存器來返回的」

(6)ret指令運行后,函數返回目的地的內存地址會自動出棧。

圖片

AddNum函數內部的棧狀態變化


全局變量用的內存空間

在一些高級編程語言中,在函數外部定義的變量稱為 「全局變量」 ,在函數內部定義的變量稱為 「局部變量」 。全局變量可以在源代碼的任意部分被引用,而局部變量只能在定義該變量的函數內進行引用。

高級程序語言被編譯后,會被歸類到名為 「段」 定義的組。

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

局部變量的內存空間

「局部變量只能在定義該變量的函數內進行引用」 ,這是因為,局部變量是臨時保存在寄存器和棧中的。

函數內部利用的棧,在函數處理完畢后會恢復到初始狀態,因此局部變量的值也就會被銷毀,而寄存器也可能被用于其他目的。因此,局部變量只是在函數處理運行期間臨時存儲在寄存器和棧上。

圖片

用于局部變量的棧空間的申請分配和釋放


循環處理的實現方法

假設我們存在如下的代碼,將局部變量i作為循環計數器連續進行10次循環的C語言源代碼。

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

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

圖片

C語言for語句是通過在括號中指定 「循環計數器」 的初始值(i=0)、循環的繼續條件(i<10)、循環計數器的更新(i++)這3種形式來進行循環處理。與此相對,

?在匯編語言的源代碼中,循環是通過 「比較指令」cmp)和 「跳轉指令」jl)來實現。

?

具體流程我們就不在這里贅述。這里挑選比較重要的點來分析下。

cmp指令是用來對第一個操作數和第二個操作數的數值進行比較的指令。cmp ebx,10就相當于C語言i<10這一處理,意思是把ebx寄存器的數值同10進行比較。匯編語言中比較指令的結果,會存儲在CPU「標志寄存器」 中。

最后一行的jljump on less than(小于的話就跳轉)的意思。也就是說,jl short @4的意思就是,前面運行的比較指令的結果,若 「小」 的話就跳轉到@4這個 標簽


條件分支的實現方式

條件分支的實現方法同循環的實現方法類似,使用的也是cmp指令和跳轉指令。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10829

    瀏覽量

    211194
  • 計算機
    +關注

    關注

    19

    文章

    7430

    瀏覽量

    87733
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136251
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49057
收藏 人收藏

    評論

    相關推薦

    《微機原理與匯編語言》微機基礎知識

    `《微機原理與匯編語言》微機基礎知識[hide][/hide]`
    發表于 04-05 13:00

    匯編語言是什么?怎樣去學習匯編語言

    匯編語言是什么?怎樣去學習匯編語言呢?計算機怎么識別你寫的代碼呢?
    發表于 11-29 06:03

    計算機基礎知識

    前言《MSP430單片機應用基礎與實踐》(華中科技大學出版社)------第0章------計算機基礎知識(本文章作備忘錄使用)1.進制轉換2.數值數據的表示3.計算機的碼制
    發表于 11-29 06:03

    什么是匯編語言

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

    計算機組成原理與匯編語言程序設計

    計算機組成原理與匯編語言程序設計是為中央電大計算機組成原理與匯編語言程序設計課程編寫的教材。在開始學習本書之前,請大家務必先認真閱讀這篇前言,它將告訴你本課
    發表于 10-21 17:56 ?0次下載
    <b class='flag-5'>計算機</b>組成原理與<b class='flag-5'>匯編語言</b>程序設計

    微機原理與匯編語言程序設計課件

    微機原理與匯編語言程序設計課件為PPT文件,內容有:第1章 基礎知識 4第2章 微型計算機系統結構 6第3章 程序加載并執行 4第4章 微處理器一般指令&
    發表于 12-06 22:20 ?5次下載
    微機原理與<b class='flag-5'>匯編語言</b>程序設計課件

    計算機組成原理與匯編語言習題一

    計算機組成原理與匯編語言習題一   硬盤低格格式化是對硬盤最徹底的初始化方式,經過低格后的硬盤,原來保護的數據將全部丟失
    發表于 04-15 16:16 ?532次閱讀

    計算機基礎知識介紹

    計算機基礎知識計算機基礎知識計算機基礎知識
    發表于 12-03 16:13 ?0次下載

    《微機原理與匯編語言》微機基礎知識

    《微機原理與匯編語言》微機基礎知識
    發表于 12-14 15:07 ?0次下載

    計算機學習教程之指令系統與匯編語言程序設計課件免費下載

    本文檔的主要內容詳細介紹的是計算機學習教程之指令系統與匯編語言程序設計課件免費下載包括了:1.匯編語言程序設計,2.程序設計舉例,
    發表于 01-03 08:00 ?0次下載

    計算機的機器語言匯編語言與高級語言的詳細資料介紹

    計算機語言通常是一個能完整、準確和規則地表達人們的意圖,并用以指揮或控制計算機工作的“符號系統”。計算機語言通常分為三類:即機器語言匯編語言
    的頭像 發表于 02-06 16:11 ?5755次閱讀

    [從零學習匯編語言] - 計算機中的硬件與軟件

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

    構建 4 位計算機匯編語言匯編器(第 2 部分)

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

    構建 4 位計算機匯編語言匯編器(第 1 部分)

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

    計算機基礎知識匯編語言1

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