c語言基於匯編
1. 單片機。分別使用c語言和匯編語言編寫一個程序
#include<reg52.h>
unsignedcharaa_at_0x30;
voidmain()
{
IE=0x81;
IT0=1;
aa=0;
while(1);
}
X0_INT()interrupt0
{
aa++;
aa%=100;
}
//====================
ORG0000H
LJMPSTART
INC30H
MOVA,#100
CJNEA,30H,EXIT
MOV30H,#0
EXIT:
RETI
START:
MOVIE,#81H
SETBIT0
MOV30H,#0
SJMP$
END
上面兩個程序,均經過試驗,可以滿足題目要求。
2. C語言和匯編語言的區別是什麼
區別如下:
(1)兩者編譯組成不同。匯編語言是將由0、1組成的機器語言用具有簡單語義的英文代碼表示,而C語言不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等。
(2)兩者被計算機識別的路徑不同。匯編語言通常用於對硬體的直接操控。而且C語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行。
(3)兩者用處不同。匯編語言通常用在程序中最核心的、控制硬體的代碼,一方面是安全,另一方面提高運行速度。而C語言通常用在計算機外用功能上。
(4)兩者學習難易程度不同。匯編語言所需要的編繪知識很多很復雜,經常被開發者使用。而C語言是一門很簡單方便的語言,編程者也就不需要有太多的專業知識。
計算機語言(Computer Language)指用於人與計算機之間通訊的語言。計算機語言是人與計算機之間傳遞信息的媒介。計算機系統最大特徵是指令通過一種語言傳達給機器。計算機語言從低級到高級可以分為:
(1)機器語言,即由0、1組成的機器硬體可以識別的語言;
(2)低級語言,即匯編語言
(3)中級語言,如C語言
(4)高級語言,如C++,JAVA,C#等。
(2)c語言基於匯編擴展閱讀:
如今通用的編程語言有兩種形式:匯編語言和高級語言。
匯編語言和機器語言實質是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,容易識別和記憶。源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。
高級語言是絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。
高級語言主要是相對於低級語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如流行的vb、vc、foxpro、delphi等,這些語言的語法、命令格式都各不相同。
高級語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:解釋類和編譯類。
3. 將c語言 翻譯為 匯編
你可以先編譯,然後反匯編
4. c語言是用什麼語言編寫的匯編嗎
C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。
1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Programming Language)語言。
1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。
(4)c語言基於匯編擴展閱讀
C語言編譯器:
GCC,GNU組織開發的開源免費的編譯器
MinGW,Windows操作系統下的GCC
Clang,開源的BSD協議的基於LLVM的編譯器
Visual C++:: cl.exe,Microsoft VC++自帶的編譯器
C語言集成開發環境:
Code::Blocks,開源免費的C/C++ IDE
CodeLite,開源、跨平台的C/C++集成開發環境
Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
5. c語言是怎麼基於匯編實現的
如果你是想用匯編實現C語言功能呢,我感覺這個應該沒什麼必要,因為兩者最終運行時,同樣是以機器語言運行。zd高級語言存的產生就是為了讓程序員在編寫較少的代碼是想更復雜的功能,雖然最終在效率上可能略有下降,但是這是軟體工程的思想。但是有些地方是必須使用C,就是操作硬體的時候,有時候為了效率,也可以進行改寫。
如果你是在是想知道呢,你對C語言可以進行反編譯,就知道大致的結構了,但是C語言本身有很多統一的函數庫,所以反編譯的東西只要看自己寫的東西就好了。
6. C語言和匯編語言的關系
程序員編寫的C語言代碼,首先要經過C語言編譯器,生成匯編代碼,這個過程稱為編譯階斷,當C語言編譯器生成匯編代碼後,再調用匯編器來將匯編代碼編譯成匯編指令。
這是一種站在巨人肩人的作法,最早的C++編程語言也是這樣的實現方法,只不過那時候叫Cfront程序,Cfront程序的作用是將C++代碼轉換成C語言代碼,類似於一個文本處理器,然後再調用C語言編譯器,將C源碼編譯成匯編代碼,然後再調用匯編器將匯編代碼編譯成機器碼。
這個過程,在Windows平台上不容易操作,但是在Linux平台上很容易看到。以gcc這款c語言編譯器為例,它實際上是四個小程序。
cp: c語言預處理程序,有它負責進行預處理操作。
cc: C語言編譯器,它負責將C源碼編譯成匯編代碼。
as: 匯編器,它負責將匯編代碼編譯成機器碼,一般使用gcc test.c這樣的命令編譯C語言時,會生成一個a.out的程序,它實際上指的就是as ouput,即匯編器輸出文件。
link: 鏈接器,它負責將匯編器輸入的機器碼和庫打包成一個操作系統可以運行的可執行文件,在Linux上的可執行文件格式是ELF格式,這個格式的實現是有鏈接器來完成的。
7. C語言實現匯編語言代碼
可以!
我就學過C語言`
能是能編輯~
但只能編輯些最簡單的~
不過你還是不要小看C語言~它可是學習其他各種語言的基礎!
8. 匯編和c語言如何結合的
匯編語言沒有高級語言要佔用較大的存儲空間和較長的運行時間等缺點,它的運行速度快是高級語言所不能比擬的。可以說高級語言與匯編語言各有千秋。有時我們採用高級語言編程速度達不到要求,全部採用匯編語言編程工作量又大,此時可以採用"混合"編程,彼此相互調用,進行參數傳遞,共享數據結構及數據信息,是一種有效的編程方法。這種方法可以發揮各種語言的優勢和特點,充分利用現有的多種實用程序、庫程序等使軟體的開發周期大大縮短。
1 高級語言與匯編語言的介面需要解決的問題
1、需要說明和建立調用者與被調用者間的關系被調用的過程或函數應預先說明為外部類型,如匯編子程序,應用PUBLIC說明其可被外部模塊引用;調用程序則應預先說明要引用的外部模塊名。
2、參數傳遞問題在匯編子程序之間通常採用寄存器作為參數傳遞的工具,匯編語言與高級語言程序間的參數傳遞,一般採用堆棧來傳遞,即調用程序將參數依次壓入堆棧中,當被轉調用程序後,再從堆棧中依次彈出參數作為操作數使用。為此,必須了解各種語言的堆棧結構、生成方式和入棧方式等。BASIC、FORTRAN、PASCAL等語言其參數進棧順序是與參數在參數表中出現的順序相同,即從右到左;而C語言則相反。
2 C語言與匯編語言的介面
2.1 C語言調用匯編子程序
●在C程序中使用關鍵字"ExTERn"對函數作顯式說明。
●參數傳遞順序是按其在參數表中出現的順序的反序被壓入堆棧中,即第一個參數最後進入堆棧,它在棧中的地址最低。
●對不同的存儲模式(極小、小、緊湊、中、大和巨)要選用不同的匯編語言格式,如C程序為小模式,匯編用近過程,C程序為大模式,匯編用遠過程。
●匯編程序取C的參數。遠過程返回地址佔四個位元組,BP壓入佔二位元組,所以第一個參數在BP+6所指向的單元。對於近過程第一個參數在BP+4所指向的單元。
●匯編程序中寄存器的保護。TuRboC允許子過程使用SI和DI存放局部變數,當寄存器變數多於二個時,多餘部分會自動轉到堆棧中存儲。因此,匯編過程的格式為:
PUSH BP
MOV BP,SP
PUSH DI
PUSH SI�
……….
語 句�
………….
POP SI
POP DI
POP BP
RET
●返回值。每種C數據類型都有一個標準的返回位置,一般在AX中(極小、小、中模式),DX:AX(緊湊、大、巨模式),如:chaR,unSignEdchaR,Enum,ShoRTinT等,返回值位置為AX,且返回數據必須放置在RET指令之前。匯編子程序要定義為遠過程,並用PUBLIC偽指令把過程名定義為公共。例
:#includE〃STdio.h〃
#includE〃STdlib.h〃
chaRMESSagE[]=〃MESSagE〃;
inTfaRREVSTR(chaRfaR STR);
Voidmain(Void)
{ REVSTR((chaRfaR )MESSagE);
printf(〃%S〃,MESSagE);
}
REVSTR.asm
…
PUBLIC-REVSTR-
REVSTR PROC
PUSH BP
MOVBP,SP
PUSH DS
PUSH SI
PUSH DI
…
POP SI
POP AX
MOV DS,AX
POP BP
MOV AX,CX
RET
REVSTR ENDP
END
2.2 C語言嵌入匯編
在C程序中允許直接編寫匯編語言代碼,這稱作嵌入匯編。C程序中嵌入匯編後可以無分號(C語言的語句以分號結束,匯編語句是C語言中唯一以換行結束的語句),以關鍵詞ASM張一個嵌入匯編指令,如需多個ASM語句,可以將它們放在花括弧內。如,
ASMMOVAX,DX/ 注釋 /
ASM
PUSHAX}/ 注釋 /
C語言允許嵌入四類匯編命令:一般指令、串指令、跳轉指令、數據分配和定義指令,嵌入匯編比調用匯編子程序更方便、靈活、功能也更強。但嵌入匯編不是一個完整的匯編程序,所以許多錯誤不能馬上檢查出來。
3 結 束 語
採用兩種或兩種以上的編程語言組合編程,彼此相互調用,進行參數傳遞,是一種有效的程序設計方法。這種方法可以充分發揮各種語言的優勢,充分利用現有的實用程序,是當前程序介面技術的一個重要研究和應用領域
9. c語言中如何調用匯編程序
匯編語言的基本格式為: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SPMOV CX,[BP+4]DEC CXMOV SI,[BP+10]LODSWMOV DX,1 MOV BX,0 COMP: CMP AX,[SI]JA BIGGERMOV AX,[SI]MOV BX,DXBIGGER: INC SIINC SIINC DXLOOP COMPMOV DI,[BP+6] MOV [DI],AX MOV DI,[BP+8] MOV [DI],BXPOP BPRET_FOUND ENDP_TEXT ENDSEND為了看得更清楚,我們把代碼去掉,留下基本框架: PUBLIC _FOUND _TEXT SEGMENT BYTE PUBLIC 'CODE'ASSUME CS: _TEXT _FOUND PROC NEARPUSH BPMOV BP,SP ......... ;從這里開始加入匯編代碼 POP BPRET_FOUND ENDP_TEXT ENDSEND這是在samll(小模式)下的匯編語言介面框架,在加入代碼處,寫上你所要完成一定功能的匯編代碼,就成為一個可供TC調用的匯編模塊。 可以看出,代碼段是以帶下劃線的標識符開頭的。 代碼段的標識為_TEXT,由C程序中調用的函數found在這里也是以下劃線標出:_FOUND。 下面是代碼段的組成: _TEXT SEGMENT BYTE PUBLIC 'CODE' _TEXT ENDS下面是函數的組成: _FOUND PROC NEAR _FOUND ENDP 在small(小模式下,只要按照以上的格式書寫匯編代碼,就一定能成功地被C程序調用。 這個格式是TC編譯程序所定好了的,如果不按照這個格式書寫匯編代碼,調用就不會成功。
10. C語言匯編
從最基礎的給你說吧
通俗的說 機器語言 就是電路中 能被電路識別處理的 邏輯電平(電路中相對的高電平和低電平)的 序列
最早人們是要用數字1和0的序列代表它以便記憶和使用,後來又縮減成16進制數方便機翼和使用
但。。。。這的確是很讓人頭疼的事,那麼一長串的數字誰看都頭疼
於是人們把各個機器語言的數字序列用一句簡短或縮寫的英文代替(現在有中文匯編,可以還不是完全我們自己的,僅僅是翻譯吧)
這樣書寫的程序就更方便閱讀了。早期這樣寫成的程序是要手工編譯成16進制或二進制碼然後再手動或通過打孔紙帶輸入到計算機當中的,現在已經可以由計算機完成
再後來,隨著計算機功能的強大,程序也越來越龐大,使用匯編仍舊是很繁雜的事,於是出現了C語言,C語言的特點是編訂一套C語言的編譯系統,由這個系統把人們書寫的C語言按照預定規則編譯成匯編和機器語言,以便使用
具體的編譯過程就比較復雜了,因為很多C語言的就單句涉及到邏輯判斷處理、內存處理等諸多事項,所以簡單的幾句C語言程序,編譯成匯編可能長度要長很多,也正是因為如此,高級語言使用起來才比基礎語言省事
但凡是存在的都有其合理性嘛,匯編也一樣,之所以沒有淘汰就是因為匯編是機器語言的影像,它可以直接管理和使用計算機的任何資源,在一些對硬體資源、時序要求控制精細的方面就必須使用匯編了
由於現在計算機編譯軟體的發達,匯編其實使用好了也很方便,尤其對中小規模系統來說。這也是匯編在單片機系統大量應用的原因
純個人理解,言詞不規范之處各位大蝦指正