亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? keil c語言與匯編語言混合編程.txt

?? keil C語言與匯編語言混合編程(含實(shí)例講解)
?? TXT
字號:
keil C語言與匯編語言混合編程

1. C語言中嵌入?yún)R編

1、在 C 文件中要嵌入?yún)R編代碼片以如下方式加入?yún)R編代碼:

#pragma ASM

; Assembler Code Here

#pragma ENDASM

2、在 Project 窗口中包含匯編代碼的 C 文件上右鍵,選擇“Options for ...”,點(diǎn)擊右邊的“Generate Assembler SRC File”

和“Assemble SRC File”,使檢查框由灰色變成黑色(有效)狀態(tài);

3、根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如 Small 模式時(shí),是 Keil\C51\Lib\C51S.Lib)加入工程中, 該文件必須作為工程的最后文件;

4、編譯,即可生成目標(biāo)代碼。

來個(gè)實(shí)例吧:

#i nclude <reg51.h>

void main(void)

{

P2=1;

#pragma asm

          MOV R7,#10

DEL:MOV R6,#20

          DJNZ R6,$

          DJNZ R7,DEL

#pragma endasm

P2=0;

}

2 . 無參數(shù)傳遞的函數(shù)調(diào)用

C51調(diào)用匯編函數(shù)

1.無參數(shù)傳遞的函數(shù)調(diào)用

先來個(gè)例子:其中example.c和example.a51為項(xiàng)目中的兩個(gè)文件

***********************example.c***********************************************

extern void delay100();

main()

{delay100;}

***********************example.a51***********************************************

?PR?DELAY100 SEGMENT CODE; //        在程序存儲區(qū)中定義段

PUBLIC DELAY100;      //聲明函數(shù)

RSEG ?PR?DELAY100;     //函數(shù)可被連接器放置在任何地方

DELAY100:

        MOV R7,#10

DEL:      

        MOV R6,#20

        DJNZ R6,$

        DJNZ R7,DEL

        RET

END

在example.c文件中,先聲明外部函數(shù),然后直接在main中調(diào)用即可。

在example.a51中,

?PR?DELAY100 SEGMENT CODE;        作用是在程序存儲區(qū)中定義段,DELAY100為段名,?PR?表示段位于程序存儲區(qū)內(nèi)

PUBLIC DELAY100;           作用是聲明函數(shù)為公共函數(shù)

RSEG ?PR?DELAY100;          表示函數(shù)可被連接器放置在任何地方,RSEG是段名的屬性

段名的開頭為PR,是為了和C51內(nèi)部命名轉(zhuǎn)換兼容,命名轉(zhuǎn)換規(guī)律如下:

CODE -?PR?

XDATA-?XD

DATA-?DT

BIT-?BI

PDATA-?PD

3. 有參數(shù)傳遞的函數(shù)調(diào)用

           記住哦,c文件和A51文件不能使用同一個(gè)文件名,不過我還不知道為什么會這樣,有高手知道得話請告知。

              今天說說帶參數(shù)傳遞的函數(shù)調(diào)用,在C51和匯編之間傳遞參數(shù)的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實(shí)參會存入相應(yīng)的寄存器,在匯編中只需對相應(yīng)寄存器進(jìn)行操作,即達(dá)到傳遞參數(shù)的目的。

         不同類型的數(shù)據(jù)及其傳遞參數(shù)的寄存器如下表所示:

  

 在C和匯編混合編程的時(shí)候,存在C語言和匯編語言的變量以及函數(shù)的接口問題。

在C程序中定義的變量,編譯為.asm文件后,都被放進(jìn)了.bss區(qū),而且變量名的前面都帶了一個(gè)下劃線。在C程序中定義的函數(shù),編譯后在函數(shù)名前也帶了一個(gè)下劃線。例如:

extern int num就會變成 .bss _num, 1

extern float nums[5]就會變成.bss _nums, 5

extern void func ( )就會變成 _func,

一  匯編和C的相互調(diào)用可以分以下幾種情況:

(1) 匯編程序中訪問c程序中的變量和函數(shù)。

在匯編程序中,用_XX就可以訪問C中的變量XX了。訪問數(shù)組時(shí),可以用_XX+偏移量來訪問,如_XX+3訪問了數(shù)組中的XX[3]。

在匯編程序調(diào)用C函數(shù)時(shí),如果沒有參數(shù)傳遞,直接用_funcname 就可以了。如果有參數(shù)傳遞, 則函數(shù)中最左邊的一個(gè)參數(shù)由寄存器A給出,其他的參數(shù)按順序由堆棧給出。返回值是返回到A寄存器或者由A寄存器給出的地址。同時(shí)注意,為了能夠讓匯編語言 能訪問到C語言中定義的變量和函數(shù),他們必須聲明為外部變量,即加extern 前綴。

(2) c程序中訪問匯編程序中的變量

如果需要在c程序中訪問匯編程序中的變量,則匯編程序中的變量名必須以下劃線為首字符,并用global使之成為全局變量。

如果需要在c程序中調(diào)用匯編程序中的過程,則過程名必須以下劃線為首字符,并且,要根據(jù)c程序編譯時(shí)使用的模式是stack-based model還是register argument model來正確地編寫該過程,使之能正確地取得調(diào)用參數(shù)。

(3) 在線匯編

在C程序中直接插入 asm(“ *** ”),內(nèi)嵌匯編語句,需要注意的是這種用法要慎用,在線匯編提供了能直接讀寫硬件的能力,如讀寫中斷控制允許寄存器等,但編譯器并不檢查和分析在線匯編語言,插入在線匯編語言改變匯編環(huán)境或可能改變C變量的值可能導(dǎo)致嚴(yán)重的錯(cuò)誤。

二 匯編和C接口中尋址方式的改變:

需 要注意的是,在C語言中,對于局部變量的建立和訪問,是通過堆棧實(shí)現(xiàn)的,它的尋址是通過堆棧寄存器SP實(shí)現(xiàn)的。而在匯編語言中,為了使程序代碼變得更為精 簡,TI在直接尋址方式中,地址的低7位直接包含在指令中,這低7位所能尋址的具體位置可由DP寄存器或SP寄存器決定。具體實(shí)現(xiàn)可通過設(shè)置ST1寄存器 的CPL位實(shí)現(xiàn),CPL=0,DP尋址,CPL=1,SP尋址。在DP尋址的時(shí)候,由DP提供高9位地址,與低7位組成16位地址;在SP尋址的時(shí)候, 16位地址是由SP(16位)與低7位直接相加得來。

由于在C語言的環(huán)境下,局部變量的尋址必須通過SP寄存器實(shí)現(xiàn),在混合編程的時(shí)候,為了使匯編語言不影響堆棧寄存器SP,通常的方式是在匯編環(huán)境中使用DP方式尋址,這樣可以使二者互不干擾。編程中只要注意對CPL位正確設(shè)置即可

1 .word 的意思就相當(dāng)與C語言里的int,char等定義一個(gè)變兩的寬度

2. 編譯錯(cuò)誤原因有2:

a.如果在匯編里面定義.global(全局符號),那么在C語言里面應(yīng)該用extern聲明,以引用該符號。 

b.在匯編里面聲明的時(shí)候,符號前應(yīng)加下劃線,如 FIQ_Addr: .word EXTint_FIQ 應(yīng)為: FIQ_Addr: .word _EXTint_FIQ 在C語言里面應(yīng)用extern聲明。 另外,一中方法是,用.ref 代替.global 來聲明符號,這樣就不用在C源程序里面用extern聲明了。 兩種方法結(jié)果相同。 我講的是用C和匯編混編程用法,至于C++變量如何翻譯成匯編符號可以用仿真器,自己去看,原則類似.



匯編與C語言混合編程的關(guān)鍵問題


1 C程序變量與匯編程序變量的共用 

    為了使程序更易于接口和維護(hù),可以在匯編程序中引用與C程序共享的變量: 

    .ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff 

    在匯編程序中引用而在C程序可直接定義的變量: 

    unsigned char to_dte_buff[BUFF_SIZE];     //DSP發(fā)向PC機(jī)的數(shù)據(jù) 

    int to_dte_num;                           //緩沖區(qū)中存放的有效字節(jié)數(shù) 

    int to_dte_store;                         //緩沖區(qū)的存放指針 

    int to_dte_read;                          //緩沖區(qū)的讀取指針 

    這樣經(jīng)過鏈接就可以完成對應(yīng)。 

    2 程序入口問題 

    在C程序中,程序的入口是main()函數(shù)。而在匯編程序中其入口由*.cmd文件中的命令決定,如:-e main_start;程序入口地址為 main _start。這樣,混合匯編出來的程序得不到正確結(jié)果。因?yàn)镃到ASM的匯編有默認(rèn)的入口c-int00,從這開始的一段程序?yàn)镃程序的運(yùn)行做準(zhǔn)備工作。這些工作包括初始化變量、設(shè)置棧指針等,相當(dāng)于系統(tǒng)殼不能跨越。這時(shí)可在*.cmd文件中去掉語句:-e main_start。如仍想執(zhí)行某些匯編程序,可以C函數(shù)的形式執(zhí)行,如: 

    main_start();             //其中含有其他匯編程序 

    但前提是在匯編程序中把_main_start作為首地址,程序以rete結(jié)尾(作為可調(diào)用的函數(shù))的程序段,并在匯編程序中引用_main_start,即.ref _main_start。 

    3 移位問題 

    在C語言中把變量設(shè)為char型時(shí),它是8位的,但在DSP匯編中此變量仍被作為16位處理。所以會出現(xiàn)在C程序中的移位結(jié)果與匯編程序移位結(jié)果不同的問題。解決的辦法是在C程序中,把移位結(jié)果再用0X00FF去“與”一下即可。 

    4 堆棧問題 

    在匯編程序中對堆棧的依賴很小,但在C程序中分配局部變量、變量初始化、傳遞函數(shù)變量、保存函數(shù)返回地址、保護(hù)臨時(shí)結(jié)果功能都是靠堆棧完成。而C編譯器無法檢查程序運(yùn)行時(shí)堆棧能否溢出。 

    5 程序跑飛問題 

    編譯后的C程序跑飛一般是對不存在的存儲區(qū)訪問造成的。首先要查.MAP文件與memory map圖對比,看是否超出范圍。如果在有中斷的程序中跑飛,應(yīng)重點(diǎn)查在中斷程序中是否對所用到的寄存器進(jìn)行了壓棧保護(hù)。如果在中斷程序中調(diào)用了C程序,則要查匯編后的C程序中是否用到了沒有被保護(hù)的寄存器并提供保護(hù)(在C程序的編譯中是不對A、B等寄存器進(jìn)行保護(hù)的)。 
 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性感美女极品91精品| 日本一区二区三区国色天香| 一区二区三区精品| 97aⅴ精品视频一二三区| 亚洲色图欧洲色图婷婷| 91日韩在线专区| 亚洲亚洲精品在线观看| 555夜色666亚洲国产免| 免费在线观看一区二区三区| 欧美变态口味重另类| 国产精品99久久久久久久vr| 国产精品激情偷乱一区二区∴| 99免费精品在线观看| 亚洲综合激情另类小说区| 欧美精品一卡两卡| 激情另类小说区图片区视频区| 国产欧美日韩一区二区三区在线观看| 国产精品456露脸| 亚洲欧美在线高清| 欧美巨大另类极品videosbest| 美女任你摸久久| 国产亚洲欧美色| 成人黄色av电影| 亚洲伊人伊色伊影伊综合网| 日韩欧美色综合网站| 夫妻av一区二区| 亚洲成人一区二区| 久久精品一区四区| 欧美亚洲综合色| 韩国在线一区二区| 一区二区三区四区av| 欧美大片顶级少妇| 成人av电影观看| 免费成人深夜小野草| 国产精品三级av| 制服视频三区第一页精品| 精品视频999| 日本成人超碰在线观看| 亚洲欧洲精品一区二区三区不卡 | 欧美乱妇23p| 国产一区二区视频在线播放| 一区二区三区四区五区视频在线观看 | 91久久久免费一区二区| 美女看a上一区| 亚洲激情在线播放| 国产拍揄自揄精品视频麻豆| 欧美老肥妇做.爰bbww视频| 成人国产精品免费网站| 美女视频一区二区三区| 亚洲精品视频在线观看免费| 日韩亚洲欧美在线| 在线视频一区二区三| 国产成人午夜99999| 日韩高清欧美激情| 玉米视频成人免费看| 欧美国产日韩在线观看| 日韩欧美三级在线| 欧美日韩亚洲国产综合| 99精品黄色片免费大全| 国产精品一二二区| 麻豆精品一区二区| 偷拍与自拍一区| 亚洲主播在线播放| 亚洲男帅同性gay1069| 国产日韩综合av| 欧美成人精品福利| 91精品国产91综合久久蜜臀| 色吊一区二区三区| 成人精品一区二区三区四区| 国产剧情一区在线| 麻豆一区二区三区| 美女脱光内衣内裤视频久久影院| 午夜精品久久久久久久久| 一区二区三区免费在线观看| 中文字幕的久久| 久久久99久久精品欧美| 欧美不卡一二三| 日韩免费电影网站| 精品国产自在久精品国产| 日韩情涩欧美日韩视频| 日韩欧美亚洲国产另类| 日韩精品一区二区三区蜜臀| 91精品国产综合久久久久久久 | 久久国产精品99久久人人澡| 蜜桃精品视频在线观看| 欧美aⅴ一区二区三区视频| 日本亚洲天堂网| 麻豆成人综合网| 国产自产视频一区二区三区| 国产在线视频一区二区三区| 国产一区高清在线| 国产乱国产乱300精品| 国产成都精品91一区二区三| 成人精品国产福利| 99久久精品国产麻豆演员表| 色婷婷av一区二区| 欧美精品久久99久久在免费线| 91精品国产综合久久久久久| 日韩精品一区二区在线观看| 精品91自产拍在线观看一区| 国产欧美一区二区三区网站| 国产精品久久久久久久久图文区 | 欧美日韩电影一区| 日韩免费观看2025年上映的电影| 久久综合狠狠综合久久激情 | 日本一区二区三区四区| 另类小说欧美激情| 国产aⅴ综合色| 色哟哟一区二区在线观看| 欧美另类一区二区三区| 精品国产91乱码一区二区三区| 欧美国产日韩亚洲一区| 一区二区三区中文字幕在线观看| 午夜亚洲福利老司机| 国产一区在线观看视频| 91麻豆国产香蕉久久精品| 欧美一级搡bbbb搡bbbb| 国产精品沙发午睡系列990531| 亚洲日本免费电影| 老司机免费视频一区二区| 成人激情视频网站| 欧美一卡二卡在线| 亚洲三级理论片| 久久99精品久久久久久久久久久久| 成人久久18免费网站麻豆| 欧美美女bb生活片| 国产精品色哟哟| 青青国产91久久久久久| www.亚洲色图| 欧美一区二区三区思思人| 中文字幕一区免费在线观看| 免费观看一级特黄欧美大片| yourporn久久国产精品| 日韩色在线观看| 一区二区三区久久| 国产69精品一区二区亚洲孕妇| 欧美精品tushy高清| 日韩毛片一二三区| 激情图片小说一区| 7777精品伊人久久久大香线蕉的| 国产精品久久久久久久久动漫| 麻豆免费精品视频| 欧美三级视频在线播放| 亚洲欧洲日韩av| 国产精品一级在线| 日韩美女一区二区三区| 午夜成人免费视频| 91国偷自产一区二区三区成为亚洲经典 | 国产资源在线一区| 在线观看91精品国产麻豆| 综合激情网...| 成人美女视频在线观看18| 26uuu亚洲| 蜜桃在线一区二区三区| 欧美日韩夫妻久久| 亚洲一区二区高清| 色综合色综合色综合| 美女在线一区二区| 欧美年轻男男videosbes| 亚洲最色的网站| 一本大道久久a久久精二百| 国产精品国产三级国产普通话99 | 欧美色偷偷大香| 亚洲欧美日韩国产成人精品影院 | 中文字幕一区二区三区蜜月| 国产在线精品一区二区夜色| 日韩欧美资源站| 免费日韩伦理电影| 欧美卡1卡2卡| 日本va欧美va精品发布| 91精品在线免费观看| 日韩电影在线一区| 日韩欧美区一区二| 国产一区 二区| 国产欧美精品一区| 成人av网站免费| 亚洲精品日韩一| 欧美偷拍一区二区| 天天做天天摸天天爽国产一区| 欧美日韩在线一区二区| 亚瑟在线精品视频| 欧美一二三区精品| 国产在线国偷精品产拍免费yy| 久久久青草青青国产亚洲免观| 国产精品一级片| 中文字幕在线不卡视频| 91看片淫黄大片一级在线观看| 亚洲最色的网站| 日韩欧美在线综合网| 国产精品一二三在| 亚洲色图欧美在线| 欧美私模裸体表演在线观看| 天堂蜜桃一区二区三区| 日韩视频一区在线观看| 国产精品一区三区| 日韩理论片在线| 91精品国产综合久久精品麻豆| 久久精品久久99精品久久| 欧美国产成人在线| 欧美日韩精品综合在线|