灰色项目源码
⑴ 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 静态代码分析理论基础和主要技术
缺陷模式匹配:缺陷模式匹配事先从代码分析经验中收集足够多的共性缺陷模式,将待分析代码与已有的共性缺陷模式进行模式匹配,从而完成软件的安全分析。这种方式的优点是简单方便,但是要求内置足够多缺陷模式,且容易产生误报。
类型推断:类型推断技术是指通过对代码中运算对象类型进行推理,从而保证代码中每条语句都针对正确的类型执行。这种技术首先将预定义一套类型机制,包括类 型等价、类型包含等推理规则,而后基于这一规则进行推理计算。类型推断可以检查代码中的类型错误,简单,高效,适合代码缺陷的快速检测。
模型检查:模型检验建立于有限状态自动机的概念基础之上,这一理论将被分析代码抽象为一个自动机系统,并且假设该系统是有限状态的、或者是可以通过抽象归 结为有限状态。模型检验过程中,首先将被分析代码中的每条语句产生的影响抽象为一个有限状态自动机的一个状态,而后通过分析有限状态机从而达到代码分析的 目的。模型检验主要适合检验程序并发等时序特性,但是对于数据值域数据类型等方面作用较弱。
数据流分析:数据流分析也是一种软件验证技术,这种技术通过收集代码中引用到的变量信息,从而分析变量在程序中的赋值、引用以及传递等情况。对数据流进行 分析可以确定变量的定义以及在代码中被引用的情况,同时还能够检查代码数据流异常,如引用在前赋值在后、只赋值无引用等。数据流分析主要适合检验程序中的 数据域特性。
- 图 1. 使用 Checkstyle 进行编码风格检查
- 图 2. 使用 Checkstyle 添加自定义代码检查规范
- 图 3. 使用 FindBugs 进行静态代码分析
- 图 4. 使用 FindBugs 添加自定义代码检查规范
- 图 5. 使用 PMD 进行静态代码分析
- 图 6. 使用 PMD 添加自定义代码检查规范
- 图 7. 使用 Jtest 进行静态代码分析
- 图 8. 使用 Jtest 添加自定义代码检查规范
- 表 1. 不同工具的分析对象及应用技术对比
Javadoc 注释:检查类及方法的 Javadoc 注释
命名约定:检查命名是否符合命名规范
标题:检查文件是否以某些行开头
Import 语句:检查 Import 语句是否符合定义规范
代码块大小,即检查类、方法等代码块的行数
空白:检查空白符,如 tab,回车符等
修饰符:修饰符号的检查,如修饰符的定义顺序
块:检查是否有空块或无效块
代码问题:检查重复代码,条件判断,魔数等问题
类设计:检查类的定义是否符合规范,如构造函数的定义等问题
Bad practice 坏的实践:常见代码错误,用于静态代码检查时进行缺陷模式匹配
Correctness 可能导致错误的代码,如空指针引用等
国际化相关问题:如错误的字符串转换
可能受到的恶意攻击,如访问权限修饰符的定义等
多线程的正确性:如多线程编程时常见的同步,线程调度问题。
运行时性能问题:如由变量定义,方法调用导致的代码低效问题。
可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句
未使用代码(Dead code):检查未使用的变量,参数,方法
复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环
重复的代码:检查重复的代码
循环体创建新对象:检查在循环体内实例化新对象
资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉
可能的错误:如内存破坏、内存泄露、指针错误、库错误、逻辑错误和算法错误等
未使用代码:检查未使用的变量,参数,方法
初始化错误:内存分配错误、变量初始化错误、变量定义冲突
命名约定:检查命名是否符合命名规范
Javadoc 注释:检查类及方法的 Javadoc 注释
线程和同步:检验多线程编程时常见的同步,线程调度问题
国际化问题:
垃圾回收:检查变量及 JDBC 资源是否存在内存泄露隐患
- 清单 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 所示。
现有主流 Java 静态分析工具
Checkstyle
Checkstyle 是 SourceForge 的开源项目,通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。
Checkstyle 提供了支持大多数常见 IDE 的插件,文本主要使用 Eclipse 中的 Checkstyle 插件。如下图 1 所示,Checkstyle 对代码进行编码风格检查,并将检查结果显示在 Problems 视图中。图中,代码编辑器中每个放大镜图标表示一个 Checkstyle 找到的代码缺陷。开发人员可通过在 Problems 视图中查看错误或警告详细信息。
此外,Checkstyle 支持用户根据需求自定义代码检查规范,在下图 2 中的配置面板中,用户可以在已有检查规范如命名约定,Javadoc,块,类设计等方面的基础上添加或删除自定义检查规范。
FindBugs
FindBugs 是由马里兰大学提供的一款开源 Java 静态代码分析工具。FindBugs 通过检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。FindBugs 既提供可视化 UI 界面,同时也可以作为 Eclipse 插件使用。文本将主要使用将 FindBugs 作为 Eclipse 插件。在安装成功后会在 eclipse 中增加 FindBugs perspective,用户可以对指定 Java 类或 JAR 文件运行 FindBugs,此时 FindBugs 会遍历指定文件,进行静态代码分析,并将代码分析结果显示在 FindBugs perspective 的 bugs explorer 中,如下图 3 所示:
图中 Bug Explorer 中的灰色图标处为 Bug 类型,每种分类下红色图标表示 bug 较为严重,黄色的图标表示 bug 为警告程度。Propreties 列出了 bug 的描述信息及修改方案。
此外,FindBugs 还为用户提供定制 Bug Pattern 的功能。用户可以根据需求自定义 FindBugs 的代码检查条件,如下图 4 所示:
PMD
PMD 是由 DARPA 在 SourceForge 上发布的开源 Java 代码静态分析工具。PMD 通过其内置的编码规则对 Java 代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。PMD 提供了和多种 Java IDE 的集成,例如 Eclipse,IDEA,NetBean 等。本文主要使用 PMD 以插件方式与 Eclipse 集成。如下图 5 所示:在 Violations Overview 视图中,按照代码缺陷严重性集中显示了 PMD 静态代码分析的结果。
PMD 同样也支持开发人员对代码检查规范进行自定义配置。开发人员可以在下图 6 中的面板中添加、删除、导入、导出代码检查规范。
Jtest
Jtest 是 Parasoft 公司推出的一款针对 Java 语言的自动化代码优化和测试工具,Jtest 的静态代码分析功能能够按照其内置的超过 800 条的 Java 编码规范自动检查并纠正这些隐蔽且难以修复的编码错误。同时,还支持用户自定义编码规则,帮助用户预防一些特殊用法的错误。Jtest 提供了基于 Eclipse 的插件安装。Jtest 支持开发人员对 Java 代码进行编码规范检查,并在 Jtask 窗口中集中显示检查结果,如下图 7 所示:
同时,Jtest 还提供了对用户定制代码检查配置甚至自定义编码规则的支持,这一功能使得开发人员可以基于不同场景定制所需要的编码规范,如图 8 所示:
Java 静态分析工具对比
本章节将从以下几个方面对上述 Java 静态分析工具进行比较:
应用技术及分析对象
下表 1 列出了不同工具的分析对象及应用技术对比:
Java 静态分析工具
分析对象
应用技术
Checkstyle Java 源文件 缺陷模式匹配
FindBugs 字节码 缺陷模式匹配;数据流分析
PMD Java 源代码 缺陷模式匹配
Jtest Java 源代码 缺陷模式匹配;数据流分析
内置编程规范
Checkstyle:
FindBugs:
PMD:
Jtest
错误检查能力
为比较上述 Java 静态分析工具的代码缺陷检测能力,本文将使用一段示例代码进行试验,示例代码中将涵盖我们开发中的几类常见错误,如引用操作、对象操作、表达式复杂化、数 组使用、未使用变量或代码段、资源回收、方法调用及代码设计几个方面。最后本文将分别记录在默认检查规范设置下,不同工具对该示例代码的分析结果。以下为 示例代码 Test.java。其中,代码的注释部分列举了代码中可能存在的缺陷。
表 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的 最赚钱的永远都在背后,一个源码也就几百块,资源传播太快,去年一个源码几万块,你现在才去做,市场都没了,你去赚谁的钱啊,客户定位不准确,注定赔钱,赚钱才是重要的,其次再考虑法律,人性就是这样,如果你可能赚的钱,超过了你的认知,你还会考虑法律? 纯手法,望采纳