彙編語言跟C語言之間不得不說的秘密!

C語言與彙編語言的元素的部分對應關係:

c語言 彙編語言

Byte/word/dword等數據類型 Int,float,char,long等數據類型

宏 宏

子程序 函數

六大操作指令 +,-,*,/,以及一些函數

堆棧 數組,申請的動態內存,鏈表

地址 指針

Int 21h中的1,2,3,4,9, Scanf,printf,get,getchar等輸入輸出函數

0ah等以及調用c語言函數

C語言函數的實現:

首先從反回編buffer中可以看出,函數在代碼段中存儲位置並不是與主程序相接,而是在函數與函數,主程序與函數之間存在一段空白的代碼段,當主程序要調用函數時,首先EIP指向下一條代碼,需要將函數的首地址傳到主程序中,下面來看一看在主程序中調用oq的彙編代碼

Advertisements

lea eax,[chr] push eax

call oq (0B710D7h)

即使用彙編語言中的函數調用程序CALL,將子函數的地址壓入eip,從而讓主程序執行到函數處,之後,開始執行函數中的代碼。在子函數執行完成後,esp所指向的堆棧地址給EIP,執行函數下一步的指令。

子函數中的參數是通過堆棧操作來實現的。在調用函數時,首先參數被壓棧,而且是以反向的順序將參數壓棧的。再將返回地址壓棧,當子函數開始執行時,ebp被壓入堆棧,再將esp的值賦給ebp,以後就將ebp作為定址所有子函數的參數的基址使用,如給參數從0開始編號,則參數的訪問公式為[ebp+8+i*4]參數有值參數和引用參數,通過引用參數可以在子函數中改變參數對應的值。局部變數是esp減去一個數值,在堆棧上為其保留空間實現的。若給局部變數從0開始編號,則局部變數的訪問實質上是通過公式[ebp-(i+1)*4]實現的。在子函數返回時必須清理堆棧,否則會導致內存泄露或者堆棧破壞。

Advertisements

C與彙編的優缺點及適應場合

先說說彙編,可以說沒有c語言是可以的,雖然可能會有很多不方便,但是沒有了彙編語言計算機直接就無法運行,因為彙編語言是基於計算機底層硬體的編程,通過它實現了對cpu,內存,硬碟以及外界設備的直接操作,因為直接所以彙編語言在程序的大小,執行的速度與效率方面幾乎無可比擬,但是也是因為直接,所以彙編程序難以移植,且完成相同的操作代碼量太大,在進行一些大的項目是,單獨使用彙編進行編程幾乎不可能實現。

再說說c語言,與彙編語言相比,c語言在更加接近人的一般思維,因此我認為在程序的設計過程中比較容易操作,此外在進行一些複雜的操作,運算時,c語言比彙編就要簡單很多,尤其是c語言中的豐富的函數庫,可以直接實現一些原本很複雜的功能,並且從代碼量來說任意一個c語言程序,通過反彙編之後變成彙編語言程序,其長度都可能要增加好幾倍,因此反過來說完成相同的功能編寫c語言程序的事件將會只是編寫彙編語言程序的幾分之一,從編寫程序的效率上來說c語言無疑更高,此外C語言是高級程序語言因此可移植性較好,不太受到到硬體設備的限制。但是與彙編相比,在實現一個功能時,彙編語言可以直接奔著目標去,而C語言則是給你提供了一種對於對於這種問題的普遍處理辦法,不具有針對性,因此會有許多多餘的在這個問題中不需要的過程,因此可能回事程序較大,運行較慢。相對與彙編語言,C語言更加適合一些較大型項目的開發。

當然也可以使用C語言與彙編聯合編程,將兩者的長處相結合。

Advertisements

你可能會喜歡