<em id="0s9ur"></em>

<em id="0s9ur"></em>
<div id="0s9ur"><ol id="0s9ur"></ol></div>
<div id="0s9ur"><tr id="0s9ur"><object id="0s9ur"></object></tr></div>

      <dl id="0s9ur"><ins id="0s9ur"><small id="0s9ur"></small></ins></dl>

      電子發燒友網 > 控制/MCU > 正文

      如何在c51程序中調用匯編函數

      2018年11月02日 15:57 ? 次閱讀

      有關c51調用匯編的方法已經有很多帖子講到,但是一般只講要點,很少有對整個過程作詳細描述,對于初學者是不夠的,這里筆者通過一個簡單例子對這個過程進行描述,希望能對初學者有所幫助。幾年來,在這個論壇里筆者得到很多熱心人指導,因此也希望藉此盡一點綿薄之力。

      如何在c51程序中調用匯編函數

      在這個例子里,闡述了編寫c51程序調用匯編函數的一種方法,這個外部函數的入口參數是一個字符型變量和一個位變量,返回值是

      一個整型變量。例中,先用c51寫出這個函數的主體,然后用SRC控制指令編譯產生asm文件,進一步修改這個asm文件就得到我們所要的匯編函數。該方法讓編譯器自動完成各種段的安排,提高了匯編程序的編寫效率。

      step1. 按寫普通c51程序方法,建立工程,在里面導入main.c文件和CFUNC.c文件。

      相關文件如下:

      //main.c文件

      #include 《 reg51.h 》

      #define uchar unsigned char

      #define uint unsigned int

      extern uint AFUNC(uchar v_achr,bit v_bflag);

      void main()

      {

      bit BFLAG;

      uchar mav_chr;

      uint mvintrslt;

      mav_chr=0xd4; BFLAG=1;

      mvintrslt=AFUNC(mav_chr,BFLAG);

      }

      //CFUNC.c文件

      #define uchar unsigned char

      #define uint unsigned int

      uint AFUNC(uchar v_achr,bit v_bflag)

      {

      uchar tmp_vchr;

      uint tp_vint;

      tmp_vchr=v_achr;

      tp_vint=(uint)v_bflag;

      return tmp_vchr+(tp_vint《《8);

      }

      step2. 在 Project 窗口中包含匯編代碼的 C 文件上右鍵,選擇“Options for 。..”,點擊右邊的“Generate Assembler SRC

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

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

      step4. build這個工程后將會產生一個CFUNC.SRC的文件,將這個文件改名為CFUNC.A51(也可以通過編譯選項直接產生CFUNC.A51文

      件),然后在工程里去掉庫文件(如C51S.Lib)和CFUNC.c,而將CFUNC.A51添加到工程里。

      //CFUNC.SRC文件如下

      。\CFUNC.SRC generated from: CFUNC.c

      NAME CFUNC

      ?PR?_AFUNC?CFUNC SEGMENT CODE

      ?BI?_AFUNC?CFUNC SEGMENT BIT OVERLAYABLE

      PUBLIC ?_AFUNC?BIT

      PUBLIC _AFUNC

      RSEG ?BI?_AFUNC?CFUNC

      ?_AFUNC?BIT:

      v_bflag?041: DBIT 1

      ; #define uchar unsigned char

      ; #define uint unsigned int

      ;

      ; uint AFUNC(uchar v_achr,bit v_bflag)

      RSEG ?PR?_AFUNC?CFUNC

      _AFUNC:

      USING 0

      ; SOURCE LINE # 5

      ;---- Variable ‘v_achr?040’ assigned to Register ‘R7’ ----

      ; {

      ; SOURCE LINE # 6

      ; uchar tmp_vchr;

      ; uint tp_vint;

      ;

      ; tmp_vchr=v_achr;

      ; SOURCE LINE # 10

      ;---- Variable ‘tmp_vchr?042’ assigned to Register ‘R5’ ----

      MOV R5,AR7

      ; tp_vint=(uint)v_bflag;

      ; SOURCE LINE # 11

      MOV C,v_bflag?041

      CLR A

      RLC A

      ;---- Variable ‘tp_vint?043’ assigned to Register ‘R6/R7’ ----

      ; return tmp_vchr+(tp_vint《《8);

      ; SOURCE LINE # 12

      MOV R6,A

      MOV R4,#00H

      CLR A

      ADD A,R5

      MOV R7,A

      MOV A,R4

      ADDC A,R6

      MOV R6,A

      ; }

      ; SOURCE LINE # 13

      ?C0001:

      RET

      ; END OF _AFUNC

      END

      step5. 檢查main.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效則點擊使檢查框變成無效狀態;再次build這個工程,到此你已經得到匯編函數的主體,修改函數里面的匯編代碼就得到你所需的匯編函數了。


      ?

      keil中匯編函數調用c51函數 [ycong_kuang]

      在keil的寫法可參考89852帖子,具體如下:

      與89852帖子相比,第一步在工程里多了一個被匯編調用的c51的函數文件(c51func.c),至于匯編函數還是先用c51編寫出主體(a51func.c),這樣匯編程序接口和段都交給編譯器處理,你只管在編譯成匯編代碼后按你的要求改寫匯編代碼就行了。

      例程如下:

      //main.c

      #include 《 reg51.h 》

      #define uchar unsigned char

      #define uint unsigned int

      extern uint AFUNC(uchar v_achr,bit v_bflag);

      void main()

      {

      bit BFLAG;

      uchar mav_chr;

      uint mvintrslt;

      mav_chr=0xd4; BFLAG=1;

      mvintrslt=AFUNC(mav_chr,BFLAG);

      }

      //a51FUNC.c

      #define uchar unsigned char

      #define uint unsigned int

      extern uint CFUNC(uint);

      uint AFUNC(uchar v_achr,bit v_bflag) //c51寫的匯編函數,最終要變成匯編代碼

      {

      uchar tmp_vchr;

      uint tp_vint;

      tmp_vchr=v_achr;

      tp_vint=(uint)v_bflag;

      return CFUNC(tp_vint); //這里調用一個c51函數

      }

      //c51FUNC.c

      #define uchar unsigned char

      #define uint unsigned int

      uint CFUNC(uint v_int) //被匯編函數調用c51函數

      {

      return v_int《《2;

      }

      第二步是按89852帖子的step2,3,4把用c51寫的(匯編)函數變成a51文件(今天我試了一下step3可以不要)例程編譯結果如下:

      ; 。\a51func.SRC generated from: a51func.c

      NAME A51FUNC

      ?PR?_AFUNC?A51FUNC SEGMENT CODE

      ?DT?_AFUNC?A51FUNC SEGMENT DATA OVERLAYABLE

      ?BI?_AFUNC?A51FUNC SEGMENT BIT OVERLAYABLE

      EXTRN CODE (_CFUNC)

      PUBLIC ?_AFUNC?BIT

      PUBLIC _AFUNC

      RSEG ?DT?_AFUNC?A51FUNC

      ?_AFUNC?BYTE:

      tmp_vchr?042: DS 1

      RSEG ?BI?_AFUNC?A51FUNC

      ?_AFUNC?BIT:

      v_bflag?041: DBIT 1

      ; //a51FUNC.c

      ;

      ; #define uchar unsigned char

      ; #define uint unsigned int

      ;

      ; extern uint CFUNC(uint);

      ;

      ; uint AFUNC(uchar v_achr,bit v_bflag)

      RSEG ?PR?_AFUNC?A51FUNC

      _AFUNC: ;c51所寫的函數產生的匯編代碼從這里開始

      USING 0

      ; SOURCE LINE # 8

      ;---- Variable ‘v_achr?040’ assigned to Register ‘R7’ ----

      ; {

      ; SOURCE LINE # 9

      ; uchar tmp_vchr;

      ; uint tp_vint;

      ;

      ; tmp_vchr=v_achr;

      ; SOURCE LINE # 13

      MOV tmp_vchr?042,R7

      ; tp_vint=(uint)v_bflag;

      ; SOURCE LINE # 14

      MOV C,v_bflag?041

      CLR A

      MOV R6,A

      RLC A

      MOV R7,A

      ;---- Variable ‘tp_vint?043’ assigned to Register ‘R6/R7’ ----

      ; 這里說明R6,R7內容就是tp_vint

      ; return CFUNC(tp_vint);

      ; SOURCE LINE # 16

      LCALL _CFUNC ;這里調用了用c51寫的函數

      ; }

      ; SOURCE LINE # 17

      ?C0001:

      RET

      ; END OF _AFUNC

      END

      這個文件就是你的匯編函數所在文件,把函數里面的匯編代碼修改成你所需的匯編函數就ok了。

      技術專區

      下載發燒友APP

      打造屬于您的人脈電子圈

      關注電子發燒友微信

      有趣有料的資訊及技術干貨

      關注發燒友課堂

      鎖定最新課程活動及技術直播
      收藏 人收藏
      分享:

      評論

      相關推薦

      有利于嵌入式系統軟件優化的混合編程介紹

      第一類是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個...

      發表于 2018-11-02 08:09 ? 190次閱讀
      有利于嵌入式系統軟件優化的混合編程介紹

      英特爾VTune放大器XE 2015 Beta版...

      加入我們,了解VTune Amplifier XE 2015 Beta版的所有新功能。

      發表于 2018-10-31 07:11 ? 137次閱讀
      英特爾VTune放大器XE 2015 Beta版...

      AVR單片機的CPU內核結構及匯編語言

      AVR采用了Harvard結構,具有獨立的數據和程序總線,CPU在執行一條指令的同時,就將PC中指定...

      發表于 2018-10-17 16:39 ? 92次閱讀
      AVR單片機的CPU內核結構及匯編語言

      C語言究竟會不會過時?

      評價任何一門編程語言,都是招人罵的。 永遠是這樣。就像是春寒料峭的季節, 街上穿棉襖和穿單衣的擦肩而...

      發表于 2018-10-17 14:09 ? 288次閱讀
      C語言究竟會不會過時?

      淺析STVD(COSMIC)定義變量及其位定義

      STM8的C編譯器支持多種存儲器模式。用戶可以根據應用的需要選擇最適合的配置。

      發表于 2018-09-09 09:21 ? 181次閱讀
      淺析STVD(COSMIC)定義變量及其位定義

      怎么編寫一個最簡單的單片機程序?

      在以上匯編程序中,延時子程序每一行的具體含義先不管他,以后慢慢學到,上面的程序需要在一個名為“Kei...

      發表于 2018-08-13 17:56 ? 2124次閱讀
      怎么編寫一個最簡單的單片機程序?

      告訴你怎么編寫一個最簡單的單片機程序

      這樣還不夠,單片機工作還需要兩個條件,一是需要加上一定的工作電壓,AT89S51工作電壓為5V,第2...

      發表于 2018-08-10 16:22 ? 1434次閱讀
      告訴你怎么編寫一個最簡單的單片機程序

      軟件工程師們口中的鄙視鏈到底有多慘烈、多殘酷?

      最近這幾年在世界各地突然吹起了一股全民寫程序的風潮,連美國總統歐巴馬都在寫 JavaScript 了...

      發表于 2018-08-10 14:22 ? 354次閱讀
      軟件工程師們口中的鄙視鏈到底有多慘烈、多殘酷?

      入門單片機的一個簡要提綱和一些指導意見

      發表于 2018-07-19 03:34 ? 113次閱讀
      入門單片機的一個簡要提綱和一些指導意見

      流水彩燈匯編語言資料下載

      發表于 2018-07-19 01:24 ? 116次閱讀
      流水彩燈匯編語言資料下載

      51單片機教程下載

      發表于 2018-07-19 00:37 ? 252次閱讀
      51單片機教程下載

      51單片機指令助記符及其相關符號的記憶方法

      增量 INC-Incremect減量 DNC-Decrement短轉移 SJMP-Short jum...

      發表于 2018-07-13 08:03 ? 933次閱讀
      51單片機指令助記符及其相關符號的記憶方法

      單片機指令系統與匯編語言程序

      發表于 2018-07-13 02:16 ? 101次閱讀
      單片機指令系統與匯編語言程序

      如下程序,請問哪位高人能將這個C語言譯成匯編語言?

      發表于 2018-07-05 09:09 ? 195次閱讀
      如下程序,請問哪位高人能將這個C語言譯成匯編語言?

      51單片機步進電機控制匯編語言程序

      發表于 2018-07-05 03:58 ? 183次閱讀
      51單片機步進電機控制匯編語言程序

      【資料】單片機4*4矩陣鍵盤掃描程序(c語言+匯編語言2個版本)

      發表于 2018-06-29 06:23 ? 178次閱讀
      【資料】單片機4*4矩陣鍵盤掃描程序(c語言+匯編語言2個版本)

      請問誰能詳細介紹一下AVR單片機結構和匯編語言嗎?

      發表于 2018-06-26 04:45 ? 196次閱讀
      請問誰能詳細介紹一下AVR單片機結構和匯編語言嗎?

      用匯編語言,多任務實時操作方法,測已知某被測脈沖頻率為1KHz左右的脈沖寬度

      發表于 2018-06-23 11:26 ? 408次閱讀
      用匯編語言,多任務實時操作方法,測已知某被測脈沖頻率為1KHz左右的脈沖寬度

      51單片機的匯編語言指令中英文對照

      51單片機常用匯編語言助記符英文全稱 51單片機常用匯編語言助記符英文全稱 (1)數據傳送類指令(7...

      發表于 2018-06-19 07:02 ? 424次閱讀
      51單片機的匯編語言指令中英文對照

      Proteus處理匯編程序在build all的時候出現-1073741510的錯誤代碼,請問這是什么原因?

      發表于 2018-06-05 10:18 ? 425次閱讀
      Proteus處理匯編程序在build all的時候出現-1073741510的錯誤代碼,請問這是什么原因?

      編程為什么只有英文?中文不可以嗎?

      因為現在我們所用的編程軟件基本上都是英文的,計算機技術最先產生于美國,我們使用的操作系統基本上也都是...

      發表于 2018-06-04 02:31 ? 843次閱讀
      編程為什么只有英文?中文不可以嗎?

      基于51匯編語言的外部中斷

      這個 C 程序,其實,還有不足,如中斷嵌套、正確恢復中斷前的顯示等等。為了尊重原作,做而論道在寫匯編...

      發表于 2018-05-19 01:29 ? 321次閱讀
      基于51匯編語言的外部中斷

      什么叫arm架構?ARM的技術實現

      匯編語言是機器代碼上的一個薄的語法層,它由以二進制編碼的指令組成,這是我們的計算機所理解。那么為什么...

      發表于 2018-05-08 14:35 ? 1313次閱讀
      什么叫arm架構?ARM的技術實現

      單片機匯編語言常見錯誤知識點分析

      匯編語言作為計算機專業及相關學科一門重要的基礎課程,其重要性不言而喻。但是對于眾多初學匯編語言的人來...

      發表于 2018-04-26 15:03 ? 1073次閱讀
      單片機匯編語言常見錯誤知識點分析

      面向機器語言有哪些

      本文開始介紹了機器語言原理,其次介紹了面向機器語言的概念與分類,最后介紹了機器語言的發展。

      發表于 2018-04-16 10:29 ? 773次閱讀
      面向機器語言有哪些

      高級語言和匯編語言_機器語言的區別

      本文首先介紹了高級語言的優缺點、匯編語言的優缺點及使用匯編語言的理由,其次介紹了機器語言的優缺點,最...

      發表于 2018-04-16 10:28 ? 2237次閱讀
      高級語言和匯編語言_機器語言的區別

      學習開發環境和編程語言:匯編語言和C語言的比較

      能夠解決上述問題的編程語言就是C語言。C語言具有不依存于特定的CPU,又具有程序移植性高等的特點。另...

      發表于 2018-04-10 09:01 ? 1399次閱讀
      學習開發環境和編程語言:匯編語言和C語言的比較

      C語言與匯編語言相互結合的嵌套匯編語言

      要提高單片機技能,必須掌握C 語言編程,因為C 語言有強大的模塊化管理思想。我想在很多人學習的過程中...

      發表于 2018-03-14 18:23 ? 465次閱讀
      C語言與匯編語言相互結合的嵌套匯編語言

      跑馬燈實驗用匯編語言和C51語言做出的不同效果

      無論是匯編語言還是C51語言編寫的程序都不是單片機直接運行的程序,只有機器碼程序單片機才能直接運行,...

      發表于 2018-03-13 14:45 ? 414次閱讀
      跑馬燈實驗用匯編語言和C51語言做出的不同效果

      分享一些單片機匯編語言常見的語法和程序錯誤

      這里采用Keil C51軟件包中的宏匯編器A51作為編繹器,單片機的匯編語言編寫時要注意一定的語法,...

      發表于 2018-01-13 09:41 ? 1762次閱讀
      分享一些單片機匯編語言常見的語法和程序錯誤

      mips匯編語言程序設計實例

      仿真器在真正的用戶代碼段內增加了部分代碼以實現程序運行控制,該仿真器中所有用戶代碼都必須存儲在地址為...

      發表于 2017-12-16 10:48 ? 2489次閱讀
      mips匯編語言程序設計實例

      STC單片機實現可調PWM輸出的C51程序

      脈沖寬度調制(PWM),是英文“ Pulse Width Modulation” 的縮寫,簡稱脈寬調...

      發表于 2017-12-05 10:13 ? 1593次閱讀
      STC單片機實現可調PWM輸出的C51程序

      匯編各類指令用法及含義分析

      指令支持的尋址方式:目的操作數和源操作數不能同時用存儲器尋址方式,這個限制適用于所有指令。指令的執行...

      發表于 2017-11-16 15:56 ? 2305次閱讀
      匯編各類指令用法及含義分析

      匯編db指令的用法及含義解析

      DB作為匯編語言中的偽操作命令,它用來定義操作數占用的字節數。在這里B是byte的縮寫,即字節,所以...

      發表于 2017-11-16 15:26 ? 5392次閱讀
      匯編db指令的用法及含義解析

      PIC 8位單片機匯編語言常用指令

      PIC 8位單片機共有三個級別,有相對應的指令集。基本級PIC系列芯片共有指令33條,每條指令是12...

      發表于 2017-11-16 09:25 ? 583次閱讀
      PIC 8位單片機匯編語言常用指令

      單片機的編程語言和開發環境

      在《嵌入式編程之單片機的基本構成、工作原理》和《嵌入式編程之單片機的外圍功能電路》我們介紹了單片機硬...

      發表于 2016-08-11 10:47 ? 2265次閱讀
      單片機的編程語言和開發環境

      匯編語言的結構化設計及其在俄羅斯方塊中的應用

      為了簡化匯編語言的編寫過程,本文提出了一種結構化的匯編編程思路,并以基于AT89C51芯片(以下對匯...

      發表于 2014-06-23 10:27 ? 1176次閱讀
      匯編語言的結構化設計及其在俄羅斯方塊中的應用

      不可不知的嵌入式工程師經驗(總結篇)

      電子發燒友網訊: 本文將從技術和就業經驗等角度為即將進入嵌入式開發的工程師們,詳細講述了嵌入式的概念...

      發表于 2012-08-20 08:27 ? 23683次閱讀
      不可不知的嵌入式工程師經驗(總結篇)

      用AT89C51單片機控制步進電機的匯編源程序

      下面程序完成的主要功能:實現步進電機的正反轉,加速、減速;顯示電機轉速(轉速級別)和工作狀態(正轉、...

      發表于 2012-08-14 11:54 ? 21648次閱讀
      用AT89C51單片機控制步進電機的匯編源程序

      基于GSM通信和動態重構技術的FPGA動態配置

      隨著現場可編程門陣列的廣泛應用,對其進行靈活的重新配置的研究也越來越多。目前絕大多數FPGA都是基于...

      發表于 2012-08-13 12:44 ? 693次閱讀
      基于GSM通信和動態重構技術的FPGA動態配置

      虛擬I2C總線串行顯示電路介紹

      本文主要介紹了虛擬I2C總線串行顯示電路,其中包括SAA1064引腳功能介紹、硬件電路設計、片內可編...

      發表于 2012-07-31 16:02 ? 2330次閱讀
      虛擬I2C總線串行顯示電路介紹

      基于單片機的8*8 LED點陣顯示技術

      1. 實驗任務 在8X8 LED點陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次...

      發表于 2012-07-29 16:29 ? 11523次閱讀
      基于單片機的8*8 LED點陣顯示技術

      嵌入式工程師升職必備——ARM認證工程師資格證

      處理器IP授權廠商ARM和Prometric公司簽署協議,為軟件和硬件工程師提供ARM工程師資格認證...

      發表于 2012-07-29 14:18 ? 8361次閱讀
      嵌入式工程師升職必備——ARM認證工程師資格證

      Visual C++中調用匯編語言的研究與實現

      人們在開發的過程中將兩種語言進行混合編程,這種方法使兩種語言相互調用,進行參數傳遞,共享數據結構和數...

      發表于 2011-08-15 17:37 ? 767次閱讀
      Visual C++中調用匯編語言的研究與實現

      SI02匯編語言集成開發環境的設計開發

        匯編語言作為可以直接對計算機硬件進行操作的語言,無論語言和架構如何發展,其最高的執行效率和最直接...

      發表于 2010-10-09 17:06 ? 417次閱讀
      SI02匯編語言集成開發環境的設計開發

      匯編語言詳解

      匯編語言(Assembly Language)是面向機器的程序設計語言。   匯編語言中,用助記...

      發表于 2010-06-30 10:28 ? 1596次閱讀
      匯編語言詳解

      匯編語言教程-段寄存器的說明語句

      匯編語言教程-段寄存器的說明語句   在匯編語言源程序中可以定義多個段,每個段都要與一個段寄存器建...

      發表于 2010-03-27 17:17 ? 356次閱讀
      匯編語言教程-段寄存器的說明語句

      采用匯編語言的BCH解碼校驗算法

      在信號傳輸中,BCH碼被廣泛應用于動態的實時無線通信中,而底層的單片機級信號傳輸往往只采用奇偶校驗等...

      發表于 2009-03-29 15:16 ? 468次閱讀
      采用匯編語言的BCH解碼校驗算法

      匯編語言程序設計實驗

      實驗 匯編語言程序設計 一、實驗目的 1. 熟悉編寫和調試語言程序的方法,提高編

      發表于 2008-09-28 23:24 ? 2906次閱讀
      匯編語言程序設計實驗

      匯編語言程序結構

      實 驗   匯編語言程序結構 一、實驗目的 1.掌握匯編語言程序上機...

      發表于 2008-09-28 23:11 ? 1402次閱讀
      匯編語言程序結構
      上海快3开奖走势图
      <em id="0s9ur"></em>

      <em id="0s9ur"></em>
      <div id="0s9ur"><ol id="0s9ur"></ol></div>
      <div id="0s9ur"><tr id="0s9ur"><object id="0s9ur"></object></tr></div>

          <dl id="0s9ur"><ins id="0s9ur"><small id="0s9ur"></small></ins></dl>
          <em id="0s9ur"></em>

          <em id="0s9ur"></em>
          <div id="0s9ur"><ol id="0s9ur"></ol></div>
          <div id="0s9ur"><tr id="0s9ur"><object id="0s9ur"></object></tr></div>

              <dl id="0s9ur"><ins id="0s9ur"><small id="0s9ur"></small></ins></dl>