www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]匯編是從org 0000h開始啟動,那么keil c51是如何啟動main()函數(shù)的?keil c51有一個啟動程序startup.a51,它總是和c程序一起編譯和鏈接。下面看看它和main()函數(shù)是如何編譯的;//主函數(shù)如下;void main(void){while (

匯編是從org 0000h開始啟動,那么keil c51是如何啟動main()函數(shù)的?keil c51有一個啟動程序startup.a51,它總是和c程序一起編譯和鏈接。下面看看它和main()函數(shù)是如何編譯的;
//主函數(shù)如下;
void main(void)
{
while (1)這是個無條件空循環(huán)。
{
}
}

把上面的main()函數(shù)編譯后的匯編程序和反匯編代碼整理后對照如下;

?C_C51STARTUPSEGMENTCODE
?PR?main?TESTMAINSEGMENT CODE

?STACKSEGMENTIDATA

RSEG?STACK
DS1

CSEGAT0
?C_STARTUP:LJMPSTARTUP1
C:0x0000020003LJMPSTARTUP1(C:0003)

RSEG?C_C51STARTUP
STARTUP1:;該段程序把內(nèi)存清零
;MOVR0,#IDATALEN - 1
C:0x0003787FMOVR0,#0x7F
;CLRA
C:0x0005E4CLRA
;MOV@R0,A
IDATALOOP:
C:0x0006F6MOV@R0,A
;DJNZR0,IDATALOOP
C:0x0007D8FDDJNZR0,IDATALOOP(C:0006)
;MOVSP,#?STACK-1;設(shè)制CPU的堆棧起始地址
C:0x0009758107MOVSP(0x81),#0x07
;LJMP?C_START
C:0x000C02000FLJMPmain(C:000F)

RSEG?PR?main?TESTMAIN
main:
;void main(void)
C:0x000F80FESJMPmain(C:000F);main()函數(shù)

現(xiàn)在分析上面的匯編程序就會明白c51程序是如何啟動的。
該程序有三個代碼段;
第一個代碼段?C_STARTUP在0x0000地址,是CPU第一條指令的入口,它只有一條長跳轉(zhuǎn)指令,直接跳到第二個代碼段.
第二個代碼段?C_C51STARTUP是可重定位的段,該程序把內(nèi)存清零,然后再設(shè)置CPU的堆棧,最后跳轉(zhuǎn)到main()函數(shù).
第三個代碼段就是main()函數(shù),在keil c51編譯器里main()的段地址名就是?C_START。

還有一個IDATA數(shù)據(jù)段?STACK就是堆棧,?STACK用于設(shè)制CPU的堆棧起始地址,這是由keil編譯器自動完成的。


/*******************************************************************/
keil c51函數(shù)的返回值是存儲在r0-r7中的。
多字節(jié)變量在存儲器里都是低地址存高位,高地址存低位。
main()函數(shù)的局部變量都是放在存儲器里的,不象別的函數(shù)先選寄存器r0-r7存放,如果不夠用再存入存儲器里。

看下面的示例;
c51程序;
unsigned int SumXY(unsigned int X,Y);
void main(void)
{unsigned int a,b,c;
a=0x5500;
b=0xaa;
while (1)
{
c=SumXY(a,b);
}
}

unsigned int SumXY(unsigned int X,Y)
{unsigned int Z;
Z=X+Y;
return Z;
}

編譯后的反匯編代碼列表;
C:0x0000020027LJMPSTARTUP1(C:0027)

4: void main(void)
5: {unsigned int a,b,c;
6:a=0x5500;
C:0x0003750855MOV0x08,#0x55;ram地址0x08和0x09存放變量a=0x5500。
C:0x0006750900MOV0x09,#0x00
7:b=0xaa;
C:0x0009750A00MOV0x0A,#0x00;ram地址0x0A和0x0B存放變量b=0x00AA。
C:0x000C750BAAMOV0x0B,#0xAA


8:while (1)
9:{
10:c=SumXY(a,b);
C:0x000FAD0BMOVR5,0x0B;寄存器R4和R5傳遞變量a的值。
C:0x0011AC0AMOVR4,0x0A
C:0x0013AF09MOVR7,0x09;寄存器R6和R7傳遞變量b的值。
C:0x0015AE08MOVR6,0x08
C:0x0017120020LCALLSumXY(C:0020);調(diào)用函數(shù)SumXY(a,b)求c=a+b
C:0x001A8E0CMOV0x0C,R6;函數(shù)SumXY(a,b)返回的整型值存在R6和R7里,
C:0x001C8F0DMOV0x0D,R7;把返回值存入變量c,ram地址0x0C和0x0D存放變量c
11:}
12: }
13:
C:0x001E80EFSJMPC:000F


14: unsigned int SumXY(unsigned int X,Y)
15: {unsigned int Z;
16:Z=X+Y;
C:0x0020EFMOVA,R7;參數(shù)變量X放在寄存器R6和R7里
C:0x00212DADDA,R5;參數(shù)變量Y放在寄存器R4和R5里
C:0x0022FFMOVR7,A
C:0x0023EEMOVA,R6
C:0x00243CADDCA,R4;計算Z=X+Y;
C:0x0025FEMOVR6,A;局部變量Z也放在寄存器R6和R7里
17:return Z;;由寄存器R6和R7里返回函數(shù)的值
C:0x002622RET


151:MOVSP,#?STACK-1
152: ; This code is required if you use L51_BANK.A51 with Banking Mode 4
153: ; EXTRN CODE (?B_SWITCH0)
154: ;CALL?B_SWITCH0; init bank mechanism to code bank 0
C:0x002775810DMOVSP(0x81),#0x0D
155:LJMP?C_START
C:0x002A020003LJMPmain(C:0003)

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

嵌入式開發(fā)作為一種專業(yè)且技術(shù)密集型的領(lǐng)域,涵蓋了從硬件底層驅(qū)動、中間件到應(yīng)用層軟件開發(fā)等多個層面的工作,其所需的工具種類繁多,各有針對性,旨在提升開發(fā)效率、保證代碼質(zhì)量以及簡化調(diào)試過程。

關(guān)鍵字: 嵌入式開發(fā) keil

單片機內(nèi)部有很多的特殊功能寄存器,每個寄存器在單片機內(nèi)部都分配有唯一的地址,一般我們會根據(jù)寄存器功能的不同給寄存器賦予各自的名稱,當我們需要在程序中操作這些特殊功能寄存器時,必須要在程序的最前面將這些名稱加以聲明,聲明的...

關(guān)鍵字: C51 數(shù)據(jù)類型 擴充定義

數(shù)據(jù)元(Data Element),也稱為數(shù)據(jù)元素,是用一組屬性描述其定義、標識、表示和允許值的數(shù)據(jù)單元,在一定語境下,通常用于構(gòu)建一個語義正確、獨立且無歧義的特定概念語義的信息單元。數(shù)據(jù)元可以理解為數(shù)據(jù)的基本單元,將若...

關(guān)鍵字: C51 數(shù)據(jù)類型

之后新建新的工程,添加.a文件就可以使用了,當然也可以使用keil來添加,但是keil默認的是用.lab,需要自己配置一下文件屬性,改為lib文件即可。一半release sdk的時候用這種方式很關(guān)鍵的,畢竟自己的核心代...

關(guān)鍵字: keil 文件屬性 lib文件

▼點擊下方名片,關(guān)注公眾號▼歡迎關(guān)注【玩轉(zhuǎn)單片機與嵌入式】公眾號,回復(fù)關(guān)鍵字獲取更多免費資料?;貜?fù)【加群】,限時免費進入知識共享群;回復(fù)【3D封裝庫】,常用元器件的3D封裝庫;回復(fù)【電容】,獲取電容、元器件選型相關(guān)的內(nèi)容...

關(guān)鍵字: C51 MDK RealView

分享這篇文章,談一下STM32啟動流程。如果讀者朋友已經(jīng)有過匯編相關(guān)基礎(chǔ),能夠夠好理解本文內(nèi)容。匯編語言是比C語言更接近機器底層的編程語言,能讓我們更好的理解和操縱硬件底層。STM32的三種啟動模式下好程序后,重啟芯片時...

關(guān)鍵字: STM32 啟動過程 匯編代碼

0xFFFF:0x00000xF000:0xE05B0x0000:0x7C00在第一篇文章中,我們就提到,現(xiàn)代操作系統(tǒng)是從最古老的8086系統(tǒng)一步一步發(fā)展而來的。處理器廠商為了向后兼容,很多底層相關(guān)的原理都是一樣的(如果...

關(guān)鍵字: 啟動過程

在Keil C51軟件中51單片機的中斷服務(wù)和外設(shè)驅(qū)動程序的開發(fā)

關(guān)鍵字: keil5 編譯 C51

Intel公司1980年推出了MCS-51系列單片機:集成 8位CPU、4K字節(jié)ROM、128字節(jié)RAM、4個8位并口、1個全雙工串行口、2個16位定時/計數(shù)器。尋址范圍64K,并有控制功能較強的布爾處理器。 80C5...

關(guān)鍵字: C51 KEIL 編程

c上標3下標5怎么算用計算機,c上標3下標5怎么算

關(guān)鍵字: C51 KEIL
關(guān)閉