當前位置:首頁 » 操作系統 » 灰色項目源碼

灰色項目源碼

發布時間: 2023-01-22 19:59:05

⑴ DELPHI 里程序的版本信息怎麼是灰色的,無法更改

耐心讀以下說明,應該能解決你的問題,如果不能解決,請Hi我~

如何給自己的dll文件添加版本信息呢?
首先建立一個文件後綴為.rc(以ver.rc為例),用記事本打開,拷貝下面內容:
("//"號為注釋,會被編譯器丟棄,這里只是為了說明才加上的。)

VS_VERSION_INFO VERSIONINFO //版本信息結構
FILEVERSION 1,0,0,1 //顧名思義文件版本,就是在屬性頁版本上面顯示的|
PRODUCTVERSION 1,0,0,1 //顧名思義產品版本 |這里是主版本信息
FILEFLAGSMASK 0x3fL //這里設為0x3fL就好了 |
#ifdef _DEBUG
FILEFLAGS 0x1L //VS_FF_DEBUG包括debug信息
#else
FILEFLAGS 0x0L //無
#endif
FILEOS 0x4L //對應於delphi中VOS__WINDOWS32,說明程序是win32程序
FILETYPE 0x2L //文件類型,$2是dll,$1是exe
FILESUBTYPE 0x0L //文件子類型,一般設為0即可
BEGIN
BLOCK "StringFileInfo" //這里設置文件其他的版本信息(詳細信息)
BEGIN
BLOCK "080403A8" //所用語言080403A8簡體中文,040904b0英語(美國)
BEGIN
VALUE "Comments", "My Dll Application test" //備注
VALUE "CompanyName", "JJony\0" //公司名
VALUE "FileDescription", "xxx.dll\0" //產品描述
VALUE "FileVersion", "1. 0. 0. 1\0" //文件版本
VALUE "InternalName", "" //內部名稱
VALUE "LegalCopyright", "Copyright (C) 2006.6\0" //版權信息
VALUE "OriginalFilename", "xxx.dll\0" //源文件名
VALUE "ProctName", "xxx.dll\0" //產品名
VALUE "ProctVersion", "1. 0. 0. 1\0" //產品版本
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 0x03A8 //這里是關鍵哦,決定了是什麼語言
END //0x0804, 0x03A8簡體中文
END //0x0409, 0x04b0英語(美國)

你看出了什麼沒有,實際上就是填充了delphi中的VS_VERSIONINFO和VS_FIXEDFILEINFO結構,
只不過這裡面的語言格式是VC的罷了:)

把上面存為.rc文件(以ver.rc為例)。
拷貝delphi7\bin\brcc32.exe到你的程序目錄,
再建立ver.bat,輸入:

brcc32 ver.rc

保存。

雙擊運行ver.bat,生成ver.res,然後在你的dll工程里添加資源{$R ver.res}
重新編譯dll,你會發現dll也有了自己的版本信息了

⑵ 如何評估搭建網站的成本有可行方案介紹嗎

很多初創型企業或者初學者喜歡自己研究如何搭建一個網站,因為這樣不僅能夠學到一些關於網站建設的一些基礎知識,還能夠省下一大筆成本。其實如果是搭建一個模板網站並不需要會太高端的編程技術,我們如果有足夠的時間和精力去研究並且有一些前端開發及UI設計的基礎知識就最好不過了。話不多說,步入正題。

一、准備域名

域名也可以說是網址,可以選擇自行注冊也可以購買二手域名。兩種方法都可以,具體看你自己怎麼選擇。需要 注意的是使用國內的虛擬主機或者雲伺服器需要將域名備案,所以在第二部購買虛擬主機或雲伺服器時盡可能的選擇國外的產品,域名如何備案我們後面講解。下面分別介紹一下這兩種獲得域名域名的方式:

1.自行注冊可以根據自己網站的名稱或者公司名稱來編排,這樣方便我們記憶也有助於提升網站和企業的關聯度。注冊域名可以在阿里雲、網路雲、騰訊雲、西部數碼等這樣的大平台,選擇其中一個就可以了。一般注冊域名都會選擇常見的.com後綴,.com後綴的域名一年的價格在60元左右。

西部數碼注冊域名

2.購買二手域名不建議輕易嘗試,因為很多二手域名都是之前做過灰色項目而被微信、QQ、360等屏蔽了的,購買二手域名時需要注意盡量挑選簡短並且方便記憶的域名,在挑選的時候一定要查詢該域名有沒有被幾個主流平台屏蔽,如果是被屏蔽的域名後期使用的過程中容易報毒。二手域名也可以在西部數碼、聚名網等平台購買。

篩選二手域名

檢測是否被QQ攔截

檢測是否被360攔截

以上就是我們准備域名的兩種方式,新注冊域名一般就在幾十元,二手域名也是幾十元左右(備案或者比較簡短的域名價格會略高),新注冊域名5字母、雙拼的基本沒有了,二手域名雙拼域名基本都上千元了。所以要是我能早幾年入行,我那時候多注冊一點簡短有意義的域名我現在就發了。

二、購買虛擬主機或雲伺服器

在購買之前,需要了解什麼是雲伺服器什麼是虛擬主機。虛擬主機和雲伺服器主要有以下幾個區別:

雲伺服器支持彈性擴展,按需付費,而虛擬主機不支持雲伺服器可自行配置所需要的環境,虛擬主機不支持,購買時候要確定好需要什麼環境的配置雲伺服器內存、帶寬、硬碟、處理器等都為獨享資源,而虛擬主機是共享的雲伺服器能夠使用遠程桌面連接管理,而虛擬主機智能通過ftp等工具進行連接管理從以上區別可以看出,雲伺服器的優勢遠比虛擬主機要多。但是我們今天要講的是如何花最少的錢來搭建一個模板網站,所以你不是搭建一個游戲或者大型商城,一般的展示模板網站使用虛擬主機完全足夠了。

前面我們說了,如果購買國內雲伺服器或者虛擬主機需要使用備案域名,那麼覺得備案麻煩並且不想等待十幾天時間的可以購買二手備案域名(注意買之前查一下有沒有被360、QQ、微信等攔截報毒),或者直接用國外的虛擬主機,由於機房距離越遠訪問速度就會越慢,所以盡量不要選擇美國、德國等地的伺服器或虛擬主機。國內站長們常用的基本都是香港伺服器,雖然香港也屬於中國,但確實使用香港的伺服器或域名不需要備案。

預算足夠的用戶可以直接上雲伺服器,雲伺服器通過安裝寶塔面板用起來是真的非常的方便(後面會專門為大家講到)。不想用與伺服器的跟我往下看哪裡可以購買虛擬主機,同樣是西部數碼、網路雲、阿里雲等平台購買即可。因為我們常用的是西部數碼,所及截圖是西部數碼的購買界面,其他平台購買方式一樣的。

購買免備案主機

選擇合適的虛擬主機

填寫信息並下單支付

三、准備網站源碼上傳至虛擬主機

網站源碼也很關鍵,需要找的一個自己喜歡的網站的源碼真的非常不容易,目前源碼比較多較為全面的平台有淘寶、互站網、織夢58等。輸入所需網站的關鍵詞就能找到,我們以搜索「裝修公司源碼」為例:

淘寶查找源碼

互站網查找源碼

源碼准備好之後就應該上傳到虛擬主機了。上傳到虛擬主機的之前需要准備一個FTP工具,購買虛擬主機的時候平台都會有推薦的,比如西部數碼推薦的是leapftp,而我個人常用的是8UFTP,功能都差不多,只不過我用的久了習慣用這個了。安裝好FTP工具之後在虛擬主機管理首頁查看自己的FTP連接信息,連接成功就可以將我們的源代碼上傳到網站根目錄了(一般網站根目錄是wwwroot這個文件夾,也有的是WEB這個文件夾)。為保證文件上傳成功率請盡量上傳壓縮包,然後在虛擬主機管理後台解壓文件。

查看FTP登錄信息

連接到FTP並將源碼拖到根目錄

文件解壓縮

四、解析域名及綁定域名

解析域名也就是說我們要告訴域名一個地址,如果有人訪問你了你就把他導航到對應的這個虛擬主機。

綁定域名也就是有域名把訪客導航到虛擬主機的門口了,但是虛擬主機不清楚該讓誰進門,所以需要提前綁定一個域名,這樣就相當於只要是這個域名導航過來的訪客都可以讓他進門,其他域名導航過來的就不能進門。

只有我們綁定了域名並且解析了才能夠實現域名和虛擬主機的互通。綁定域名的時候一般講帶www的和不帶www的都綁定一下,因為每個用戶訪問的習慣不一樣。

⑶ 網頁代碼全為灰色不能編輯怎麼辦

在這里,在這里我就不給你講dreamweaver的使用了,只講總結性的東西,要注意的技巧吧,在最後,也會寫一兩個用DW做的簡單特效實例。

隨便打開一個網頁,點擊查看,再點源代碼,一般都可以看到這個網頁的代碼,做網頁說白了,也就是把文字、圖象等多媒體效果有機的結合在一起,DW和FP等只是書寫代碼的利器,只要你知道代碼,用記事本也一樣能做出精美的網頁(真正的高手據說就是用記事本做網頁),但對我們初學者來說,沒有必要去記代碼,只需知道利用DW或FP,能實現哪些操作,就象用WORD一樣,畫一條線就有一條線,畫一個表格就有一個表格,在軟體的演示窗口裡,有著同WORD一樣所見即所得的最後效果察看。因此,可以說,做網頁入門很簡單!可後面還有半句話:做好網頁不簡單!因為,一個好的網頁,不單單是代碼書寫,更重要的是美工設計,內容的充實。雖然很多代碼不需要一一手工書寫,可有些代碼的基本組織結構了解一些,還是對做網頁大有幫助的。我們可以這樣學習、研究代碼:在用DW或FP中做了某一個操作,把效果與上面的代碼窗口比較一下,就可以知道什麼代碼是實現什麼效果的,還可以通過查看別人的網頁的源代碼分析學習。想學ASP網頁的朋友們,有些基本代碼是非記不可的。

現在很多做網頁的人,都是用借雞生蛋的辦法做的網頁,做法是從網上下載現成的網頁模板,對模板稍加更改,替換下內容成了。當然,這也是新手們做網頁速成的一種好辦法。模板在很多有提供空間的網站都有下載。很多以前收錄的網址,現在打開都沒有用了,在這里,能提供給大家的,只有這些了。
1.源代碼下載:要下載ASP源代碼的可以到「中國站長站」去,網址:http://www.chinaz.com/download/,這是個比較權威的源代碼下載點,在這里下到動網源碼,說不定可以下到動網7.0 for SQL Server版本(excelhome的論壇就是用這個版本)。
2.網頁圖片及音樂等素材:http://www.dabaoku.com/sucai/shejilei/bj/
3.網頁特效代碼:推建一個小工具:「水晶情緣網頁特效專家」,有1M,本來想發上來,太大了,算了,要的話,留下郵箱,我發過去。如,下雪的效果,滑鼠滑動效果等,這里都有。

下面我把一些常用的寫下來,以供大家參考:

DREAMWEAVER常用標記:(都是以前記的一些筆記了)
標記一般成對出現,一個表示特定代碼部分的開始,另一個表示特定代碼部分的結束(表示結束的前面帶"/"符號),但也不是絕對的,比如,<br>標記。基本的HTML標記:html、head和body必不可少。

1. <head>和</head>標記中僅包含網頁標題(如<title>我的網頁</title>)和程序腳本

2. <body></body>標記中包含網頁的全部內容。是網頁的主體部分。

3. <center>和</center>:是中間內容居中標記;

4. <h2>和</h2>:從h1~h6,將文本標注為標題,通常要比正文粗大,h1最大;

5. <p>和</p>:段落標記,在行與行之間添加額外的空白行;

6. <br>:強行換行標記,插入單行,不需要封閉標記

7. 圖象標記:<img src="aaa\\bbb.gif" width="500" height="198" align="center">

align水平對齊(left、right或center),valign垂直對齊(top,bottom或middle),border邊框寬度

alt="滑鼠放在圖片上時出現的提示文字"

8. <p><font size="3"><b>本行字元將以粗體顯示</b></font></p>

9. <p><font size="3"><i>本行字元將以斜體顯示</i></font></p> (<i>等效於<em>)

10.<p><font size="3" face="宋體" color="#RRGGBB">本行字元將宋體顯示</font></p>

11. <a href="test.htm">點擊此處文字打開鏈接的網頁</a> :該處文字有下劃線標示

12. <HR>顯示一長灰色細線,分割網頁為上下兩部分。可以只用單邊。完整的如下:

<HR align=center width="100%" SIZE=1>顯示一灰色矩形,SIZE為1時,寬為1(很細,可看作一直線)

13.<LI>在文字前出現一個圓點的項目符號</LI>,可單個使用,也可結合<br>使用

14.<OL type=2 start=1><li>標記</li><li>區段</li></ol>:控制項目序號及顯示方式,如1,2,3

15.<UL>使該段文字首行和下面都縮進約兩個字元</UL>

16.<BLOCKQUOTE>使該段文字整體都縮進約兩個字元,可以多重使用<BLOCKQUOTE>

17.<SUP>這是上標字</SUP>,<SUB>這是下標字</SUB>,<U>這是加下劃線字</U>

18.<TT>這是Windows的等寬字</TT>

19.<FONT SIZE=+1>字體放大一級</FONT>

20.<DL><DT>語言<DD>基礎要素</DL>:「語言」顯示為列表標題,「基礎要素」顯示為列表內容,自動縮進。

21.<DIV Align="Right">這是右對齊的段落一<P>這是右對齊的段落二<P></DIV>默認為左對齊方式。

表格及其標志:Align:水平,Valign:垂直。Align或Valign寫在<TR >中時表該行的幾個列都用同一方式。

22<BLINK>閃爍</BLINK>:標記中的文字實現閃爍效果,但並不適用於所有的瀏覽器。

23.<TABLE BORDER=1> <TR><TD>第一列第一欄</TD><TD>第一列第二欄</TD></TR>

<TR BgColor="yellow"><TD >第二列的第一欄</TD><TD>第二列的第二欄</TD></TR>

<TR><TD Align="Left" Valign="Center">水平:左對齊<br>垂直:居中</TD></TR></TABLE>

BgColor可寫在<TABLE>、<TR>、<TD>中,分別為整個表格、整行、單一單元格的背景顏色設置。

以上是我以前筆記中收錄的一些常用的標記,今天看到lfspecter大蝦也發了一些關於網頁的帖子,可以兩邊對照著看,側重點各有不同,也許更有利於初學者的理解,鏈接如下:http://club.excelhome.net/dispbbs.asp?boardID=100&;ID=78021&page=1

技巧篇:
1. 在<BODY>標簽中可以規定整個文檔的一些基本屬性:
"bgcolor":指定html文檔的背景色。
"text":指定html文檔中文字的顏色。
"link":指定html文檔中待連接超鏈接對象的顏色。
"alink":指定html文檔中連接中超鏈接對象顏色。
"vlink":指定html文檔中以連接超鏈接對象顏色。
"background":指定html文檔的背景文件。 有兩種方式表示顏色對象: <body bgcolor="green">或<body bgcolor="#00FF00">。文檔主體部分可用顏色列表:black 黑色 Red 紅色 Line 石灰色 Maroon 栗色 Gray 灰色 Silver 銀白色 Navy 海軍藍 Olive 橄欖綠 Purple 紫色 Yellow 黃色Aqua 淺綠色 Blue 藍色 Green 綠色 Fuchsia 紫紅色 White 白色 Teal 暗藍綠

2. 瀏覽器的狀態列提示文字控制
(1).滑鼠經過:<a href="tpage.htm" onMouseOver="window.status=\'相關提示\'; return true">頁面上滑鼠經過的文字<a>
(2).改變狀態欄提示文字:打開"Behaviors"行為編輯窗,單擊"+"按鈕,選擇"Set Text Set"下的"Text Of Status Bar"選項,然後在方框中輸入自己的文字,例如"歡迎來到我的主頁"等,單擊"確定"即可。

3.鏈接控制:
a. 返回前頁:使用OnClick="history.go(-1)"
返回主頁:使用OnClick=\'top.location.href="../index.html"\'
b. 鏈接提示:在鏈接語句中增加,如:去哪兒? (在點擊鏈接前注意看狀態行顯示的變化)
OnMouseOver="window.status=\'這里是 ...\'; return true" OnMouseOut="window.status=\'\'; return true"
c. 鏈接的不同方式:
在幀里顯示:在鏈接處加target="main"語句,其中main為幀名
整頁顯示:在鏈接處加target="_top"語句
開新窗口:在鏈接處加target="resource window"語句,如<A HREF="index.htm" TARGET="resource window"></A>
d. 強制主頁每次都不進行緩存,而從伺服器上重讀
在Head部分加<MEAT HTTP-EQUIV="Pragma" CONTENT="no-cache">
e. 自動刷新
定時刷新:<META HTTP-EQUIV="Refresh" content="10; URL=http://自己的URL">
幻燈片效果:語句類似上面,但在頁面1中URL指向頁面2,而頁面2指向頁面3 ... 頁面n指回頁面1,即可實現循環顯示頁面的效果。
f. 在某一個時間內自動鏈接到其他主頁,這只需在〈title〉######〈/title〉之後加入下面這一行即可:
〈meta http-equiv="refresh" content="20; url=otherpage.htm"〉("20"代表二十秒後連到另一個主頁)
h. 在打開指定網頁的同時打開另一指定網頁\'next.htm,只需在指定網頁的body中加入指令onload:
<html><body onload="parent.banner.location.href=\'next.htm\'">指定打開的一個網頁內容</body>

4. 設置"添加到收藏夾"鏈接:
選中"添加到收藏夾"文字,在屬性面板中的鏈接(Link)中輸入:"javascript :window.external.AddFavorite (\'http://www.excelhome.net\',\'學習之家\')"。點擊此鏈接時會彈出對話框,可以將你的主頁地址加到收藏夾中。

5.文字移動動態效果:
1) 文字從右移到左邊:<marquee><b>大家好</b>歡迎您經常光臨!</marquee>
2) 讓文字在固定的區域內出現從下到上的滾動效果:
例1:<table height=542 cellspacing=0 cellpadding=0 width=800 border=0>
<tr><td valign=center align=middle width=316 height=405>
<marquee scrollamount=1 scrolldelay=140 direction=up width=382 height=403><center>謹以此網站送給xxx
<font color=#ff0000></font></center><br>此處為長篇大論!</marquee></td></tr></table>
例2:<body><div align="center"><p><marquee aligh=left bgcolor=#FFFED7 direction=up behavior=scroll height=100
hspace=1 scrollamount=2 Scrolldelay=1 width=250 VSpace=1 loop=-1>
<font color="#FF0000" size="5" face="方正大黑簡體">望 岳</font><br> <br>
<font color="#FF0000">岱宗夫如何,齊魯青未了。<br>造化鍾神秀,陰陽割昏曉。<br>湯胸生層雲,決眥入歸鳥,<br>會當凌絕頂,一覽眾山小。<br></font></marquee></p></div></body></html>
3) 在指定寬度內移來移去的文字代碼:<TD height=20><P align=center><MARQUEE scrollDelay=120 direction=right
behavior=alternate width=150 height=12>產品導航</MARQUEE></P></TD>

6.E-mail鏈接:
選中字或圖片,在屬性中設置Alt為"給我來信",鏈接為"mailt [email protected]",在瀏覽器中單擊此圖,就會啟動發送郵件窗口。在鏈接地址前加"#"符號,可以在網頁中不打開實際鏈接。

7.動畫背景為透明:
選中Flash(gif),在源代碼</object></p>前加入代碼:<param name="wmode" value="transparent">。或文件屬性欄里 "參數"輸入wmode,value="transparent"。

8.浮動背景圖象(主頁內容向下滾動而背景圖象不動的效果):
(1).<body backgroud="image.jpg" bgproperties="fixed">
(2).在Dreamweaver中用「Text」-「Custom Style」-「Edit Style Sheet」-「New」-Redefine HTML Tag中選擇Body,然後在Background中的Attachment里選fixed

9.滾動條換顏色:
默認的網頁滾動條是灰色,在網頁代碼<head></head>里插入一對<style></style>標簽,標簽里寫入下面的代碼:
body {SCROLLBAR-FACE-COLOR:#3333FF;(立體滾動條凸出部分的顏色)
SCROLLBAR-HIGHLIGHT-COLOR:#505050;(滾動條空白部分的顏色)
SCROLLBAR-SHADOW-COLOR:#fc2400;(立體滾動條陰影的顏色)
SCROLLBAR-ARROW-COLOR:#666666;(上下按鈕上三角箭頭的顏色)
SCROLLBAR-BASE-COLOR:#333333; (滾動條的基本顏色)
SCROLLBAR-DARK-SHADOW-COLOR:#b4fc48} (立體滾動條強陰影的顏色)
後面的16位顏色值你可以隨意更改,括弧內是解釋說明,在輸入時請不要插入。

10.背景音樂:
body中加入以下任一個代碼(建議為midi格式的):
顯示操作面板:在相應地方加:
<embed src="aladdin.mid" width="140" height="35" autostart=true controls="middleconsole">
不顯示操作面板:在頁中任意地方加<embed src="aladdin.mid" hidden=true autostart=true loop=true>
<bgsound src=音樂路徑 loop=次數>-1為無數次
<embed src=音樂路徑 width=0 height=0>

11.在Dreamweaver中輕松設置行間距:
用層疊樣式表(CSS)來實現,在Dreamweaver中編輯層疊樣式表不用編寫代碼,具體操作方法如下:
(1)在快速啟動欄中點擊層疊樣式表按鈕("show css styles"按鈕),在彈出的CSS Styles面板上雙擊(none);
(2)此時,可看到彈出的Edit Style Sheet 面板,在該面板上按New按鈕;
(3)再在彈出的New Style 面板上點取Redefine HTML Tag(重新定義HTML標記),再在Tag中選擇"body"標記後按OK按鈕;
(4)這時可看到彈出的Style dehinition for body 的對話框,在此對話框中可以設置"body"標記的許多屬性,可以按你的意願設置,但我們這里主要是要設置行距,所以在line屬性輸入框中填上行距的像素點數,現在流行的九號字,行距一般用12,按OK按鈕返回到Edit Style Sheet 面板,此時已把"body"的行距設置好了;
(5)由於"body"中定義的行距對表格不起作用,所以再在Edit Style Sheet 面板上再按New按鈕;
(6)再在彈出的New Style
參考資料:http://www.dreamest.net/

⑷ 做靜態代碼分析都是用那個軟體的

本文首先介紹了靜態代碼分析的基本概念及主要技術,隨後分別介紹了現有 4 種主流 Java 靜態代碼分析工具 (Checkstyle,FindBugs,PMD,Jtest),最後從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟體開發人員了解靜態代碼分析工具,並選擇合適的工具應用到軟體開發中。


引言

在 Java 軟體開發過程中,開發團隊往往要花費大量的時間和精力發現並修改代碼缺陷。Java 靜態代碼分析(static code analysis)工具能夠在代碼構建過程中幫助開發人員快速、有效的定位代碼缺陷並及時糾正這些問題,從而極大地提高軟體可靠性並節省軟體開發和測試成 本。目前市場上的 Java 靜態代碼分析工具種類繁多且各有千秋,因此本文將分別介紹現有 4 種主流 Java 靜態代碼分析工具 (Checkstyle,FindBugs,PMD,Jtest),並從功能、特性等方面對它們進行分析和比較,希望能夠幫助 Java 軟體開發人員了解靜態代碼分析工具,並選擇合適的工具應用到軟體開發中。

靜態代碼分析工具簡介

什麼是靜態代碼分析

靜態代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結構、過程、介面等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現的空指針引用等等。

在軟體開發過程中,靜態代碼分析往往先於動態測試之前進行,同時也可以作為制定動態測試用例的參考。統計證明,在整個軟體開發生命周期中,30% 至 70% 的代碼邏輯設計和編碼缺陷是可以通過靜態代碼分析來發現和修復的。

但是,由於靜態代碼分析往往要求大量的時間消耗和相關知識的積累,因此對於軟體開發團隊來說,使用靜態代碼分析工具自動化執行代碼檢查和分析,能夠極大地提高軟體可靠性並節省軟體開發和測試成本。

靜態代碼分析工具的優勢

1. 幫助程序開發人員自動執行靜態代碼分析,快速定位代碼隱藏錯誤和缺陷。

2. 幫助代碼設計人員更專注於分析和解決代碼設計缺陷。

3. 顯著減少在代碼逐行檢查上花費的時間,提高軟體可靠性並節省軟體開發和測試成本。


Java 靜態代碼分析理論基礎和主要技術

  • 缺陷模式匹配:缺陷模式匹配事先從代碼分析經驗中收集足夠多的共性缺陷模式,將待分析代碼與已有的共性缺陷模式進行模式匹配,從而完成軟體的安全分析。這種方式的優點是簡單方便,但是要求內置足夠多缺陷模式,且容易產生誤報。

  • 類型推斷:類型推斷技術是指通過對代碼中運算對象類型進行推理,從而保證代碼中每條語句都針對正確的類型執行。這種技術首先將預定義一套類型機制,包括類 型等價、類型包含等推理規則,而後基於這一規則進行推理計算。類型推斷可以檢查代碼中的類型錯誤,簡單,高效,適合代碼缺陷的快速檢測。

  • 模型檢查:模型檢驗建立於有限狀態自動機的概念基礎之上,這一理論將被分析代碼抽象為一個自動機系統,並且假設該系統是有限狀態的、或者是可以通過抽象歸 結為有限狀態。模型檢驗過程中,首先將被分析代碼中的每條語句產生的影響抽象為一個有限狀態自動機的一個狀態,而後通過分析有限狀態機從而達到代碼分析的 目的。模型檢驗主要適合檢驗程序並發等時序特性,但是對於數據值域數據類型等方面作用較弱。

  • 數據流分析:數據流分析也是一種軟體驗證技術,這種技術通過收集代碼中引用到的變數信息,從而分析變數在程序中的賦值、引用以及傳遞等情況。對數據流進行 分析可以確定變數的定義以及在代碼中被引用的情況,同時還能夠檢查代碼數據流異常,如引用在前賦值在後、只賦值無引用等。數據流分析主要適合檢驗程序中的 數據域特性。

  • 現有主流 Java 靜態分析工具

    Checkstyle

    Checkstyle 是 SourceForge 的開源項目,通過檢查對代碼編碼格式,命名約定,Javadoc,類設計等方面進行代碼規范和風格的檢查,從而有效約束開發人員更好地遵循代碼編寫規范。

    Checkstyle 提供了支持大多數常見 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下圖 1 所示,Checkstyle 對代碼進行編碼風格檢查,並將檢查結果顯示在 Problems 視圖中。圖中,代碼編輯器中每個放大鏡圖標表示一個 Checkstyle 找到的代碼缺陷。開發人員可通過在 Problems 視圖中查看錯誤或警告詳細信息。


  • 圖 1. 使用 Checkstyle 進行編碼風格檢查


  • 此外,Checkstyle 支持用戶根據需求自定義代碼檢查規范,在下圖 2 中的配置面板中,用戶可以在已有檢查規范如命名約定,Javadoc,塊,類設計等方面的基礎上添加或刪除自定義檢查規范。


  • 圖 2. 使用 Checkstyle 添加自定義代碼檢查規范


  • FindBugs

    FindBugs 是由馬里蘭大學提供的一款開源 Java 靜態代碼分析工具。FindBugs 通過檢查類文件或 JAR 文件,將位元組碼與一組缺陷模式進行對比從而發現代碼缺陷,完成靜態代碼分析。FindBugs 既提供可視化 UI 界面,同時也可以作為 Eclipse 插件使用。文本將主要使用將 FindBugs 作為 Eclipse 插件。在安裝成功後會在 eclipse 中增加 FindBugs perspective,用戶可以對指定 Java 類或 JAR 文件運行 FindBugs,此時 FindBugs 會遍歷指定文件,進行靜態代碼分析,並將代碼分析結果顯示在 FindBugs perspective 的 bugs explorer 中,如下圖 3 所示:


  • 圖 3. 使用 FindBugs 進行靜態代碼分析


  • 圖中 Bug Explorer 中的灰色圖標處為 Bug 類型,每種分類下紅色圖標表示 bug 較為嚴重,黃色的圖標表示 bug 為警告程度。Propreties 列出了 bug 的描述信息及修改方案。

    此外,FindBugs 還為用戶提供定製 Bug Pattern 的功能。用戶可以根據需求自定義 FindBugs 的代碼檢查條件,如下圖 4 所示:


  • 圖 4. 使用 FindBugs 添加自定義代碼檢查規范


  • PMD

    PMD 是由 DARPA 在 SourceForge 上發布的開源 Java 代碼靜態分析工具。PMD 通過其內置的編碼規則對 Java 代碼進行靜態檢查,主要包括對潛在的 bug,未使用的代碼,重復的代碼,循環體創建新對象等問題的檢驗。PMD 提供了和多種 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式與 Eclipse 集成。如下圖 5 所示:在 Violations Overview 視圖中,按照代碼缺陷嚴重性集中顯示了 PMD 靜態代碼分析的結果。


  • 圖 5. 使用 PMD 進行靜態代碼分析


  • PMD 同樣也支持開發人員對代碼檢查規范進行自定義配置。開發人員可以在下圖 6 中的面板中添加、刪除、導入、導出代碼檢查規范。


  • 圖 6. 使用 PMD 添加自定義代碼檢查規范


  • Jtest

    Jtest 是 Parasoft 公司推出的一款針對 Java 語言的自動化代碼優化和測試工具,Jtest 的靜態代碼分析功能能夠按照其內置的超過 800 條的 Java 編碼規范自動檢查並糾正這些隱蔽且難以修復的編碼錯誤。同時,還支持用戶自定義編碼規則,幫助用戶預防一些特殊用法的錯誤。Jtest 提供了基於 Eclipse 的插件安裝。Jtest 支持開發人員對 Java 代碼進行編碼規范檢查,並在 Jtask 窗口中集中顯示檢查結果,如下圖 7 所示:


  • 圖 7. 使用 Jtest 進行靜態代碼分析


  • 同時,Jtest 還提供了對用戶定製代碼檢查配置甚至自定義編碼規則的支持,這一功能使得開發人員可以基於不同場景定製所需要的編碼規范,如圖 8 所示:


  • 圖 8. 使用 Jtest 添加自定義代碼檢查規范

  • Java 靜態分析工具對比

    本章節將從以下幾個方面對上述 Java 靜態分析工具進行比較:

    應用技術及分析對象

    下表 1 列出了不同工具的分析對象及應用技術對比:


  • 表 1. 不同工具的分析對象及應用技術對比

  • Java 靜態分析工具

    分析對象

    應用技術

    Checkstyle Java 源文件 缺陷模式匹配

    FindBugs 位元組碼 缺陷模式匹配;數據流分析

    PMD Java 源代碼 缺陷模式匹配

    Jtest Java 源代碼 缺陷模式匹配;數據流分析


    內置編程規范

    Checkstyle:

  • Javadoc 注釋:檢查類及方法的 Javadoc 注釋

  • 命名約定:檢查命名是否符合命名規范

  • 標題:檢查文件是否以某些行開頭

  • Import 語句:檢查 Import 語句是否符合定義規范

  • 代碼塊大小,即檢查類、方法等代碼塊的行數

  • 空白:檢查空白符,如 tab,回車符等

  • 修飾符:修飾符號的檢查,如修飾符的定義順序

  • 塊:檢查是否有空塊或無效塊

  • 代碼問題:檢查重復代碼,條件判斷,魔數等問題

  • 類設計:檢查類的定義是否符合規范,如構造函數的定義等問題

  • FindBugs:

  • Bad practice 壞的實踐:常見代碼錯誤,用於靜態代碼檢查時進行缺陷模式匹配

  • Correctness 可能導致錯誤的代碼,如空指針引用等

  • 國際化相關問題:如錯誤的字元串轉換

  • 可能受到的惡意攻擊,如訪問許可權修飾符的定義等

  • 多線程的正確性:如多線程編程時常見的同步,線程調度問題。

  • 運行時性能問題:如由變數定義,方法調用導致的代碼低效問題。

  • PMD:

  • 可能的 Bugs:檢查潛在代碼錯誤,如空 try/catch/finally/switch 語句

  • 未使用代碼(Dead code):檢查未使用的變數,參數,方法

  • 復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環

  • 重復的代碼:檢查重復的代碼

  • 循環體創建新對象:檢查在循環體內實例化新對象

  • 資源關閉:檢查 Connect,Result,Statement 等資源使用之後是否被關閉掉

  • Jtest

  • 可能的錯誤:如內存破壞、內存泄露、指針錯誤、庫錯誤、邏輯錯誤和演算法錯誤等

  • 未使用代碼:檢查未使用的變數,參數,方法

  • 初始化錯誤:內存分配錯誤、變數初始化錯誤、變數定義沖突

  • 命名約定:檢查命名是否符合命名規范

  • Javadoc 注釋:檢查類及方法的 Javadoc 注釋

  • 線程和同步:檢驗多線程編程時常見的同步,線程調度問題

  • 國際化問題:

  • 垃圾回收:檢查變數及 JDBC 資源是否存在內存泄露隱患

  • 錯誤檢查能力

    為比較上述 Java 靜態分析工具的代碼缺陷檢測能力,本文將使用一段示例代碼進行試驗,示例代碼中將涵蓋我們開發中的幾類常見錯誤,如引用操作、對象操作、表達式復雜化、數 組使用、未使用變數或代碼段、資源回收、方法調用及代碼設計幾個方面。最後本文將分別記錄在默認檢查規范設置下,不同工具對該示例代碼的分析結果。以下為 示例代碼 Test.java。其中,代碼的注釋部分列舉了代碼中可能存在的缺陷。


  • 清單 1. Test.java 示例代碼
  • package Test;import java.io.*;public class Test {/** * Write the bytes from input stream to output stream. * The input stream and output stream are not closed. * @param is * @param os * @throws IOException */public boolean (InputStream is, OutputStream os)throws IOException {intcount = 0;//缺少空指針判斷byte[] buffer =new byte[1024];while((count = is.read(buffer)) >= 0) {os.write(buffer,0, count);}//未關閉I/O流returntrue;}/** * * @param a * @param b * @param ending * @return the elements from a to b, and stop when meet element ending */publicvoid (String[] a, String[] b, String ending){intindex;String temp =null;//空指針錯誤System.out.println(temp.length());//未使用變數intlength=a.length;for(index=0; index&a.length; index++){//多餘的if語句if(true){//對象比較 應使用equalsif(temp==ending){break;}//缺少 數組下標越界檢查b[index]=temp;}}}/** * * @param file * @return file contents as striwww.fltbj.cn#ll if file does not exist */public void readFile(File file) {InputStream is =null;OutputStream os =null;try{is =new BufferedInputStream(newFileInputStream(file));os =new ByteArrayOutputStream();//未使用方法返回值(is,os);is.close();os.close();}catch (IOException e) {//可能造成I/O流未關閉e.printStackTrace();}finally{//空的try/catch/finally塊}}}



  • 通過以上測試代碼,我們對已有 Java 靜態代碼分析工具的檢驗結果做了如下比較,如下表 2 所示。


  • 表 2. Java 靜態代碼分析工具對比

    代碼缺陷分類

    示例

    Checkstyle

    FindBugs

    PMD

    Jtest

    引用操作 空指針引用 √ √ √ √

    對象操作 對象比較(使用 == 而不是 equals) √ √ √

    表達式復雜化 多餘的 if 語句 √

    數組使用 數組下標越界 √

    未使用變數或代碼段 未使用變數 √ √ √

    資源回收 I/O 未關閉 √ √

    方法調用 未使用方法返回值 √

    代碼設計 空的 try/catch/finally 塊 √


    由表中可以看出幾種工具對於代碼檢查各有側重。其中,Checkstyle 更偏重於代碼編寫格式,及是否符合編碼規范的檢驗,對代碼 bug 的發現功能較弱;而 FindBugs,PMD,Jtest 著重於發現代碼缺陷。在對代碼缺陷檢查中,這三種工具在針對的代碼缺陷類別也各有不同,且類別之間有重疊。

    總結

    本文分別從功能、特性和內置編程規范等方面詳細介紹了包括 Checkstyle,FindBugs,PMD,Jtest 在內的四種主流 Java 靜態代碼分析工具,並通過一段 Java 代碼示例對這四種工具的代碼分析能力進行比較。由於這四種工具內置編程規范各有不同,因此它們對不同種類的代碼問題的發現能力也有所不同。其中 Checkstyle 更加偏重於代碼編寫格式檢查,而 FindBugs,PMD,Jtest 著重於發現代碼缺陷。最後,希望本文能夠幫助 Java 軟體開發和測試人員進一步了解以上四種主流 Java 靜態分析工具,並幫助他們根據需求選擇合適的工具。

⑸ 怎麼讓keil代碼同時運行兩個函數

①混合編程的必要性:也就是為什麼需要混合編程,初學者一定會覺得,我C用的好好的為什麼要混進匯編呢,不是自找麻煩嗎?其實不然,最簡單的例子就是延時子程序,用C寫的話連你自己也不知道幾層的循環後確切地用多少時間吧?但用匯編寫你就能很准確地計算出要延時的時間。還有當你要對那些時序要求很高IC模塊或步進電機行操作時用匯編來寫就能做到操控的直接與精準。
②在進行實際操作前要弄清C與匯編之間的調用關系,C的函數大家都會用了,主要分為無反回參數的和有反回參數的,例如 void delay(void);就是無反回參數的,int readdata(void);就是有返回參數的。還有就是有參數傳遞和無參數傳遞的,void delay(void);就是無參數傳遞的,unsigned int add(unsigned char aa,unsigned char bb);就是有參數傳遞的函數。在教材上講起C與匯編的混合編程就會說起寄存器最多傳遞三個函數,這樣可以產生高效代碼。

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚

在參數返回時寄存器的傳遞規律為:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
下面我們用實際的混合編程操作來講講如何實現函數的調用及參數的傳遞。
打開KEIL,我的用的版本是綠色免安裝2.0中文版,編譯器為7.0:無程序代碼長度限制。現在有3.0版也是綠色免安裝版本,好處是已支持雙位元組中文注釋,但是英文版。用哪個版本都無所謂,只要用著習慣功能夠用就行。

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
下面是版本信息:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
在網上經常有朋友說為什麼我下載了KEIL解壓出目錄後運行卻不能編譯呢,老是報告出錯:
--- Error: can't execute 'E:\old_pc\txz001\單片機c51\KEIL4\C51\BIN\C51.EXE'
--- 錯誤: 不能執行 'E:\old_pc\txz001\單片機c51\KEIL2_70\Keil2\C51\BIN\C51.EXE'
這是由於編譯時,C51.exe編譯器沒能在你給出的路徑上找到。你需要修改路徑。
在選擇KEIL的菜單欄「工程」--「文件擴展名、書籍和編譯環境屬性」--「環境設置」的如下圖:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
看到上圖的「使用TOOLS.INI設定」前的鉤了嗎?對了,它是按照你TOOLS.INI里給出的路徑去找的。因此的得打開那個tools.ini文件修改它。KEIL的目錄結構一般是這樣的:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
我們KEIL軟體運行主程序uvision2是在目錄UV2里,而那個設置文件TOOLS.INI文件是在它的上一級目錄Keil里,見上圖。用記事本打開這個TOOLS.INI文件:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
看見紅筆圈出的[C51]下的路徑了嗎?將它修改正確指向你硬碟上KEIL下C51目錄,存檔,運行KEIL。就可以正確編譯了。(廢話又多了。。。)好!言歸正傳。
我們在KEIL里創建一個新的工程TEST1。在這個工程里我們添加了兩個文件,main.c和delay.c,程序如下:
文件main.c:
#include <AT89X52.H>
extern void delay(void);
main(void)
{
delay();
}
文件delay.c
#define uchar unsigned char
void delay(void)
{ uchar i;
for(i=255,i>0,i--);
}
可以看出,這兩個文件里的程序很簡單,主程序里先定義了一個外部函數delay();然後就調用了這個無參數函數。而文件delay.c里也就是用for循環做了255次循環。
下面我們先進行編譯,調試讓程序正確,通過編譯。然後我們選擇左邊工程窗口,選中文件delay.c,滑鼠右擊它出現下圖。

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
選擇「文件'delay.c'屬性」後如下圖:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚

見上圖,有「產生匯編文件」和「匯編源代碼文件」兩項前的鉤選框是灰色的,分別點擊它們兩次使它呈黑色鉤選狀態。如下圖。

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
點擊下面的確認鈕,回到主界面。這時你再進行一次全部的重新編譯,就會發現在你建立這個工程的目錄下將多產生一個delay.src文件。

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
用記事本打開這個delay.src文件。發現它就是一個匯編文件。
; .\delay.SRC generated from: delay.c
; COMPILER INVOKED BY:
; E:\old_pc\txz001\單片機c51\KEIL2_70\Keil\C51\BIN\C51.EXE delay.c BROWSE DEBUG OBJECTEXTEND SRC(.\delay.SRC)
NAME DELAY
?PR?delay?DELAY SEGMENT CO DE
PUBLIC delay
; #define uchar unsigned char
; void delay(void)
RSEG ?PR?delay?DELAY
delay:
USING 0
; SOURCE LINE # 2
; { uchar i;
; SOURCE LINE # 3
; for(i=255;i>0;i--);
; SOURCE LINE # 4
;---- Variable 'i?040' assigned to Register 'R7' ----
MOV R7,#0FFH
?C0001:
DJNZ R7,?C0001
; }
; SOURCE LINE # 5
?C0004:
RET
; END OF delay
END
可以看出原來的C程序都變成了匯編的注釋了。我們將注釋都去掉。
NAME DELAY
?PR?delay?DELAY SEGMENT CO DE
PUBLIC delay
RSEG ?PR?delay?DELAY
delay:
USING 0
MOV R7,#0FFH
?C0001:
DJNZ R7,?C0001
?C0004:
RET
END
現在看看是不是很簡呢。在標號delay:前是程序的說明,就是定義函數的名字,將代碼放在哪裡等,看不懂也沒關系,別亂改它就行。從delay:標號後就是匯編的程序部分了。裡面的標號最好也別亂改。添加你要操作的程序就行了,好!我們先不改動程序,就將上面十行匯編別存為delay.asm文件。回到KEIL界面,我們在工程窗里(是KEIL主界面左邊的工程窗口而不是在工程目錄里)的將delay.c刪除。然後再添加上delay.asm程序,如下圖:

KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚

這樣,你再進行編譯,你會發現你已經通過了混合編程的編譯,雖然這次你對程序的功能什麼都沒有改變,但你已經知道如何做出一個C程序調用匯編子程序的例子了。下面我們可以對這個匯編了程序進行一些修改看它是否仍能很好的工作。
今天我們就來對那個匯編的delay子程序進行修改,為了讓運行的結果能顯示出來,我先加進一個LCD的顯示子程序12864put.c。
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
我們先修改主程序如下:
//****************
// 主函數
//****************
main(void)
{ uchar aa,bb;
TMOD=0x01;//定義T0為模式1即16位計數方式
TH0=0;//將計數器高位初值清0
TL0=0;//將計數器低位初值清0
TR0=1;//計數器開始計數
//delay(); //調用匯編的子函數
TR0=0;//停止計數

aa=TH0;//把計數的值高位交給aa
bb=TL0;//把計數的值低位交給aa
LcmInit();//初始化LCD12864
LcmClear();//清屏LCD
LcmPutstr( 0,28,"C&A TEST" );//顯示
LcmPutstr( 3,0,"TH0:" );
LcmPutstr( 3,24,uchartostr(aa) );
LcmPutstr( 3,46,"TL0:");
LcmPutstr( 3,70,uchartostr(bb) );
LcmPutstr( 5,0,"BLOG:http://" );
LcmPutstr( 6,18,"hi..com/txz01" );
LcmPutstr( 7,8,"Email:[email protected]" );
看見上面的程序了嗎?我用了T0在調用匯編子函數delay()前開始計數,調用完後就關掉,然後看計數器內的計數值來知道我們這個子函數的精確程度。我先把delay()函數給注釋掉,看看開始計數後就立即關掉要用去多少時間。結果顯示為1,就是說用了一個脈沖的時間。12M的晶振就是一微秒。見下圖:
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
看到沒有,用了TR0=1;TR0=0;本身就用去了一個脈沖。好!現在我們將那個調用匯編子函數delay()語句啟用,但我將匯編內的語句給清空。也就是說我把delay.asm這個子程序讓它什麼也沒做。是個空函數,看它要用掉幾個脈沖時間。匯編程序如下:
NAME DELAY
?PR?delay?DELAY SEGMENT CO DE
PUBLIC delay
RSEG ?PR?delay?DELAY
delay:
RET
END
看到了嗎?標號delay:下面什麼也沒有了,直接就RET返回了。好!編譯,燒寫,運行!如下圖:
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚結果是用了5個脈沖,其中一個是調用計數器本身用的,也就是說調用一個空函數用了4個脈沖時間。好!我們再來修改一下匯編程序:
NAME DELAY
?PR?delay?DELAY SEGMENT CO DE
PUBLIC delay
RSEG ?PR?delay?DELAY
delay:
mov r7,#100
djnz r7,$
RET
END
在標號delay:下面我加了兩行,我們計算一下,第一行MOV r7,#100要用一個機器周期,也就是一個脈沖。第二行djnz r7,$要循環100次每次用2個機器周期,這樣算來共是201個脈沖再加上剛才我們計算過的調用函數要4個脈沖和開關計數器用1個,總共是206個。編譯,燒寫,運行!
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚看來計算的沒錯呀!我們再循環多些:
NAME DELAY
?PR?delay?DELAY SEGMENT CO DE
PUBLIC delay
RSEG ?PR?delay?DELAY
delay:
mov r7,#100 ;1
loop:mov r6,#50 ;100
djnz r6,$ ;50×100×2
djnz r7,loop ;100×2
RET
END
這次的計算應該是1+100+50×100×2+100×2+5=10306。再次編譯燒寫運行!
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
高位數值為40,低位數值為66,則總數=40×256+66=10306。精準吧!好了!無參函數的調用就討論到此。

下面接著說說帶參數據函數的調用:
我們重新建立一個目錄TEST2(因為一個項目有很多個文件如果都放在一個目錄里會很混亂,以後想挪到U盤帶到其它機子上用時就很困難了),建立新的項目test2.Uv2,裡面還是main.c主程序和12864put.c顯示子程序:
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚主函數main()如下:
#include <AT89X52.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
extern void LcmClear( void ); //清屏
extern void LcmInit( void ); //初始化
extern void LcmPutstr( uchar row,uchar y,uchar * str ); //在設定位置顯示字元串
//row:是LCD的行數(0-7)
//y:是LCD的列數(0-127)
//str:是字元串的首地址
extern uint add(uchar aa,uchar bb);
extern void inttostr(uint intval,uchar da ta * str);
uchar str[6];//定義四個位元組空間用來存放數值轉換成的字元值
//****************
// 主函數
//****************
main(void)
{ uchar aa,bb;
uint cc;
aa=145;
bb=236;
cc=add(aa,bb);
LcmInit();//初始化LCD12864
LcmClear();//清屏LCD
LcmPutstr( 0,28,"C&A TEST" );//顯示
inttostr(aa,str);
LcmPutstr( 3,0,str );
LcmPutstr( 3,18," + " );
inttostr(bb,str);
LcmPutstr( 3,36,str);
LcmPutstr( 3,54," = ");
inttostr(cc,str);
LcmPutstr( 3,72,str);
//LcmPutstr( 3,46,"TL0:");
//LcmPutstr( 3,70,uchartostr(bb) );
LcmPutstr( 5,0,"BLOG:http://" );
LcmPutstr( 6,18,"hi..com/txz01" );
LcmPutstr( 7,8,"Email:[email protected]" );
while(1);
}
項目中還有uinttostr.c是無符號整型轉字元串子程序和我們要做匯編調用的這個有返回參數有傳遞參數的子程序add.c,子程序add.c如下。

#define uchar unsigned char
#define uint unsigned int
uint add(uchar aa,uchar bb)
{
uint cc;
cc=aa+bb;
return(cc);
}
我們主要目的是為了表達清楚怎樣在C程序里去調用匯編子函數,所以程序還是很簡單,就是把主程序傳過來的無符號字元型變數aa和bb相加,相加的結果交給無符號整型變數cc返回給主程序。編譯前我們還是點取add.c文件屬性,讓它產生src文件。上面的圖已顯示了編譯的過程信息。現在我們打開這個add.src文件:
; .\add.SRC generated from: add.c
; COMPILER INVOKED BY:
; E:\old_pc\txz001\單片機c51\KEIL2_70\Keil\C51\BIN\C51.EXE add.c BROWSE DEBUG OBJECTEXTEND SRC(.\add.SRC)
NAME ADD?
?PR?_add?ADD SEGMENT CO DE
PUBLIC _add
; #define uchar unsigned char
; #define uint unsigned int
;
; uint add(uchar aa,uchar bb)
RSEG ?PR?_add?ADD
_add:
USING 0
; SOURCE LINE # 4
;---- Variable 'bb?041' assigned to Register 'R5' ----
;---- Variable 'aa?040' assigned to Register 'R7' ----
; {
; SOURCE LINE # 5
; uint cc;
; cc=aa+bb;
; SOURCE LINE # 7
MOV A,R5
ADD A,R7
MOV R7,A
CLR A
RLC A
MOV R6,A
;---- Variable 'cc?042' assigned to Register 'R6/R7' ----
; return(cc);
; SOURCE LINE # 8
; }
; SOURCE LINE # 9
?C0001:
RET
; END OF _add
END
我們還是將注釋的部分刪去,這樣便於我們分析:
NAME ADD?
?PR?_add?ADD SEGMENT CO DE
PUBLIC _add
RSEG ?PR?_add?ADD
_add:
USING 0
MOV A,R5
ADD A,R7
MOV R7,A
CLR A
RLC A
MOV R6,A
RET
END
現在我們首先來看函數名,上面我們講過的那個無參數函數delay()的調用,產生的匯編子函數名就是delay,而這次我我們原來C的函數名add變成了匯編的_add。前面多了個下劃線,這就是有參數函數的特徵。C語言函數名轉變為匯編函數名的規律為:無參數傳遞時void func(void)----FUNC。寄存器參數傳遞時char func(char)----_FUNC。再入函數使用時void func(void) reentrant----_?FUNC。
不過這些名字的變化規律記沒記住好象關系並不大。我們想要用到匯編調用時,就先用C做個假函數然後產生匯編文件名字就自然出來,並不用我們去管它的命名,然後去修改成我們想做的匯編程序就行了。
但是,這參數傳遞的位置規律就必須得知道,否則你就無法使用這個匯編了,我們看上面的匯編程序,第一句是將寄存器R5的值傳到A中,第二句將A與寄存器R7相加,第三句將相加的結果A的值傳給R7,後面的幾句是將剛才相加的進位值C,傳給R6,然後返回。對照本篇最上面給的那兩張表我們可以看出C子函數add.c的第一個參數aa被傳到了匯編的R7,第二個參數bb被傳到了R5,將它們相加後,返回值的低位交給了R7,高位交給了R6。完全符合參數傳遞表和返回值表所述。下面我們將匯編子程序另存為asm文件後替換掉原來的C子程序:
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚
編譯、燒寫後運行:
KEIL的混合編程操作 - 少佔魚-網易 - 少佔魚這個加法函數我們沒有改動任何參數當然運行起來是不會錯的,下面我們將在匯編里將它改成乘法試試,
將標號_add:下面的語句全都改掉,程序如下?
NAME ADD?
?PR?_add?ADD SEGMENT CO DE
PUBLIC _add
RSEG ?PR?_add?ADD
_add:
USING 0
MOV A,R7
MOV B,R5
MUL AB ;A與B相乘,乘積的高位值在B中,低位值在A中
MOV R7,A ;將低位值傳給R7
MOV R6,B ;將高位值傳給R6
RET
END

⑹ 教你如何搭建蜘蛛池項目月入上萬

  本人曾經也是一名標準的SEOER,渾渾噩噩,在專職崗位上並沒有什麼建樹,後來轉行做管理層,業余時間做做個個網站,已經基本告別seo行業,但還算是個站長。

SEO這行業由於涉及到灰產黑產,所在在技術水平上也參差不一,企業里的SEO工作者基本出於行業地位的中下游:賺錢不多;操心不少,說起來也是個網路高手,但是確實收入不高。

從今天開始,我將分享一些我操作過的、或者未操作但是確實能夠賺錢的網路項目,也會涉及到灰產行業,以幫助廣大seo及站長群體盡快提升,找到適合自己的項目,利用互聯網賺錢。

我主要會寫一些各個項目以及項目的實施、推廣和注意到的問題。至於涉及到的工具、源碼等可以自主去某寶購買,本次主在分享思路、項目。

今天主要跟大家分享的是蜘蛛池項目:

教你如何搭建蜘蛛池項目月入上萬 SEOer灰色行業賺錢

蜘蛛池,許多幹了三四年的seo也不知道具體是怎麼回事;其實很簡單,就是站群而已,不過這個製造出的站群僅僅是為了給網路蜘蛛訪問,吸引網路蜘蛛用的。業內流傳的站群程序,也基本是根據站群源碼發展而來。

那麼蜘蛛池有什麼用呢?

主要用處就是生成大量頁面供網路蜘蛛訪問,形成一個「池子」,可以引導池內的蜘蛛,訪問你還未被收錄的正常網站的頁面,從而促收錄;與此同時、由於大量的蜘蛛池頁面放置了你正常網站頁面的鏈接,相當於增加了很多外鏈,對網站排名、權重提升也有幫助。

蜘蛛池的主要應用

1.黑產灰產行業(大戶):由於他們內容涉及擦邊,所以很多內容並不能在網上發帖宣傳,於是就有通過製造虛假頁面、或者自建網站頁面、然後將頁面的url提交給蜘蛛池,讓網路快速收錄、達成在網路上有搜索結果的目的。

他們由於需求量大、行業利潤高、購買蜘蛛池基本上都是大批量的,包月幾千到幾萬不等。

2.普通企業型、電子商務行型網站(小戶):正規網站使用蜘蛛池主要就是為了提升網站的收錄率和關鍵詞排名。

目前這個市場並不飽和,許多網站管理者根本連這個東西都不知道。這也是一個市場。不過價格肯定不會很高。

3.自產自用型:一般是懂這行的人,給自己的項目做蜘蛛池,不對外出售。

目前蜘蛛池行業的發展水平

市面上目前公開對普通用戶銷售的蜘蛛池服務商並不多,三五個而已,收費模式也大概一樣,按量計費。0.02元/條url/天

蜘蛛池的項目成本

項目成本主要分為兩塊:1是伺服器;2是域名;3:蜘蛛池程序

域名越多,你的蜘蛛池的網路蜘蛛訪問量就越高,你的蜘蛛池也就越值錢;

同時呢,域名多了就需要更多的伺服器來支撐,伺服器要購買那種多IP的;

我們以1000個域名的蜘蛛池成本計算:

域名費1000*8=8000元;換算到每月是666元

具體換算方式是1個IP對應10個域名,那需要100個IP

按某寶的美國伺服器價格,8G內存+500G硬碟+100IP水平的伺服器,費用是800/月

這樣成本就是1466元不到/月

程序,不值啥錢,你可以網上購買,也可以加我微信,我手裡有比較好的系統,付費的。

那麼蜘蛛池能賺多少錢呢?

我們分別以大戶和小戶兩種渠道來計算一下:

大戶:每月5000+/戶

小戶:按購買量計,最低100,控制在100-600/戶區間;(價格太高的話,普通公司接受度不高)

收入遠遠大於支出!

而且重要的是,投入是一次性投入,產出是重復性產出!因為你1個客戶和N個客戶,成本是一樣的。客戶越多邊際成本越低!

一般每個月收好好宣傳推廣一下,月入三萬也不是多難的事。

蜘蛛池項目的推廣

本項目主要推廣群體是站長、企業網站管理員、企業網路營銷負責人和灰產行業工作者

所以我簡單給大家說幾個渠道:

1:土豪版:各大站長平台、站長工具付費廣告,比如51la、cnzz、admin、chinaz等

2:窮屌版:不花錢,就得出力,哪裡的這類人群最好找呢?QQ群!QQ群里搜索站長、seo等關鍵詞即可。

3:線下版:與線下的廣告公司、財務公司合作推薦,適合做小戶。小戶多了可比大戶。因為大戶是不穩定客戶,小戶基本很穩定,一個月兩三百而已。

好了,這個蜘蛛池項目就分享到這里,項目前途、項目成本、項目利潤、推廣方式都給大家說明白了。剩下的,就好好執行吧!

順便說一句:要想賺錢,最重要的不是項目,是執行!

⑺ 現在做代理十十彩違法嗎

這東西怎麼說呢,其實做這種灰色項目最大的敵人就是你的同行,只要沒人舉報你 你就沒啥大事 ,不知道你說的這種彩票還能代理,可能你不懂這種東西有bug的 最賺錢的永遠都在背後,一個源碼也就幾百塊,資源傳播太快,去年一個源碼幾萬塊,你現在才去做,市場都沒了,你去賺誰的錢啊,客戶定位不準確,註定賠錢,賺錢才是重要的,其次再考慮法律,人性就是這樣,如果你可能賺的錢,超過了你的認知,你還會考慮法律? 純手法,望採納

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:529
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:26
linux485 發布:2025-07-05 14:38:28 瀏覽:306
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:757
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:433
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:709
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:244
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:689
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:286
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:835