導航:首頁 > 編程語言 > 與c混合編程的方法

與c混合編程的方法

發布時間:2024-02-25 10:27:51

⑴ 如何在64位的linux系統上使用匯編和C語言混合編程

C51與匯編語言混合編程(1).C51語言中調用匯編語言程序1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、在C51語言中必須聲明需要調用的函數為外部函數。externvoidDELAY(void);4、在匯編語言程序中必須聲明被調用子程序為公共子程序,在被調用的文件中還需要聲明此文件是新定位的。PUBLICDELAY,實例如下:#include"reg51.h"externvoidDELAY(void);externvoidDEL(void);voidmain(void){P1=0x00;DELAY();DEL();P!=0xff;}匯編語言文件:PUBLICDELAY,DELAY:MOVR2,#3HDJNZR2,$RETDEL:MOVR3,#3HDJNZR3,$RETEND(2)、C51語言中嵌入匯編程序:在C51語言中嵌套使用匯編語言程序要注意以下幾個問題:1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、用#pragmaasm.和#pragmaendasm語句包含嵌入的匯編語言程序。實例如下:#include"reg51.h"voiddelay(void);voidmain(void){voiddelay(void);P1=0x00;#pragmaasmMOVR3,#08HDINZR3,$#pragmaendasmP1=0xff;}voiddelay(void){#pragmaasmMOVR4,#08HDJNZR4,$#pragmaendasm}

⑵ 怎麼實現c語言與匯編語言的混合編程

這個問題有很多做法。如果你的匯編語句比較簡單可以採用樓上的做法。
如果的你的匯編比較大,可以寫成另外一個匯編文件*.asm。然後根據你的編譯器給你的指令,把你的匯編函數抽象出C語言聲明。做成*.h文件,供其他人調用。這是現在比較流行的底層API開發模式。
如 我把需要用匯編語句寫的功能寫一個匯衫襲編文件 asm_main.asm,我在該文件的前面 加一句 XDEF asm_main(這是我的編譯器的規定,用XDEF),然後在asm_main.h里聲明(就是典型的C聲明 如 U16 asm_main())。這樣你在你的C程序中如果用到匯編功能,只要#include "asm_main.h" 就可以調用用匯編寫的函數了。對於大規模的軟體開發,這是虧橡個很重要的方法。它提供了二次介面供上層調用。你可以把所有硬體驅動或底層API都寫成這樣子。C語言開發者就不需要了解底層硬體細節了。而且底層匯編的改動也不會影響C。這樣你開發的C程序可移植性就高了。當然,你還需要些編譯原理銷塌旁的知識。如,在匯編里,asm_main函數只是個標號,寫成asm_main: 對吧,但是如果你需要些入口參數怎麼辦?比如你要抽象出U16 asm_main(char ,char *),這個時候你要考慮參數是怎樣入棧的,一般是從右到左依次壓棧的,等等還有些問題。
現在的大學本科教育只教一些單片機開發的小技能,沒有一個系統的概念。我很願意把我工作中得來的經驗與大家分享。

⑶ C51語言的混合編程

C51編譯器能對C語言源程序進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合採用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須採用一定的匯編語言編程。而在另一些場合,出於某種目的,匯編語言也可調用C語言。在這種混合編程中,關鍵是參數的傳遞和函數的返回值。它們必須有完整的約定,否則數據的交換就可能出錯,例 C語言程序與匯編語言程序的調用,其子程序如下:
PUBLIC AD ;入口地址
SEG_AD SEGMENT CODE;程序段
RSEG SEG_AD
USING 0
AD: MOV R6,#00
MOV R7,#00
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
MOV R0,#10
RR0: SETB P1.2
NOP
CLR P1.2
DJNZ R0,RR0
ACALL DELAY
MOV 30H,R6 ;A/D轉換的高
;兩位保存在R6中
ACALL CIR
MOV R6,30H
SETB P1.2
NOP
CLR P1.2
MOV 30H,R6
ACALL CIR
MOV R6,30H
MOV R0,#8 ;A/D轉換的低
;8位保存在R7中
RR2: SETB P1.2
NOP
CLR P1.2
MOV 30H,R7
ACALL CIR
MOV R7,30H
DJNZ R0,RR2
RET
CIR: CLR C
MOV C,P1.0
MOV A,30H
RLC A
MOV 30H,A
RET
END
在以上程序中,函數的返回值為一無符號整型數,根據調用規則,返回值的高位必須在R6中,低位在R7中,這樣才可保證數據的傳遞不出錯。另外,在調用過程中,必須注意寄存器的入棧。這樣在以後用到A/D轉換時,在C語言中調用匯編語言子程序AD()即可。

閱讀全文

與與c混合編程的方法相關的資料

熱點內容
王者系統怎麼轉回安卓系統 瀏覽:749
linux查看路由表命令 瀏覽:506
高手程序員使用什麼筆記本 瀏覽:440
ios壓縮圖片app 瀏覽:839
排隊論pdf 瀏覽:520
python調用無參函數 瀏覽:799
主管開除女程序員 瀏覽:713
雲伺服器轉售 瀏覽:541
壓縮空氣漏氣量怎樣計算 瀏覽:103
手機app是怎麼跳轉的 瀏覽:664
學編程的重要性 瀏覽:25
程序員去按摩 瀏覽:740
奧迪手機控車app怎麼添加愛車 瀏覽:5
收磚機石獅編程培訓廠家 瀏覽:762
吉里吉里2安卓模擬器怎麼用 瀏覽:819
編譯器將匯編代碼 瀏覽:682
電路板加密錯誤 瀏覽:21
java自動機 瀏覽:364
相機連拍解壓 瀏覽:32
linuxssh服務重啟命令 瀏覽:330