導航:首頁 > 源碼編譯 > PB9編譯後的取值和之前不一樣

PB9編譯後的取值和之前不一樣

發布時間:2025-01-09 02:25:00

Ⅰ dvb-s 晶元有哪些其優點和缺點

VISHAY Intertechnology 推出將遙控接收器與 IrDA 收發器整合到單個 3 透鏡表面貼裝封裝中的新型器件以面向 PC 市場的需求,從而擴展了其光電子產品系列。

當裝配到筆記本電腦或多媒體計算機中時,新型 TFDU7100 可實現多個功能,包括遙控視頻或音樂播放,以及圖片、MP3 及其它文件格式的無線共享。通過將所有這些功能整合到一個封裝中,TFDU7100 可使 PC 機架設計人員限制日光過濾窗口的數目,從而避免遙控器與 IrDA 功能之間的權衡。

TFDU7100 的 8 引腳封裝整合了兩個高速 PIN 光電二極體、一個紅外線發射器、一個 IrDA 控制 IC 和一個遙控器 IC。對於遙控器,TFDU7100 可在 5 米的最短距離接收載頻介於 20kHz~60kHz 的信號,因此符合 Microsoft® 的 Media Center 規范。在 36kHz~38kHz 的頻率范圍內,其最長接收距離為 18 米。對於 IrDA 通信,TFDU7100 在 1 米的自身安全

距離支持高達 4Mbit/s 的所有 IrDA 數據速率。
為簡化過渡到 TFDU7100 的過程,該封裝的尺寸及焊墊間距與在 80% 的支持 IrDA 的當今筆記本電腦中使用的 Vishay 4Mbit/s 收發器相同。該器件具有更高的靈活性,安裝該器件時可使透鏡方向位於側面或頂部。TFU7100 IrDA 及 RC 收發器的工作電壓介於 2.7V~5.5V,溫度范圍介於 -25℃~+85℃。該器件不含鉛 (Pb),可進行無鉛處理,並且符合 RoHS 2002/95/EC 及 WEEE 2002/96/EC 標准。

2006-9-7
89s52的串口調試 [原]

#include<regx52.h>
#include<datatype.h>
void main()
{
INT8U a,b;
bit abit;
a=5;
b=13;
SCON=0;
IE=0;
while(1)
{/////////////////////////////////////////////////
TI=0; /////////////注釋點

///////////////////////////////////////////////
SBUF=a;
do{
abit=TI;
}while(abit==1);
TI=0;
SBUF=b;
do{
abit=TI;
}while(abit==1);

//////////////////////////////////////////
TI=0;//////////注釋2;

/}///////////////////
}這段程序中注釋點處,一定要有,//TI=0;則只執行一次while(1)函數,雖然SCON=0時,TI已經是0了,為什麼一定要在循環體中再寫一遍TI=0,末尾也有TI=0阿?費解。

注釋2也一樣,如果//TI=0,則同注釋1處一樣,只執行一次while(1)函數。

liuph 發表於 >2006-9-7 14:35:09 [全文] [評論] [引用] [推薦] [檔案] [推給好友] [收藏到網摘]

2006-9-1
調試經驗 [原]

Keil c 中最後一句不管是什麼語句,編譯後傳入89s52中後,都會一直執行最後一句。因此,最好加一句while(1);不至於影響別的程序。
while(P1^1&0x01)語句會修改P1^1的值,最好設一個bit a;讓a去替代a=P1^1&0x01;while(a),這樣更保險。
keil c編譯器中在while語句的}後加一分號居然不報錯,在vc中是不可想像的,但keil c中就會出現,但應不影響程序還不清楚。

liuph 發表於 >2006-9-1 14:12:21 [全文] [評論] [引用] [推薦] [檔案] [推給好友] [收藏到網摘]

2006-8-22
Keil C51 vs 標准C [原]

深入理解並應用C51對標准ANSIC的擴展是學習C51的關鍵之一。因為大多數擴展功能都是直接針對8051系列CPU硬體的。大致有以下8類:

8051存儲類型及存儲區域 , 存儲模式 , 存儲器類型聲明 , 變數類型聲明 , 位變數與位定址 ,特殊功能寄存器(SFR) ,C51指針

l 函數屬性

具體說明如下(8031為預設CPU)。

第一節 Keil C51擴展關鍵字
C51 V4.0版本有以下擴展關鍵字(共19個):
_at_ idata sfr16 alien interrupt small
bdata large _task_ Code bit pdata
using reentrant xdata compact sbit data sfr

第二節 內存區域(Memory Areas):
1. Pragram Area:
由Code說明可有多達64kBytes的程序存儲器

2. Internal Data Memory:
內部數據存儲器可用以下關鍵字說明:

data:直接定址區,為內部RAM的低128位元組 00H~7FH
idata:間接定址區,包括整個內部RAM區 00H~FFH
bdata:可位定址區, 20H~2FH

3. External Data Memory
外部RAM視使用情況可由以下關鍵字標識: xdata:可指定多達64KB的外部直接定址區,地址范圍0000H~0FFFFH

pdata:能訪問1頁(25bBytes)的外部RAM,主要用於緊湊模式(Compact Model)。

4. Speciac Function Register Memory
8051提供128Bytes的SFR定址區,這區域可位定址、位元組定址或字定址,用以控制定時器、計數器、串口、I/O及其它部件,可由以下幾種關鍵字說明:

sfr:位元組定址 比如 sfr P0=0x80;為PO口地址為80H,「=」後H~FFH之間的常數。
sfr16:字定址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD
sbit:位定址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許

還可以有如下定義方法:
sbit 0V=PSW^2;(定義0V為PSW的第2位)
sbit 0V=0XDO^2;(同上)
或bit 0V-=0xD2(同上)。

第三節 存儲模式
存儲模式決定了沒有明確指定存儲類型的變數,函數參數等的預設存儲區域,共三種:
1. Small模式
所有預設變數參數均裝入內部RAM,優點是訪問速度快,缺點是空間有限,只適用於小程序。
2. Compact模式
所有預設變數均位於外部RAM區的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也可用pdata指定,優點是空間較Small為寬裕速度較Small慢,較large要快,是一種中間狀態。
3. large模式
所有預設變數可放在多達64KB的外部RAM區,優點是空間大,可存變數多,缺點是速度較慢。

提示:存儲模式在C51編譯器選項中選擇。

第四節 存儲類型聲明
變數或參數的存儲類型可由存儲模式指定預設類型,也可由關鍵字直接聲明指定。各類型分別用:code,data,idata,xdata,pdata說明,例:
data uar1
char code array[ ]=「hello!」;
unsigned char xdata arr[10][4][4];

第五節 變數或數據類型

C51提供以下幾種擴展數據類型:
bit 位變數值為0或1
sbit 從位元組中定義的位變數 0或1
sfr sfr位元組地址 0~255
sfr16 sfr字地址 0~65535
其餘數據類型如:char,enum,short,int,long,float等與ANSI C相同。

第六節 位變數與聲明
1. bit型變數
bit型變數可用變數類型,函數聲明、函數返回值等,存貯於內部RAM20H~2FH。
注意:
(1) 用#pragma dISAble說明函數和用「usign」指定的函數,不能返回bit值。
(2) 一個bit變數不能聲明為指針,如bit *ptr;是錯誤的
(3) 不能有bit數組如:bit arr[5];錯誤。

2. 可位定址區說明20H-2FH
可作如下定義:
int bdata i;
char bdata arr[3],
然後:
sbit bito=in0;sbit bit15=I^15;
sbit arr07=arr[0]^7;sbit arr15=arr[i]^7;

第七節 Keil C51指針
C51支持一般指針(Generic Pointer)和存儲器指針(Memory_Specific Pointer).

1. 一般指針
一般指針的聲明和使用均與標准C相同,不過同時還可以說明指針的存儲類型,例如:
long * state;為一個指向long型整數的指針,而state本身則依存儲模式存放。
char * xdata ptr;ptr為一個指向char數據的指針,而ptr本身放於外部RAM區,以上的long,char等指針指向的數據可存放於任何存儲器中。

一般指針本身用3個位元組存放,分別為存儲器類型,高位偏移,低位偏移量。 2. 存儲器指針
基於存儲器的指針說明時即指定了存貯類型,例如:

char data * str;str指向data區中char型數據
int xdata * pow; pow指向外部RAM的int型整數。
這種指針存放時,只需一個位元組或2個位元組就夠了,因為只需存放偏移量。

3. 指針轉換
即指針在上兩種類型之間轉化:

l 當基於存儲器的指針作為一個實參傳遞給需要一般指針的函數時,指針自動轉化。

l 如果不說明外部函數原形,基於存儲器的指針自動轉化為一般指針,導致錯誤,因而請用「#include」說明所有函數原形。

l 可以強行改變指針類型。

第八節 Keil C51函數
C51函數聲明對ANSI C作了擴展,具體包括:

1. 中斷函數聲明:
中斷聲明方法如下:

void serial_ISR () interrupt 4 [using 1]
{

/* ISR */

}

為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。

/* define not used interrupt, so generate "IRET" in their entrance */

void extern0_ISR() interrupt 0{} /* not used */

void timer0_ISR () interrupt 1{} /* not used */

void extern1_ISR() interrupt 2{} /* not used */

void timer1_ISR () interrupt 3{} /* not used */

void serial_ISR () interrupt 4{} /* not used */

2. 通用存儲工作區
3. 選通用存儲工作區由using x聲明,見上例。
4. 指定存儲模式
由small compact 及large說明,例如:

void fun1(void) small { }

提示:small說明的函數內部變數全部使用內部RAM。關鍵的經常性的耗時的地方可以這樣聲明,以提高運行速度。
5. #pragma dISAble
在函數前聲明,只對一個函數有效。該函數調用過程中將不可被中斷。

6. 遞歸或可重入函數指定
在主程序和中斷中都可調用的函數,容易產生問題。因為51和PC不同,PC使用堆棧傳遞參數,且靜態變數以外的內部變數都在堆棧中;而51一般使用寄存器傳遞參數,內部變數一般在RAM中,函數重入時會破壞上次調用的數據。可以用以下兩種方法解決函數重入:

a、在相應的函數前使用前述「#pragma dISAble」聲明,即只允許主程序或中斷之一調用該函數;

b、將該函數說明為可重入的。如下:

void func(param...) reentrant;

KeilC51編譯後將生成一個可重入變數堆棧,然後就可以模擬通過堆棧傳遞變數的方法。

由於一般可重入函數由主程序和中斷調用,所以通常中斷使用與主程序不同的R寄存器組。

另外,對可重入函數,在相應的函數前面加上開關「#pragma noaregs」,以禁止編譯器使用絕對寄存器定址,可生成不依賴於寄存器組的代碼。

7. 指定PL/M-51函數
由alien指定。

liuph 發表於 >2006-8-22 11:33:13 [全文] [評論] [引用] [推薦] [檔案] [推給好友] [收藏到網摘]

2006-8-22
單片機C51編程規范 [原]

1單片機C51編程規范- 前言
為了提高源程序的質量和可維護性,從而最終提高軟體產品生產力,特編寫此規范。

2 單片機C51編程規范-范圍
本標准規定了程序設計人員進行程序設計時必須遵循的規范。本規范主要針對C51編程語言和keil編譯器而言,包括排版、注釋、命名、變數使用、代碼可測性、程序效率、質量保證等內容。

3 單片機C51編程規范-總則
l 格式清晰
l 注釋簡明扼要
l 命名規范易懂
l 函數模塊化
l 程序易讀易維護
l 功能准確實現
l 代碼空間效率和時間效率高
l 適度的可擴展性

4 單片機C51編程規范-數據類型定義
編程時統一採用下述新類型名的方式定義數據類型。
建立一個datatype.h文件,在該文件中進行如下定義:
typedef bit BOOL; // 位變數 //
typedef unsigned char INT8U; // 無符號8位整型變數 //
typedef signed char INT8S; // 有符號8位整型變數 //
typedef unsigned int INT16U; // 無符號16位整型變數 //
typedef signed int INT16S; // 有符號16位整型變數 //
typedef unsigned long INT32U; // 無符號32位整型變數 //
typedef signed long INT32S; // 有符號32位整型變數 //
typedef float FP32; // 單精度浮點數(32位長度) //
typedef double FP64; // 雙精度浮點數(64位長度) //

5 單片機C51編程規范-標識符命名

5.1 命名基本原則
l 命名要清晰明了,有明確含義,使用完整單詞或約定俗成的縮寫。通常,較短的單詞可通過去掉母音字母形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫。即"見名知意"。
l 命名風格要自始至終保持一致。
l 命名中若使用特殊約定或縮寫,要有注釋說明。
l 除了編譯開關/頭文件等特殊應用,應避免使用以下劃線開始和/或結尾的定義。
l 同一軟體產品內模塊之間介面部分的標識符名稱之前加上模塊標識。

5.2 宏和常量命名
宏和常量用全部大寫字母來命名,詞與詞之間用下劃線分隔。對程序中用到的數字均應用有意義的枚舉或宏來代替。

5.3 變數命名
變數名用小寫字母命名,每個詞的第一個字母大寫。類型前綴(u8\s8 etc.)全局變數另加前綴g_。
局部變數應簡明扼要。局部循環體控制變數優先使用i、j、k等;局部長度變數優先使用len、num等;臨時中間變數優先使用temp、tmp等。

5.4 函數命名
函數名用小寫字母命名,每個詞的第一個字母大寫,並將模塊標識加在最前面。

5.5 文件命名
一個文件包含一類功能或一個模塊的所有函數,文件名稱應清楚表明其功能或性質。
每個.c文件應該有一個同名的.h文件作為頭文件。

6 單片機C51編程規范-注釋

6.1 注釋基本原則
l 有助於對程序的閱讀理解,說明程序在"做什麼",解釋代碼的目的、功能和採用的方法。
l 一般情況源程序有效注釋量在30%左右。
l 注釋語言必須准確、易懂、簡潔。
l 邊寫代碼邊注釋,修改代碼同時修改相應的注釋,不再有用的注釋要刪除。

6.2 文件注釋
文件注釋必須說明文件名、函數功能、創建人、創建日期、版本信息等相關信息。
修改文件代碼時,應在文件注釋中記錄修改日期、修改人員,並簡要說明此次修改的目的。所有修改記錄必須保持完整。
文件注釋放在文件頂端,用"/*……*/"格式包含。
注釋文本每行縮進4個空格;每個注釋文本分項名稱應對齊。
/***********************************************************
文件名稱:
作 者:
版 本:
說 明:
修改記錄:
***********************************************************/

6.3 函數注釋
6.3.1 函數頭部注釋
函數頭部注釋應包括函數名稱、函數功能、入口參數、出口參數等內容。如有必要還可增加作者、創建日期、修改記錄(備注)等相關項目。
函數頭部注釋放在每個函數的頂端,用"/*……*/"的格式包含。其中函數名稱應簡寫為FunctionName(),不加入、出口參數等信息。
/***********************************************************
函數名稱:
函數功能:
入口參數:
出口參數:
備 註:
***********************************************************/

6.3.2 代碼注釋
代碼注釋應與被注釋的代碼緊鄰,放在其上方或右方,不可放在下面。如放於上方則需與其上面的代碼用空行隔開。一般少量注釋應該添加在被注釋語句的行尾,一個函數內的多個注釋左對齊;較多注釋則應加在上方且注釋行與被注釋的語句左對齊。
函數代碼注釋用"//…//"的格式。
通常,分支語句(條件分支、循環語句等)必須編寫注釋。其程序塊結束行"}"的右方應加表明該程序塊結束的標記"end of ……", 尤其在多重嵌套時。

6.4 變數、常量、宏的注釋
同一類型的標識符應集中定義,並在定義之前一行對其共性加以統一注釋。對單個標識符的注釋加在定義語句的行尾。
全局變數一定要有詳細的注釋,包括其功能、取值范圍、哪些函數或過程存取它以及存取時的注意事項等。
注釋用"//…//"的格式。

7 單片機C51編程規范-函數

7.1 設計原則
函數的基本要求:
l 正確性:程序要實現設計要求的功能。
l 穩定性和安全性:程序運行穩定、可靠、安全。
l 可測試性:程序便於測試和評價。
l 規范/可讀性:程序書寫風格、命名規則等符合規范。
l 擴展性:代碼為下一次升級擴展留有空間和介面。
l 全局效率:軟體系統的整體效率高。
l 局部效率:某個模塊/子模塊/函數的本身效率高。

編制函數的基本原則:
l 單個函數的規模盡量限制在200行以內(不包括注釋和空行)。一個函數只完成一個功能。
l 函數局部變數的數目一般不超過5~10個。
l 函數內部局部變數定義區和功能實現區(包含變數初始化)之間空一行。
l 函數名應准確描述函數的功能。通常使用動賓片語為執行某操作的函數命名。
l 函數的返回值要清楚明了,尤其是出錯返回值的意義要准確無誤。
l 不要把與函數返回值類型不同的變數,以編譯系統默認的轉換方式或強制的轉換方式作為返回值返回。
l 減少函數本身或函數間的遞歸調用。
l 盡量不要將函數的參數作為工作變數。

7.2 函數定義
l 函數若沒有入口參數或者出口參數,應用void明確申明。
l 函數名稱與出口參數類型定義間應該空一格且只空一格。
l 函數名稱與括弧()之間無空格。
l 函數形參必須給出明確的類型定義。
l 多個形參的函數,後一個形參與前一個形參的逗號分割符之間添加一個空格。
l 函數體的前後花括弧"{}" 各獨佔一行。

7.3 局部變數定義
l 同一行內不要定義過多變數。
l 同一類的變數在同一行內定義,或者在相鄰行定義。
l 先定義data型變數,再定義idtata型變數,再定義xdata型變數.
l 數組、指針等復雜類型的定義放在定義區的最後。
l 變數定義區不做較復雜的變數賦值。

7.4 功能實現區規范
l 一行只寫一條語句。
l 注意運算符的優先順序,並用括弧明確表達式的操作順序,避免使用默認優先順序。
l 各程序段之間使用一個空行分隔,加以必要的注釋。程序段指能完一個較具體的功能的一行或多行代碼。程序段內的各行代碼之間相互依賴性較強。
l 不要使用難懂的技巧性很高的語句。
l 源程序中關系較為緊密的代碼應盡可能相鄰。
l 完成簡單功能、關系非常密切的一條或幾條語句可編寫為函數或定義為宏。

8 單片機C51編程規范-排版

8.1 縮進
代碼的每一級均往右縮進4個空格的位置。

8.2 分行
過長的語句(超過80個字元)要分成多行書寫;長表達式要在低優先順序操作符處劃分新行,操作符放在新行之首,劃分出的新行要進適當的縮進,使排版整齊,語句可讀。避免把注釋插入分行中。

8.3 空行
l 文件注釋區、頭文件引用區、函數間應該有且只有一行空行。
l 相鄰函數之間應該有且只有一行空行。
l 函數體內相對獨立的程序塊之間可以用一行空行或注釋來分隔。
l 函數注釋和對應的函數體之間不應該有空行。
l 文件末尾有且只有一行空行。

8.4 空格
l 函數語句尾部或者注釋之後不能有空格。
l 括弧內側(即左括弧後面和右括弧前面)不加空格,多重括弧間不加空格。
l 函數形參之間應該有且只有一個空格(形參逗號後面加空格)。
l 同一行中定義的多個變數間應該有且只有一個空格(變數逗號後面加空格)。
l 表達式中,若有多個操作符連寫的情況,應使用空格對它們分隔:
在兩個以上的關鍵字、變數、常量進行對等操作時,它們之間的操作符前後均加一個空格;在兩個以上的關鍵字、變數、常量進行非對等操作時,其前後均不應加空格;
逗號只在後面加空格;
雙目操作符,如比較操作符, 賦值操作符"="、"+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位操作符"<<"、"^"等,前後均加一個空格;
單目操作符,如"!"、"~"、"++"、"-"、"&"(地址運算符)等,前後不加空格;
"->"、"."前後不加空格;
if、for、while、switch等關鍵字與後面的括弧間加一個空格;

8.5 花括弧
l if、else if、else、for、while語句無論其執行體是一條語句還是多條語句都必須加花括弧,且左右花括弧各獨佔一行。
l do{}while()結構中,"do"和"{"均各佔一行,"}"和"while();"共同佔用一行。
if ( do
{ {

} }while( ;
else
{

}

8.6 switch語句
l 每個case和其判據條件獨佔一行。
l 每個case程序塊需用break結束。特殊情況下需要從一個case塊順序執行到下一個case塊的時候除外,但需要在交界處明確注釋如此操作的原因,以防止出錯。
l case程序塊之間空一行,且只空一行。
l 每個case程序塊的執行語句保持4個空格的縮進。
l 一般情況下都應該包含default分支。
Switch (
{
case x:

break;

case x:

break;

default:

break;
}

9 單片機C51編程規范-程序結構

9.1 基本要求
l 有main()函數的.c文件應將main()放在最前面,並明確用void聲明參數和返回值。
l 對由多個.c文件組成的模塊程序或完整監控程序,建立公共引用頭文件,將需要引用的庫頭文件、標准寄存器定義頭文件、自定義的頭文件、全局變數等均包含在內,供每個文件引用。通常,標准函數庫頭文件採用尖角號< >標志文件名,自定義頭文件採用雙撇號〃〃標志文件名。
l 每個.c文件有一個對應的.h文件,.c文件的注釋之後首先定義一個唯一的文件標志宏,並在對應的.h文件中解析該標志。
在.c文件中:
#define FILE_FLAG
在.h文件中:
#ifdef FILE_FLAG
#define XXX
#else
#define XXX extern
#endif
l 對於確定只被某個.c文件調用的定義可以單獨列在一個頭文件中、單獨調用。

9.2 可重入函數
可重入函數中若使用了全局變數,應通過關中斷、信號量等操作手段對其加以保護。

9.3 函數的形參
l 由函數調用者負責檢查形參的合法性。
l 盡量避免將形參作為工作變數使用。

9.4 循環
l 盡量減少循環嵌套層數
l 在多重循環中,應將最忙的循環放在最內層
l 循環體內工作量最小
l 盡量避免循環體內含有判斷語句

liuph 發表於 >2006-8-22 11:26:48 [全文] [評論] [引用] [推薦] [檔案] [推給好友] [收藏到網摘]

2006-8-22
在C51中變數的空間分配幾個方法 [原]

1、 data區空間小,所以只有頻繁用到或對運算速度要求很高的變數才放到data區內,比如for循環中的計數值。

2、 data區內最好放局部變數。

因為局部變數的空間是可以覆蓋的(某個函數的局部變數空間在退出該函數是就釋放,由別的函數的局部變數覆蓋),可以提高內存利用率。當然靜態局部變數除外,其內存使用方式與全局變數相同;

3、 確保你的程序中沒有未調用的函數。

在Keil C里遇到未調用函數,編譯器就將其認為可能是中斷函數。函數里用的局部變數的空間是不釋放,也就是同全局變數一樣處理。這一點Keil C做得很愚蠢,但也沒辦法。

4、 程序中遇到的邏輯標志變數可以定義到bdata中,可以大大降低內存佔用空間。

在51系列晶元中有16個位元組位定址區bdata,其中可以定義8*16=128個邏輯變數。定義方法是: bdata bit LedState;但位類型不能用在數組和結構體中。

5、 其他不頻繁用到和對運算速度要求不高的變數都放到xdata區。

6、 如果想節省data空間就必須用large模式,將未定義內存位置的變數全放到xdata區。當然最好對所有變數都要指定內存類型。

7、 當使用到指針時,要指定指針指向的內存類型。

在C51中未定義指向內存類型的通用指針佔用3個位元組;而指定指向data區的指針只佔1個位元組;指定指向xdata區的指針佔2個位元組。如指針p是指向data區,則應定義為: char data *p;。還可指定指針本身的存放內存類型,如:char data * xdata p;。其含義是指針p指向data區變數,而其本身存放在xdata區。

liuph 發表於 >2006-8-22 11:25:44 [全文] [評論] [引用] [推薦] [檔案] [推給好友] [收藏到網摘]

2006-8-22
KEIL 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 Fil

Ⅱ 有沒有PB9反編譯工具,提供一個

現在最強大的PB反編譯軟體是Shudepb,幾乎能夠反編譯當前所有的PB版本,但是是收費的,能找到試用版。這個目前應該沒有免費版的。
還有一個比較好的反編譯軟體,用的也是比較多的,是PBKILLER,但是支持的版本有限,應該只支持PB9以前的版本。這個也是使用比較廣的。

Ⅲ pb9.0打開數據窗口時,出現應用程序錯誤。希望遇到的兄弟幫幫忙

你好,電腦出現:【該內存不能為read】,這是你安裝的「軟體」和電腦中的「內存」有沖突!

【答案原創,引用請說明作者:力王歷史滲虛】,偶然出現,點【取消】即可!

1。電腦里有【木馬或病毒】干擾,下載「360安全衛士」和「360殺毒雙引擎版」或「金山衛士」和「金山毒霸」,建議「全盤掃描」病毒和木馬,修補電腦上的「高危」和「重要」的【系統漏洞】!【系統修復】,一鍵修復!【插件清理】,立即清理【惡評插件】!
2。【可疑啟動項】,下載「360系統急救箱」,或打開360安全衛士,【功能大全】里的「360系統急救箱」,開始急救,完畢後,重啟電腦!開機後,【文件恢復區】,點開:可疑啟動項和木馬,徹底刪除文件!
再:【系統修復】,全選,立即修復!【網路修復】,開始修復。重啟電腦!
【搏賣金山急救箱】,勾選【擴展掃描】,立即掃描,完畢後,立即處理,重啟電腦!
3。你下載的「播放器」,或「聊天軟體」,或「IE瀏覽器」,或「游戲」的【程序不穩定】,或者「版本太舊」!建議卸掉,下載新的,或將其升級為【最新版本】!IE瀏覽器,和測試版軟體不推薦升級!
4。就是你安裝了兩款或兩款以上的同類軟體(如:兩款播放器,兩款qq,或多款瀏覽器,多款殺毒軟體叢銀燃,多款網游等等)!它們在一起【互不兼容】,卸掉「多餘」的那一款!
5。你在電腦左下角「開始」菜單里找到【強力卸載電腦上的軟體】,找到多餘的那款卸掉! 卸完了再「強力清掃」(看準了再卸,別把有用的卸了)!完畢後,重啟電腦!
6。再不行,開始菜單,運行 ,輸入cmd, 回車,在命令提示符下輸入【復制即可】 :
for %1 in (%windir%\system32\*.ocx) do regsvr32 /s %1
粘貼,回車,完畢後,再輸入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
回車!直到屏幕滾動停止為止,重啟電腦!
7。再不行,去網上下載一個【read修復工具】,修復一下試試!注意查殺一下病毒和木馬!
8。重啟電腦,開機出完電腦品牌後,按「F8」,進到「安全模式」,游標選定:【最後一次正確設置】,回車,回車,看看效果如何!
實在不行就:【一鍵還原系統或重裝系統】!

閱讀全文

與PB9編譯後的取值和之前不一樣相關的資料

熱點內容
哪個app支持掃花唄 瀏覽:834
著色器編譯程序 瀏覽:579
怎樣看app所屬文件夾 瀏覽:539
如何把網頁轉化為pdf 瀏覽:715
模型機去哪個app買好 瀏覽:678
有源晶振接單片機 瀏覽:1000
壓縮機啟動電容接線 瀏覽:226
寫塊的命令是 瀏覽:538
androidhook插件 瀏覽:381
小學一年級語文pdf 瀏覽:751
安卓如何修改全部文件 瀏覽:945
程序員怎麼管理自己 瀏覽:345
罪案心理小組哪個app可以看 瀏覽:753
編譯鏈接程序基本結構 瀏覽:880
office2010把pdf轉word 瀏覽:231
linux中執行命令 瀏覽:781
集郵的app哪個好 瀏覽:854
wq文件夾是什麼意思 瀏覽:668
光遇安卓什麼時候復刻聖島先祖 瀏覽:86
機械凈工作生產率的演算法 瀏覽:983