久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
Keil匯編進(jìn)階指南(4) - 與C共舞
[打印本頁(yè)]
作者:
Astrix
時(shí)間:
2024-11-30 00:11
標(biāo)題:
Keil匯編進(jìn)階指南(4) - 與C共舞
與C共舞
我們?cè)谥暗膬?nèi)容學(xué)習(xí)了段的聲明以及相關(guān)變量?jī)?nèi)存的聲明,現(xiàn)在我們要開(kāi)始最重要的一節(jié)課——匯編和C的混合編程
首先是在C中調(diào)用匯編
我們?cè)趨R編的學(xué)習(xí)中知道了匯編代碼的跳轉(zhuǎn)和調(diào)用都是依賴所謂的標(biāo)記來(lái)進(jìn)行,我們還是拿LCD1602的驅(qū)動(dòng)舉例
<div class="blockcode"><blockquote>LCDWRCOM:
CLR LCD_RS;寫(xiě)命令
SJMP GOON
LCDWRDAT:
SETB LCD_RS;寫(xiě)數(shù)據(jù),這個(gè)沒(méi)有jmp,應(yīng)該更快一些
GOON:
SETB LCD_EN;兩段代碼合一,這種技巧很常見(jiàn),甚至編譯器都這么優(yōu)化
MOV LCD_BUS,R7;注意,根據(jù)文檔,單個(gè)char會(huì)直接傳入R7,多看文檔
MOV R6,#10H;等待LCD
DJNZ R6,$
CLR LCD_EN
CLR LCD_RS
RET
復(fù)制代碼
LCDINIT:
CLR LCD_RW
CLR LCD_EN
MOV R7,#38H
CALL LCDWRCOM
MOV R7,#0CH
CALL LCDWRCOM
MOV R7,#06H
CALL LCDWRCOM
MOV R7,#01H
CALL LCDWRCOM;啟動(dòng)序列,別處抄的
MOV R7,#0FH
LCDFINWAIT:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,LCDFINWAIT;LCD需要一段時(shí)間準(zhǔn)備
RET
復(fù)制代碼
我們可以知道,上面有三個(gè)程序,一個(gè)是LCDWRCOM,一個(gè)是LCDWRDAT,以及LCDINIT,這三個(gè)都是程序的入口,我們要做的就是把入口聲明告知C編譯器,有這么個(gè)東西
我們以LCDINIT為例
首先,LCDINIT是一個(gè)沒(méi)有輸入輸出的函數(shù),所以一般來(lái)說(shuō)它在C語(yǔ)言里的聲明是這樣的
void lcdinit();
復(fù)制代碼
其次,我們?cè)贑文件中調(diào)用的是別的文件中的函數(shù),我們需要extern來(lái)表明,這個(gè)函數(shù)是從外部薅過(guò)來(lái)的(函數(shù)入口在別的文件)
最終,我們寫(xiě)在頭文件里的聲明函數(shù)是這樣的
extern void lcdinit();
復(fù)制代碼
還記得我說(shuō)過(guò)傳到匯編編譯器的名字不分大小寫(xiě)嗎?這里就體現(xiàn)出來(lái)了,你只要名字對(duì)上就可以,它能找到認(rèn)出來(lái)
光這樣還不行,匯編語(yǔ)言的入口實(shí)際上是不符合C編譯器的命名規(guī)則的,所以我們需要在匯編里做些操作,讓匯編編譯器知道,這個(gè)入口是可以被外界使用的,這里就要用到PUBLIC,具體用法是這樣的
PUBLIC 標(biāo)記名
所以最終的代碼是這樣的
PUBLIC LCDINIT
LCDINIT:
CLR LCD_RW
CLR LCD_EN
MOV R7,#38H
CALL LCDWRCOM
MOV R7,#0CH
CALL LCDWRCOM
MOV R7,#06H
CALL LCDWRCOM
MOV R7,#01H
CALL LCDWRCOM;啟動(dòng)序列,別處抄的
MOV R7,#0FH
LCDFINWAIT:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,LCDFINWAIT;LCD需要一段時(shí)間準(zhǔn)備
RET
復(fù)制代碼
C語(yǔ)言中
extern void lcdinit();
復(fù)制代碼
這樣,我們就完成了C語(yǔ)言調(diào)用匯編
但是對(duì)于有傳入形參的函數(shù),情況稍微復(fù)雜一些,C51傳遞參數(shù)有些不同,它是寄存器傳參,參數(shù)放置在從R7開(kāi)始的寄存器,然后才輪得到內(nèi)存(可以關(guān)掉這個(gè)選項(xiàng),但是內(nèi)存能省則省),如果是一個(gè)char,那就R7,兩個(gè)那就R7和R6,三個(gè)那就765,一個(gè)int就是R7和R6,以此類推,至于內(nèi)存?zhèn)鲄ⅲ憧梢钥纯词謨?cè),一般來(lái)講,超過(guò)四五個(gè)形參的我建議直接傳指針進(jìn)去
其次,匯編語(yǔ)言中的標(biāo)記的前面必須帶有一個(gè)下劃線,比如ABC要變?yōu)開(kāi)ABC
這里回收上一節(jié)埋下的伏筆,實(shí)際上內(nèi)存段的標(biāo)記也可以public
?DT?LCDMEM SEGMENT DATA
PUBLIC LCDMEM
RSEG ?DT?LCDMEM
LCDMEM:
DS 32
復(fù)制代碼
C語(yǔ)言中是這樣的
extern unsigned char LCDMEM[32];
復(fù)制代碼
好了,C調(diào)用匯編已經(jīng)學(xué)會(huì)了,我們現(xiàn)在要倒反天罡,讓匯編也揩一下C語(yǔ)言的油
這一次,我們直接扒keil一開(kāi)始給的StartUp.A51里面的例子
從116行開(kāi)始
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
復(fù)制代碼
好了,那個(gè)?C_START就是我們的目標(biāo),它就是我們調(diào)用C語(yǔ)言的方法(也是STARTUP以后跳轉(zhuǎn)主函數(shù)的入口)
EXTRN CODE (函數(shù)名)
實(shí)際上還能用EXTERN,兩者的區(qū)別就是EXTERN只能把PUBLIC過(guò)的標(biāo)記薅過(guò)來(lái)用(順便一提,變量也可以薅過(guò)來(lái)用,只需要把CODE改成DATA)
我們這次不寫(xiě)函數(shù)給匯編調(diào)用,我們?cè)赟tartUp.A51上搞事情,眾所周知,StartUp.A51先于主函數(shù)運(yùn)行,所以它一定會(huì)跳轉(zhuǎn)到主函數(shù),我們使個(gè)壞把主函數(shù)改成mian(我不太確定是不是有副作用,就僅僅整活用吧)
所以我們需要改成
EXTRN CODE (mian)
復(fù)制代碼
好了,還有最后一步,我們可以在StartUp.A51的尾部看見(jiàn)這個(gè)
LJMP ?C_START
END
復(fù)制代碼
把它也改了,然后……
StartUp.A51
……
EXTRN CODE (mian)
……
LJMP mian
END
main.c
void mian(){
……
}
復(fù)制代碼
順便一說(shuō),提示找不到
?C_START也可以用這招
最后,匯編里面調(diào)用函數(shù)用CALL,這個(gè)應(yīng)該不用多說(shuō)
作者:
快樂(lè)的大橙子
時(shí)間:
2024-12-2 18:52
好資料,51黑有你更精彩!!!
作者:
188610329
時(shí)間:
2024-12-3 23:33
你不要想當(dāng)然啊……, 傳參 3個(gè) char 是 R7,R5,R3, 不是 R7R6R5, 算了,給你個(gè)表吧……
傳參.png
(5.94 KB, 下載次數(shù): 0)
下載附件
2024-12-3 23:30 上傳
最多能通過(guò)通用寄存器 傳3個(gè)參,再多就要用?DT? 聲明了。
而這3個(gè)參有明確規(guī)定,比如 long 只能在 第一,第二位置傳,傳了long, 就只能再傳 指針了。等等一系列的規(guī)定。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲一区二区在线播放
|
日韩成人高清
|
毛片免费在线
|
日韩一区二区福利
|
亚洲国产一区二区三区在线观看
|
国产日韩视频在线
|
99久久婷婷国产综合精品电影
|
国产精品久久久久久久久久久久
|
久久久久欧美
|
一区二区三区在线播放
|
秋霞在线一区
|
在线观看视频中文字幕
|
一级毛片在线播放
|
亚洲综合无码一区二区
|
欧美性video
|
欧美日韩视频在线
|
日本精品视频一区二区
|
日韩欧美成人精品
|
精品免费在线
|
中文字幕影院
|
亚洲国产精品视频
|
婷婷综合在线
|
91在线一区
|
羞视频在线观看
|
精品一区二区久久
|
日韩欧美亚洲
|
国产成人精品一区二三区在线观看
|
免费在线观看av网站
|
国产欧美日韩一区二区三区
|
亚洲黄色高清视频
|
网站一区二区三区
|
中文字幕一区二区三区四区不卡
|
亚洲欧美国产毛片在线
|
亚洲欧美日本在线
|
午夜久草
|
国产精品污污视频
|
中文字幕视频一区二区
|
日本高清中文字幕
|
日韩高清一区
|
国产精品日日做人人爱
|
婷婷久久久久
|