chenall's Blog 走自己的路,让别人说去吧
归档
解决电脑远程登陆出现 “远程计算机已结束连接”
此贴转自时空论坛 原贴: http://bbs.znpc.net/viewthread.php?tid=3304 转到这里留个备份,以后再碰到这个问题比较好找.^_^ 解决电脑远程登陆出现 远程计算机已结束连接
[分享]成功利用GPXE启动无盘WINDOWS 2003.
留个贴子纪念下,(具体实现方法网上有许多介绍,我就不再写了^_^). 使用STARWIND作为ISCSI服务端,在DHCP上设定使用GPXE启动,并设定好ROOT-PATH目录(DHCP 017选项)为iscsi:192.168.0.2::::win2003,启动成功了,
[推荐]MSDOS 网络启动软盘镜像
使用Barts Network modboot disk修改的镜像. 适用于PXE启动,因为里面只带一个网卡驱动PXE UNDI NDIS.DOS 非PXE启动也可以使用,要求网卡有带启动功能,建议使用PXE启动.
一个文件处理的小工具
STR [File] [Start] [Bytes] [/C|/I] [dstFile] [Address] STR [File] [Start] [Bytes] [/D] [dstFile] STR [File] [Start] [Bytes] [/V] [/A] [/P]
非内置SCSI驱动在PE下的安装过程
在PE下安装硬盘控制器驱动都是失败的,因为都是使用DEVCON类. 由我之前发的贴子[原创]让你的PE/XP/2003系统支持EXFAT. 我突然想到,SCSI驱动是不是也可以使用类似的方法呢,实验证明我的想法有一定的可行性(因无条件进行全面测试)
遭遇DOS下extract.exe 内存不足的问题.
今天在制作一个启动盘,时需要用EXTRACT来解压cab文件,却发现死活不行.总是提示 out of memory while processing cabinet file 错误 查了相关文章 http://support.microsoft.com/kb/261758 还是没有用.
批处理脚本整理之邮箱自动登录示范(亿邮首页eyou)
有时想用批处理登录邮箱,如果这个邮箱登录支持GET方式的话只要构造一个URL地址提交就可以了,如果不支持上URL提交就不行了,这时可以参考以下代码 上面的HTA也可以改为HTM,如果你的电脑不支持HTA的话.原理很简单,从上面的代码就可以看到.当然了,这个方法并不一定是最好的.用VBS或其它的工具一样可以实现.
[软件推荐] 极点中文输入平台
极点五笔的基本介绍极点五笔输入法是一款 免费的多功能五笔、拼音输入软件平台 ,同时完美支持一笔、二笔等各种以 a~z 为编码的“型码”、“音型码”。 错码后可以继续输入 会五笔打五笔,不会五笔可以直接打拼音
佳为后台程序单文件版本 有使用佳为软件的朋友别错过了
佳为软件是什么东西我就不介绍了,很多商场都在使用的. 由于佳为软件的安装目录必须是固定的C:\JWPOS和C:\JWFORALL,而且这两个目录加起来近200MB,使用也不太方便,所以就抽空打包制作了这样一个单文件的版本.
[原创]QQ自由幻想挂机过神医完美解决方案
目前网上找到的大多是使用随机或固定的答案,选错2次就小退再进,这样虽然可行,但并不完美,至少不通过就小退那个经验就没了,嘿嘿 一个小秘密:两个号组队挂经验或宠物,只要验证一个号就可以了.方法,卖个关子先不说了.说下另一个秘密.:)SS可以在野外不用验证神医,可以打怪也可以移动.^^ 方法在本文最后面
[游戏推荐] 电精1代出招表资料
1994年, 以动漫相关游戏著称的 Banpresto 发布电神魔傀(街机版) 和 Ghost Chaser - 电精(超任版)。 街机版有角色:魔傀, 衣世(女主角), 机器人Belva, 黑骑士(二代女主角), Tulks(即Tarukusu, 超任版中是Boss之一, 后被收服), 还有一个怪物 J-11。超任版只能选前三个,其他人客窜。
[整理] Windows Api 调用 keybd_event 相关资料(VB)
keybd_event VB声明. VB声明 说明 这个函数模拟了键盘行动 参数类型及说明 bVkByte 欲模拟的虚拟键码 bScanByte 键的OEM扫描码 dwFlagsLong 零;或设为下述两个标志之一
[整理] Windows API 调用常量声明之按键篇
常用键盘虚拟码声明.
FFO宠物技能[转]
杂食类宠物 加强攻击类的技能都不能领悟 喂养:钢铁 、石盾 、魔甲、厚皮、驱毒、阳春、活筋、解封、祛病、醒脑★下面就是具体的宝宝技能列表了: 首先是物理系的肉食力量型宝宝:
[转载]CMD 批处理转 EXE,仅17K。
2008.06.04测试版 修正了转换小体积批处理脚本出现的问题; 修正了在16位色彩系统中显示主程序图标出现的问题; 增加了自动填写EXE文件扩展名的功能。 至此,cmd2exe 除了保护脚本(cmd2exe界面变灰的那一项)功能没有完成外,其余功能已经实现。附件内有两个 CMD 及转换成的 EXE,其中一个 CMD 很小(5个字节),别一个较大(6K)。
[原创] 将REG文件转换成CMD/BAT文件(REG与CMD混合编程)
批处理中经常需要使用注册表文件。一般的作法是使用命令 regedit /s 注册表文件.reg 其实根据.REG文件和.CMD文件的特性,可以合二为一。 .REG文件中;开头代表注释 .CMD文件中;开头并不影响执行。所以可以从这个方面入手。下面的注册表可以在右键菜单中添加一个MAKECAB项。
[转载] 两个雕虫小技 - MessageBox & Notepad
两个雕虫小技 - MessageBox & Notepad不用其它工具快速复制对话框上的文字,使用记事本自动添加记录时间.快速截图. 作者:半瓶墨水 链接:http://www.2maomao.com/blog/two-tips-mbox-and-notepad/
[健康知识] 睡眠与养生
一、睡眠的规则 战国时名医文挚对齐威王说:“我的养生之道把睡眠放在头等位置,人和动物只有睡眠才生长,睡眠帮助脾胃消化食物,所以,所以睡眠是养生的第一大补,人一个晚上不睡觉,其损失一百天也难以恢复。”
[原创] 支持外置硬盘控制器驱动+最小巧最灵活的PE
不再想写说明了,以下就只供参考。 目前支持两种方式的外置驱动具体请点击以下地址查看.外置硬盘控制器驱动使用添加方法 决定采用第二种方法。(利用无盘天使驱动)已经上传了测试版本=080303=XXXX.RAR(两个文件,一个内核一个驱动)使用方法内详
[转载] 从网络启动安装Windows
Windows网络安装简介作者:Rinrin 顾名思义,Windows网络安装表示从局域网内部引导Windows安装,核心技术基于微软的RIS(Remote Installation Services)。RIS有一个缺点,即需要在域环境下才能配置运行RIS。不过这个限制已经被国外的高手破解了,现在可以从任何一台Windows(甚至是Linux)机器上配置网络安装所需要的服务。本文将简单说明实现Windows网络安装的技术要点。
[转载] ntldr隐藏大秘密——启动时手动编辑调整菜单选项
ntldr隐藏大秘密——启动时手动编辑调整菜单选项
[GRUB4DOS] root 命令介绍
一、基本概念。 root中文解释就是“根”的意思。 例子: 一个磁盘文件列表如下 其中一开始X:\就是默认root 现在要访问boot\file3 就可以使用 /boot/file3 来访问 默认root是可以改变的比如我需要连续访问x:\boot\test\file1,file2,file3。 这样每次访问都要使用/boot/test/file1这样的路径会比较麻烦, 这时可以设置x:\boot\test为root 这样要访问上面的文件就只要 /file1就可以了
[Grub4DOS] 系统维护简单应用举例
以下需要先设置好GRUB4DOS作为引导。 启动硬盘上的系统(不管硬盘上有没有NTLDR/BOOTMGR文件,只要启动配置文件BOOT.INI/BCD存在即可). 有时候系统的启动文件被删了就会出现如下提示 BOOTMGR is missing或者NTLDR is missing 这时下面的菜单就可以派上用场了,启动进入系统后再把文件复制过去就OK了,当然了也可以不复制这样你的U盘就是启动KEY了,不懂得的人就进不了你的系统了.
【WINPE】WinPE 1.x 启动文件SETUPLDR.BIN研究
一般的PE光盘必须的文件列表如下 WINNT.SIF文件内容例子 SETUPLDR.BIN是启动文件,WINNT.SIF指定启动参数信息比如WINPE.IMG文件位置等SETUPLDR.BIN加载时会根据WINNT.SIF里面的内容来启动,WINNT.SIF文件必须放在根目录下
[Grub4dos] grub4dos高级应用菜单示范
grub4dos是一个很强大的引导器,想学习使用Grub4dos的朋友不要错过了,马上订阅本文章吧,目前只加了一部份注释. 有看不懂的可以回复哦,我会尽快加上注释。欢迎有兴趣的朋友一起研究。 2014-01-21 注: 这个菜单使用到了大部份的GRUB4DOS常用功能,新版本的GRUB4DOS功能更加强大,下面很多复杂的功能,使用最新版GRUB4DOS,可能只需要两三个语句就可以实现了
【原创】批处理读取INI格式文件
批处理读取INI文件,以前无聊时写的.当时只是觉得好玩就尝试写了一下,原贴请看DOS联盟论坛 http://www.cn-dos.net/forum/viewthread.php?tid=25789 最早的版本,发现了许多错误,而且使用了许多的SETLOCAL,经常会出错。后来优化了下,可以运行了,就一直都没有再去改过了。
【测试】CQGhost 硬盘安装器
基于Quick Ghost的一个应用 Quick Ghost 快速一键还原 CQGHOST Ghost硬盘安装器,可以在你熟悉的Windows环境下恢复GHO文件(设定还原参数,重启系统后自动恢复指定GHO),需要先自行复制GHO文件到硬盘上(位置随意,不要放在系统盘就可以了)
【分享】免费安全纯软件连锁VPN解决方案 (简版)
1、用途: 连锁超市,卖场,酒店,等。总部与各个分店之间的连接,实现实时连锁经营。 2、最终效果:各个分店与总部之前通过VPN连接,形成一个大的局域网络,所有电脑之间均可互连互访。 需求与方法:
【分享】Softether 使用图文教程
软件简介该软件是一个能虚拟网卡和集线器(HUB)的工具,只要可以访问互联网,都可以使用它来组建远程局域网。在此虚拟的局域网上能进行所有物理局域网上的操作。可以互相访问,可以联网玩只支持局网的游戏(TCP/IP)。该软件能够突破防火墙拦截,信息包都经过加密,安全上不存在问题。
【分享】小技巧,两条命令解决WIN7安装后改MBR启动失败问题
从VISTA开始,系统和硬盘是紧密相联的,只要改动了MBR就有可能出现启动失败的问题。出现如下错误提示代码。 Status: 0xc000000d TIPS:在硬盘MBR的偏移 0x1B8 to 0x1BB是这个硬盘的签名信息,WINOWS 系统通过这个信息来找到硬盘,在XP时代如果有两个硬盘的签名信息一样系统启动过程中会自动改掉,如果失败就会出现0X7B蓝屏信息。如果有注意的话就会发现,你只要改动上面的信息,重启系统后,系统会重新分配盘符(表现为你调整好的盘符乱掉了)。
解决虚拟机系统时间不准的问题
有使用虚拟机的朋友应该就会发现在虚拟机上的时间是不准确的,往往会慢上许多。对于普通应用来说当然是没有问题的,但对于一些对时间控制要求比较高一点的场合就不行了,一般情况下可以通过安装虚拟机附加工具来解决,方法网上也有许多,这里就不再介绍了。
【分享】神奇的DESKTOP.INI文件,系统自带的文件保护功能。
最近在试用Windows 7无意中发现了一个很有意思的特性,写出来分享下。可以不使用任何工具对一个文件夹/文件进行普通的保护 不可改名 可以改名但改名后对原来里面的程序没有任何影响(只是改的显示名称,实际上原来的名字并没有改变)
善用SandBoxIE ,让你的系统更安全
sandboxie沙盘功能:(部份摘自百度百科,URL:http://baike.baidu.com/view/756166.htm) sandboxie沙盘介绍: Sandboxie允许你在“沙盘环境”中运行浏览器或其他程序,这个“沙盘”个人感觉就是跟“影子”一样的概念罢了。因此,在沙盘中运行的程序所产生的变化可以随时删除。可用来保护浏览网页时真实系统的安全,也可以用来清除上网、运行程序的痕迹,还可以用来测试软件,测试病毒等用途。即使在沙盘进程中下载的文件,也可以随着沙盘的清空而删除。
让你的任意文件显示个性图标
软件来源。http://bbs.wuyou.com/viewthread.php?tid=120136 一、功能,可以让你的一些没有图标(或只有通用图标)的文件,显示自定义的个性图标。 二、效果图。(测试只用MOU和WIM格式测试)
批处理检测外部命令是否存在的模块
编写批处理时经常需要用到外部命令,一些常用的命令一般的系统都会有,但是一些精简的系统上可能就没有了,如果没有做判断就可能导致程序出现未知的错误. 一般检测文件是否存在可以使用 IF EXIST filename 执行某个命令…
[转]批处理写的俄罗斯方块游戏
绝对经典的批处理游戏!!! 本游戏需要三方choice.exe支持,请自行搜索下载 来源:批处理写的俄罗斯方块游戏
一个命令禁用U盘,USB硬盘设备
有时候为了安全着想,需要禁用U盘,USB硬盘等储存设备,一般可以通过以下两种方式. 在BIOS中禁用 使用软件禁用 在BIOS中禁用比较麻烦,而且一般情况下不能只禁用U盘,会连其它USB设备都用不了.用软件一般都比较强大(未用过).
使用批处理自动定时备份文件到邮箱
因为需要,想让系统自动定时备份我的文件到邮箱上(只备份更新或新增加的文件),在网上找了许多软件要么是收费的,要么使用不方便.后来想起了以前收藏的一段 VBSCRIPT发送邮件的代码就想到是否可以利用批处理自己写一个脚本来实现,所以就有了以下的代码,有兴趣的朋友可以一起继续完善,现在只能根据文件大小,日期.来确定是否上传.
[转] Windows 下命令行/VBS脚本,发送带附件邮件.
利用VBScript发送邮件,以前从网上找的代码,不知原来的出处了.也不知作者是何人….. 挺有用的脚本,我就一直在使用这个脚本来发邮件,还可以带附件.放在这里做个备份,免得到时又找不到了. 目前我就通过批处理配合这个脚本来自动备份我的一些文件到邮箱里面.每天自动定时备份.
[分享]FiraDisk Grub4dos虚拟磁盘的WIN驱动
Windows 下 Grub4dos仿真盘的驱动. 可以支持grub4dos map—mem出来的光驱,软驱,硬盘,支持多个虚拟驱动器。 另外,也支持直接在boot.ini加载各种镜像,无488M限制。
一键GHOST备份恢复,GHOST安装器设计新思路
看起来可能有点乱^_^.实现起来也是挺麻烦的,暂时只是我的一个想法,仅供有兴趣的朋友研究尝试.放在这里做个记录,以后有兴趣再搞个成品. 最终的理想效果. 安装/卸载/使用方便简单,(只需改名复制或删除文件就可以了)
防病毒木马几则
现在病毒木马横行,很多人的电脑经常被病毒所侵,从而造成资料密码被盗.如果防止这一现象呢? 实际上除了一些主动传播的病毒以外,大部份的病毒都是用户自己不知不觉装上去的,所以要防毒,主要还是要靠用户自己小心,不要太相信杀毒软件,因为它不是万能的也不具有"智慧",很多病毒只要稍微改变一下杀软就不认识它了,就可以在电脑上横行了.
[分享]Hack Microsoft iSCSI Software Target 安装
一些介绍. Microsoft收购String Bean的WinTarget软件后,已将该iSCSI target(目标)技术将通过OEM以Windows Storage Server 2003 R2的功能包提供,命名为Microsoft iSCSI Software Target,可用于标准版(Standard Edition)或企业版(Enterprise Edition)的Windows Storage Server 2003 R2。通过将这个Microsoft iSCSI Software Target与OEM合作伙伴的硬件集成,微软表示部署块和文件存储设备的成本将下降25%之多。Microsoft iSCSI Software Target 结合Windows Storage Server 2003 R2可提供一个高性价比的IP SAN解决方案,同时支持File(文件)和Block(块)级别的数据传输;无需改变现有系统架构,直接应用在现有网络结构中,安装、实施、维护、升级均不影响现有作业;其管理方式将被整合在Microsoft Management Console (MMC) 用户界面 中,实现快捷方便的操作;并可实现snapshots快照、backup备份及clustering集群应用;Microsoft iSCSI Software Target 目前只能用于Windows Storage Server 2003 R2 Standard或Enterprise版本上。
无需第三方工具Windows下隐藏限制磁盘访问.
利用WINDOWS自身的功能通过修改注册表实现 隐藏或显示某个磁盘,隐藏盘符在资源管理器中看不到 限制某个磁盘不可访问(具体表现为双击这个盘符或直接运入中输入这个盘符时会出现如下提示) 原理:
[分享]在CMD中使用位运算转换目标数字到二进制数.
把一个十进制转成2进制的常分规方法是,一直除2求余. 这里介绍另一种方法, 一个把数值转换成二进制数的批处理脚本. 批处理加参数使用.支持把10,16,或8进制数转成二进制,其中16进制以0X开头,8进制以0开头.
[OpenVPN] OpenVPN简单用户密码验证实例.
在OpenVpn中使用用户名和密码验证方法,实例
[OpenVPN] OpenVPN脚本应用之--简介.
OpenVPN,可以在一些特定的情况下自动运行多种脚本,通过这些脚本,可以实现很多非常有用的功能.还可以提高安全性.
[OpenVPN] OpenVPN独立配置文件
把OpenVPN 所有需要的证书内置到配置文件中,只要一个配置文件就可以使用,方便实用
[分享] WINDOWS OpenVPN安装实战
利用OpenVPN实现虚拟网实战.之前一直使用SOFTETHER,因为它配置简单,使用方便.而且它也支持RIP协议,方便自动配置路由.SOFTETHER可以从这里下载, http://www.onlinedown.net/soft/34495.htm
[原创]网易邮箱通用自动登录批处理脚本[2010-05-23更新]
网易邮箱自动登录批处理脚本.具体请看里面的使用说明. 可以自动登录网易邮箱.批处理调用. 使用方法: 直接在批处理里面输入用户名和密码. 使用命令行方加参数启动.第一个参数为用户名和邮箱名,第二个参数为密码
[转] DropBox的版本控制功能
经过一段时间的试用,喜欢上了dropbox(虽然速度有点慢).版本控制功能也很好用.可以无所顾忌的删除修改文件了.大不了就还原一下. 由于是采用版本控制,所以同步时它并不是整个文件上传的而是diff方式,也就是只传不同的部份.这样上传快了很多.(不知会不会有什么后遗问题,^_^)
[分享]影子系统 POWERSHADOW 2.6免费版 精简版 for 2k,xp,2003
软件主页: http://www.powershadow.com 【软件介绍】: 好消息:PowerShadow目前免费发放给中国用户使用。 PowerShadow构建现有操作系统的虚拟影像,即影子模式(shadow mode),它和真实的系统完全一样,用户可随时选择启用或者退出这个虚拟影像。用户进入影子模式(shadow mode)后,所有操作都是虚拟的,不会对真正的系统产生影响,一切改变将在退出Shadow模式后消失。因此所有的病毒、木马程序、流氓软件都无法侵害真正的操作系统,它们的所有操作都只是假象。
vi 编辑器使用指南
一、Unix编辑器概述 编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件。Unix及其相似的ix操作系统系列中,为方便各种用户在各个不同的环境中使用,提供了一系列的ex编辑器,包括 ex, edit,ed 和vi.其中ex,edit,ed都是行编辑器,现在已很少有人使用,Unix提供他们的原因是考虑到满足各种用户特别是某些终端用户的需要。
[快递] GRUB4DOS-0.4.4正式版发布
等了好长时间GRUB4DOS-0.4.4正式版终于发布. 下载地址: http://nufans.net/grub4dos/grub4dos-0.4.4.zip http://nufans.net/grub4dos/grub4dos-0.4.4-src.zip
ASP函数语法速查表
ASP函数语法速查表 Abs(数值)绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值,也是空字符串。未初始化的变数,其绝对为 0例子:ABS(-2000) 结果:2000Array(以逗点分隔的数组元素)Array 函数传回数组元素的值。例子: A=Array(1,2,3) B=A(2) 结果: 2 说明:变量B为A数组的第二个元素的值。 Asc(字符串)将字符串的第一字母转换成 ANSI(美国国家标准符号)字码。例子:Asc("Internet") 结果:73 说明:显示第一字母 I 的 ANSI 字码。 CBool(表达式)转换成布尔逻辑值变量型态(True 或False)例子:CBool(1+2) 结果:True CDate(日期表达式)换成日期变量型态。可先使用 IsDate 函数判断是否可以转换成日 期。例子: CDate (now( )+2) 结果:2000/5/28 10:30:59 CDbl(表达式)转换成DOUBLE变量型态。Chr(ANSI 字码)将ASCII 字码转换成字符。例子: Chr(72) 结果: H CInt(表达式)转换成整数变量型态。例子: CInt (“3.12”) 结果: 3 CLng(表达式)转换成LONG 变量型态。CSng(表达式)转换成SINGLE 变量型态。CStr(表达式)转换成字符串变量型态。Date()传回系统的日期。例子: Date 结果: 2000/5/13DateAdd(I , N , D)将一个日期加上一段期间后的日期。 I :设定一个日期( Date)所加上的一段期间的单位。譬如 interval=”d” 表示 N的单位为日。 I的设定值如下: yyyy Year 年 q Quarter 季 m Month 月 d Day 日 w Weekday 星期 h Hour 时 n Minute 分 s Second 秒 N :数值表达式,设定一个日期所加上的一段期间,可为正值或负值,正值表示加(结果为 >date 以后的日期),负值表示减(结果为 >date 以前的日期)。 D :待加减的日期。例子: DateAdd(“m” , 1 , “31-Jan-98”) 结果: 28-Feb-98 说明:将日期 31-Jan-98 加上一个月,结果为 28-Feb-98 而非 31-Fe-98 。 例子: DateAdd(“d” , 20 , “30-Jan-99”) 结果: 1999/2/9 说明:将一个日期 30-Jan-99 加上 20 天后的日期。DateDiff (I , D1 , D2[,FW[,FY]])计算两个日期之间的期间。 I :设定两个日期之间的期间计算之单位。譬如 >I=”m” 表示计算的单位为月。 >I 的设定值如: yyyy > Year 年 q Quarter 季 m Month 月 d Day 日 w Weekday 星期 h Hour 时 m Minute 分 s Second 秒 D1 ,D2:计算期间的两个日期表达式,若 >date1 较早,则两个日期之间的期间结果为正值;若 >date2 较早, 则结果为负值。 FW :设定每周第一天为星期几, 若未设定表示为星期天。 >FW 的设定值如下: 0 使用 >API 的设定值。 1 星期天 2 星期一 3 星期二 4 星期三 5 星期四 6 星期五 7 星期六 FY :设定一年的第一周, 若未设定则表示一月一日那一周为一年的第一周。 >FY 的设定值如下: 0 使用 >API 的设定值。 1 一月一日那一周为一年的第一周 2 至少包括四天的第一周为一年的第一周 3 包括七天的第一周为一年的第一周例子: DateDiff (“d”,”25-Mar-99 “,”30-Jun-99 “) 结果: 97 说明:显示两个日期之间的期间为 97 天。DatePart (I,D,[,FW[,FY]])传回一个日期的之部份。 >I :设定传回那一部份。譬如 >I=”d” 表示传回 部份为日。 >I 的设定值如下: yyyy Year 年 q Quarter 季 m Month 月 d Day 日 w Weekday 星期 h Hour 时 m Minute 分 s Second 秒 D :待计算的日期。 >FW :设定每周第一天为星期几, 若未设定则表示为星期天。 >FW 的设定值如下: 0 使用 >API 的设定值。 1 星期天 2 星期一>3 星期二 4 星期三 5 星期四 6 星期五 7 星期六 FY :设定一年的第一周, 若未设定则表示一月一日那一周为一年的第一周。 >FY 的设定值如下: 0 使用 >API 的设定值。 1 一月一日那一周为一年的第一周 2 至少包括四天的第一周为一年的第一周 3 包括七天的第一周为一年的第一周例子: DatePart (“m”,”25-Mar-99 “) 结果: 3 说明:显示传回一个日期 的月部份。Dateserial (year,month,day)转换(year,month,day) 成日期变量型态。例子: DateSerial (99,10,1) 结果: 1999/10/1DateValue ( 日期的字符串或表达式 )转换成日期变量型态,日期从 January 1,100 到 December 31,9999 。格式为 month,day,and year 或 month/day/year 。譬如: December 30,1999 、 Dec 30,1999 、 12/30/1999 、 12/30/99例子: DateValue (“January 1,2002 “) 结果: 2002/1/1Day( 日期的字符串或表达式 )传回日期的「日」部份。例子: Day(“ 12/1/1999 “) 结果: 1Fix( 表达式 )转换字符串成整数数字型态。与 Int 函数相同。若为 null 时传回 null 。 Int (number) 与 Fix(number) 的差别在负数。如 Int (-5.6)=-6 , Fix(-5.6)=-5 。例子: Fix(5.6) 结果: 5Hex( 表达式 )传回数值的十六进制值。若表达式为 null 时 Hex( 表达式 )=null ,若表达式 =Empty 时 Hex( 表达式 )=0 。 16 进位可以加「 &H 」表示,譬如 16 进位 &H10 表示十进制的 16 。例子: Hex(30) 结果: 1EHour( 时间的字符串或表达式 )传回时间的「小时」部份。例子: Hour(“12:30:54 “) 结果: 12InStr ([start,]string1,string2[,compare]) 将一 个 字符串由左 而右与另一个比较,传回第一个相同的位置。 start 为从第几个字比较起,若省略 start 则从第一个字比较起, string1 为待寻找的字符串表达式, string2 为 待比较的字符串表达式, compare 为比较的方法, compare=0 表二进制比较法, compare=1 表文字比较法,若省略 compare 则为预设的二进制比较法。例子: InStr(“abc123def123”,”12”) 结果: 4InstrRev ([start,]string1,string2[,compare])将一 个 字符串 由右而左与另一个比较,传回第一个相同的位置。 start 为从第几个字比较起,若省略 start 则从第一个字比较起, string1 为待寻找的字符串表达式, string2 为 待比较的字符串表达式, compare 为比较的方法, compare=0 表二进制比较法, compare=1 表文字比较法,若省略 compare 则为预设的二进制比较法。例子: InstrRev (“abc123def123”,”12”) 结果: 10Int ( 表达式 )传回一个数值的整数部份。与 Fix 函数相同。例子: Int (5.6) 结果: 5IsArray ( 变数 )测试变量是 (True) 否 (False) 是一个数组。例子: IsArray (3) 结果: False 说明:不是一个数组。IsDate ( 日期或字符串的表达式 )是否可以转换成日期。日期从 January 1,100 A.D. 到 December 31,9999 A.D 。例子: IsDate (“December 31,1999 “) 结果: True 说明:可以转换成日期。IsEmpty ( 变数 )测试变量是 (True) 否 (False) 已经被初始化例子: IsEmpty (a) 结果: TrueIsNull ( 变数 )测试变数是 (True) 否 (False) 不是有效的数据。例子: IsNull (“”) 结果: False 说明:是有效的数据。IsNumeric ( 表达式 )是 (True) 否 (False) 是数字。例子: IsNumeric (“abc123”) 结果: False 说明:不是数字。LCase ( 字符串表达式 ) top转换字符串成小写。将大写字母的部份转换成小写。字符串其余的部份不变。例子: LCase (“ABC123”) 结果: abc123Left( 字符串表达式 ,length)取字符串左边的几个字。 length 为取个字。 Len 函数可得知字符串的长度。例子: Left(“ABC123”,3) 结果: ABCLen( 字符串表达式 变量 )取得字符串的长度。例子: Len(“ABC123”) 结果: 6LTrim ( 字符串表达式 )除去字符串左边的空白字。 RTrim 除去字符串右边的空白字, Trim 函数除去字符串左右两边的空白字。例子: LTrim (“456+” abc “) 结果: 456abc123Mid( 字符串表达式 ,start[,length]) 取字符串中的几个字。 start 为从第几个 字取起, length 为取几个字, 若略 length 则从 start 取到最右底。由Len 函数可得知字符串的长度。例子: Mid(“abc123”,2,3) 结果: c12Minute( 日期的字符串或表达式 )传回时间的「分钟」部份。例子: Minute(“12:30:54”) 结果:30Month(日期的字符串或表达式)传回日期的「月」部份。例子:Month(“12/1/2001”) 结果:12MonthName(month[,abbreviate])传回月的名称。 month :待传回月名称的数字 1~12 。譬如, 1 代表一月, 7 代表七月。 abbreviate: 是 (True) 否 (False) 为缩写,譬如 March ,缩写为 Mar 。默认值为 False 。中文的月名称无缩写。例子: MonthName (7) 结果:七月Now()传回系统的日期时间。例子: Now() 结果: 2001/12/30 10:35:59 AMOct()传回数值的八进位值。八进位可以加「 &O 」表示,譬如八进位 &O10 表示十进制的 8 。例子: Oct(10) 结果: 12Replace( 字符串表达式,findnreplacewith[,start[,count[,compare]]]) 将一个字符串取代 部份字。寻找待取代的原字符串 (find) , 若找到则被取代为新字符串 (replacewith) 。 find :待寻找取代的原字符串。 replacewith :取代后的字。 start :从第几个字开始寻找取代, 若未设定则由第一个字开始寻找。 count :取代的次数。 若未设定则所有寻找到的字符串取代字符 串全部被取代。 compare :寻找比较的方法, compare=0 表示二进制比较法, compare=1 表文字比较法, compare =2 表根据比较的 数据型态而定,若省略 compare 则为预设的二进制比较法。例子: Replace(“ABCD123ABC”,”AB”,”ab”) 结果: abCD123abCRight( 字符串表达式 ,length)取字符串右边的几个字, length 为取几个字。 Len 函数可得知字符串的长度。例子: Right(“ABC123”,3) 结果: 123Rnd [(number)]0~1 的 随机随机数值。 number 是任何有效的数值表达式。若 number 小于 0 表示每次得到相同的 随机随机数值。 number 大于 0 或未提供时表示依序得到下一个 随机随机数值。 >number=0 表示得到最近产生的 随机随机数值。为了避免得到相同的随机随机数顺序,可以于 Rnd 函数前加 Randomize 。例子: Rnd 结果: 0.498498Round( 数值表达式 [,D])四舍五入。 D :为四舍五入到第几位小数,若省略则四舍五入到整数。例子: Round(30635,1) 结果: 3.6RTrim ( 字符串表达式 )除去字符串右边的空白字。 LTrim 除去字符串左边的空白字, Trim 函数除去字符串左右两边的空白字。例子: RTrim (“abc123 “)+”456” 结果: abc123456Second( 时间的字符串或表达式 )传回时间的「秒」部份。例子:Second(“12:30:54”) 结果:54Space( 重复次数 )得到重复相同的空白字符串。例子: A”+Space (5)+”B 结果: A B 说明: A 和 B 中间加入五个空白字。String( 重复次数,待重复的字 )得到重复相同的字符串。例子: String(5,71) 结果: GGGGGStrReverse (String(10,71))将一个字符串顺序颠倒。例子: StrReverse (“ABC”) 结果: CBATime()传回系统的时间。例子: Time 结果: 10:35:59 PMTimeSerial (hour,minute,second)转换指定的 ( hour,minute,second) 成时间 变量型态。例子: TimeSerial (10,31,59) 结果: 10:31:59TimeValue ( 日期的字符串或表达式 )转换 成时间变量型态。日期的字符串或表达式从 0:00:00(12:00:00 A.M.) 到 23:59:59(11:59:59 P.M.) 。例子: TimeValue (“ 11:59:59 “) 结果: 11:59:59Trim( 字符串表达式 )除去字符串左右两边的空白字。例子: Trim(“ abc123 “) 结果: abc123UCase ()转换字符串成大写。将小写字母的部份转换成大写,字符串其余部份不变。例子: UCase (“abc123”) 结果: ABC123VarType ( 变数 )传回一个变量类型。与 TypeName 函数相同, VarType 传回变量类型的代码, TypeName 传回变量类型的名称。例子: VarType ( “I love you!”) 结果: 8Weekday( 日期表达式 ,[FW]) 传回星期几的数字。 FW :设定一周的第一天是星期几。若 省略则表 1( 星期日 ) 。 Firstdayfweek 设定值为: 1( 星期日 ),2( 星期一 ),3( 星期二 ),4( 星期三 ),5( 星期四 ),6( 星期五 ),7( 星期六 ) 。例子: Weekday(“ 1/1/2000”) 结果: 7WeekDayName (W,A,FW)传回星期几的名称。 W :是 (True) 否 (False) 为缩写。譬如 March ,缩写为 Mar 。预设为 False 。中文的星期几名称无缩写。 FW :设定一周的第一天是星期几。 若省略表 1( 星期日 ) 。设定待传回星期几的名称,为一周中的第几天。 A : 1( 星期日 ),2( 星期一 ),3( 星期二 ),4( 星期三 ),5( 星期四 ),6( 星期五 ),7( 星期六 ) 。例子: WeekDayName (“1/1/2000”) 结果:星期六Year()传回日期的「年」部份。例子: Year(“ 12/1/2000 “) 结果: 2000
[原创] 无限扩展,多功能PE_更新与下载(2009-05-01)最终版
可以点击链接直接下载,或者进入网络硬盘下载。共享密码是:chenall 外置驱动使用说明.txt 请先读我.txt 更新历史.txt 2009-05-01 修正版ISO下载[2009-05-03] http://chenall.liondrive.com/MicroPE/MicroPE.rar?action=download/download
[grub4dos]在GRLDR中内置超过4KB菜单的方法
大家都知道GRLDR中的内置菜单不能超过4KB,如果超过就会被截断. 如果超过4KB的菜单想要内置怎么办呢? 之前有想过使用GZ压缩,可是内置菜单不支持GZ压缩的格式. 后来得知启动后内置菜单的位置在内存中是固定的0X800处.
[GRUB4DOS] 利用WRITE命令写字符串到内存中
熟悉GRUB4DOS的都知道. write 可以在内存中写入一个数值使用如下命令就可以了 在内存地址0x60000中写入1. 如果想写入的是一个字符串呢?用上面的方法肯定行不通. 因为需要我想在内存固定位置中写入一个字符串,在另一个菜单中读取.之前考虑了使用dd命令,虽可以实现但不太方便.
[分享]超级解霸V9精简版(用来播放光蝶)
豪杰超级解霸V9 Vsita 增强版http://www.haojie.cn/ 精简版功能.(压缩后只有2.5MB) 保留视频功能. 保留自动播放司服器 修正原版自动播放司服器不能正常使用的问题.
[转]正则表达式30分钟入门教程
30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。
[GRUB4DOS] 未公开特性:扇区序列文件的长度指定,精确到字节
我觉得这是一个未公开的特性,因为我从未在其它地方见到过有关这一特性的描述。 在 grub 中,我们可以用 (hd0)12345+8 或者 (hd0,0)2+20,33+5,87+300 之类的表达法来表示一个磁盘文件。这种表示法,就是扇区序列表示法。既然是扇区序列,那么这样的文件,就只能以扇区对齐(也即必须为 512 的整数倍),也就是说,不可能表示一个256 字节的文件,也不可能表示一个 513 字节的文件。
GRUB4DOS一个比较变态的用法(利用GRUB4DOS作为文件中转站)
利用GRUB4DOS的map功能来中转文件.使得DOS下可以访问例子: 说明: 把/MINIPE.SYSTEM.WIM文件映射为(hd1)硬盘.GRUB4DOS会把这个文件的内容作为一个磁盘分区(hd1,0).
wee install script for grub4dos
wee是由不点基于grub4dos开发的嵌入微型 grub,可以安装到硬盘MBR上代替原来的引导代码. 有什么用途呢? 得益于GRUB4DOS的灵活性,wee同样很灵活,可以启动任意支持的分区上的可启动文件.
[原创]QGHO 快速一键恢复程序(2011-01-02更新)
[说明] QGHO是一个用于演示GRUB4DOS功能的小程序. 可以快速全自动/手动 备份恢复分区.(使用GHOST内核). 目前为止最快速/最小巧的基于DOS+GHOST的备份恢复程序. BUG报告或其它资料请移步我的搏客 http://chenall.net/post/qgho/
[GRUB4DOS] GRUB4DOS 批处理脚本示范
GRUB4DOS是什么东西,我这里就不解释了. 本脚本可以简化GRUB4DOS菜单编写的难度. 适用在合盘或需要选择启动多种镜像的情况. 使用方法非常简单. 具体见里面的例子: 附上两个增强的版本: zxw版: 自动列表.数字启动
[原创] 利用GRUB4DOS安装SRS(SCSI,RAID,SATA)驱动免按F6,免软驱.
这个在配合使用U盘安装系统碰到SCSI/RAID硬盘时特别有用,不需要在安装光盘上集成那个驱动了. 2014-01-03 PS: 目前已经有很多工具根据此原理实现了自动化操作,本文作为实现的原理,只提供参考
[GRUB4DOS] 外部命令WENV [2010-10-17]
[功能说明]GRUB4DOS菜单脚本命令增强.在GRUB4DOS还没有支持变量之前可以暂时代替着使用变量的功能.可以让GRUB4DOS内部命令支持变量或动态参数(WENV run)功能目前已经增加了许多的强大功能.具体见后面的介绍.推荐使用高级GRUB4DOS应用菜单必备,可以简化许多命令.
C语言的基础函数大小写转换
在程序中经常会需要对字母的大小写进行转换,虽然有现成的upper/lower函数,但是有时因为各种原因,或想减小程序的体积,需要自己编写函数来实现。 这里来讨论一下各种转换的方法。 根据ASCII码我们可以知道大写字母和小写字母相差32(20H)=100000B(二进制).
[GRUB4DOS] GRUB4DOS 的第一个游戏程序
经典的游戏贪吃蛇,GRUB4DOS版.比较简单的一个游戏. 嘻嘻,界面不是很好看,没有使用图形模式,只是一个试验品.抛砖引玉.^_^ 关于这个游戏的相关信息请看搏客贴子: http://chenall.net/post/snake_idea/
[原创] 也来谈谈经典游戏贪吃蛇的简易设计思路
注:原创方案,如有雷同纯属巧合. 本人对图形系统并不感冒.不喜欢也不会设计图形.所以本文介绍的也只会有简单的界面. 突然有了一些灵感,所以就把它记录下来,并尝试用代码来实现它. 当然了它不是拿来玩的而是用于学习,呵呵.
[GRUB4DOS] 测试功能增强版ECHO
搞了一个增强版的ECHO命令,看看效用还有反应如何.可以在屏幕任意位置显示字符并且可以指定颜色. 颜色设置只支持console模式(文本模式). 使用方法(具体请下载附件研究) 注: 最新版本的GRUB4DOS已经内置此功能,并且功能得到了增强,想要编写GRUB4DOS扩展的可以下载源码研究一下
[原创] 无聊贴一段代码
快速计算某个POS软件的员工密码… 使用批处理计算快速简单. ^_^ 至少有N+X个密码可以用哦. 不想解释. 谁用谁知道 . 嘿黑,别做坏事哦. ==================================================
[GRUB4DOS] chkpci for grub4dos
[用途] 在GRUB4DOS下直接检测PCI设备信息. 待定……. [用法] 直接在GRUB4DOS下运行,可以加一个PCI信息库文件参数.PCI信息库文件 另: 因为GRUB4DOS是支持自动解压的.所以这个信息库文件可以使用GZIP压缩再调用(加快读取速度).
[转] 遍历PCI设备
先来一段废话: 消化一下,准备自己也来写一个SCANPCI程序,不过不是在DOS下使用,而是在GRUB4DOS下使用. 根据netwinxp的汇编程序CHKPCI程序(第二个链接的后面)和这篇文章,消化了一些,目前可以简单显示当前PCI设备列表,还是有很多东西不是很明白,有空慢慢消化.顺便学点汇编知识.
分布式查询
分布式查询从多异类数据源中访问数据。这些数据源可以存储在同一台计算机或不同的计算机上。Microsoft SQL Server 通过使用 OLE DB 来支持分布式查询。 SQL Server 用户可以使用分布式查询访问以下内容:
MSSQL 链接服务器 sp_addlinkedserver
创建链接服务器。链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。在使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。如果链接服务器定义为 SQL Server 实例,则可执行远程存储过程。
[GRUB4DOS] 网络启动时可以使用的小技巧一则
由于最近在测试GRUB4DOS的网络启动,因为要测试不同TFTP服务器的情况.所以需要来回切换两个TFTP服务器.刚开始时还是使用比较保守的方法,即修改DHCP服务器的配置,指定TFTP服务器地址,然后重启PXE客户端.
分享]自动同步其它微搏到新浪微搏的方法
介绍一新很简单的同步其它微搏到新浪微搏的方法,基本上可以自动从任何微搏同步到新浪,不需要再去苦苦找其它同步工具了,由于使用的是新浪微搏自带的功能,安全可靠,只是同步延迟时间长了一些而已. 之前可以使用嘀神的同步功能,但最近新浪限制了嘀神的同步功能.
[转载] Dropbox无法访问
转载自月光博客 [ http://www.williamlong.info/ ] 原文链接地址:http://www.williamlong.info/archives/2173.html 5月10日下午,世界上最伟大的云存储服务之一——Dropbox被证实无法从中国地区访问,客户端和网站均无法正常连接和登录,我先前曾经多次推荐过这个伟大的服务,没想到这么快Dropbox就惨遭毒手。
[转载] 阿里巴巴的零知识证明
战争中你被俘了,敌人拷问你情报。你是这么想的:如果我把情报都告诉他们,他们就会认为我没有价值了,就会杀了我省粮食,但如果我死活不说,他们也会认为我没有价值而杀了我。怎样才能做到既让他们确信我知道情报,但又一丁点情报也不泄露呢?
[GRUB4DOS] 多国语言菜单支持[2010-04-20]
[功能]GRUB4DOS 显示多国语言菜单. 注: 新的版本GRUB4DOS已经支持多国语言菜单,所以本程序也已经不再更新维护,也不建议使用.本文只保留作为记录. [说明] 2010-04-20更新
[转]如何成为一个优秀的程序员
看了这一篇文章觉得挺不错的,就转过来了,呵呵。想要学好电脑技术,最重要的一点还是文章的总结一个字“活”。学活了做什么事都事半工倍。做其它事情也是一样。 学会举一反三,严禁不求甚解。 以下是原文内容及声明:
[GRUB4DOS] 新外部命令 fontfile
[功能说明] 加载一个点阵字库用于显示中文。 可以直接使用完整的点阵字库,或从以下软件生成的小字库 http://www.cn-dos.net/forum/viewthread.php?tid=47921
[转] Vim入门图解说明.
来源:http://blog.vgod.tw/2009/12/08/vim-cheat-sheet-for-programmers/ 感谢作者(vgod)用心绘制的Vim入门图解说明 PDF版下载
[GRUB4DOS] 外部命令 calc 简单计算器
[程序说明] GRUB4DOS 下运行的简单双目计算器. 注: 最新版GRUB4DOS已经内置本功能 [下载地址] 程序下载: http://grub4dos-chenall.googlecode.com/files/calc.zip 最新版grub4dos下载: http://grub4dos-chenall.googlecode.com/
[GRUB4DOS] 一个很简单的外部命令
[功能说明]用于菜单中,可以直接跳到另一个菜单项执行. 注:因为是调用fallback命令的功能 所以如果有使用fallback则使用这个命令之后之前的fallback设置就失效。 注: 这个只是演示一下GRUB4DOS外部命令的编写,在新版GRUB4DOS中已经直接支持
[GRUB4DOS] 外部命令FAT(在FAT分区上复制创建文件)
[使用方法]下载后解压得到FAT文件复制到GRUB4DOS启动盘的/BOOT/GRUB目录下。 或直接使用全路径比如这个文件放在(hd0,1)/boot目录下。 则(hd0,1)/boot/fat xxxx
[转] 谈谈草根站长被中国垃圾主机商害惨的经历
注:现在许多人都有自己的域名,空间了。选择一个好的服务提供商,会为你以后的操作带来更大的方便。请各位站长们注意了,千万别被被那些垃圾服务商们的广告(实际上都是说一套做一套)给骗了。 如果你非要选择以下列到了服务提供商,我只能祝你好运了。
FAT 文件系统原理
研究FAT文件系统的好文. 来源:http://www.sjhf.net/Article/Index.html 如果看不到请点击以下链接查看 FAT 文件系统原理
[grub4dos] 尝试read命令使用外部命令来实现
grub4dos外部命令测试 简单的 read 命令
[grub4dos] grub4dos 运行外部命令[简介]
grub4dos从0.4.5版开始可以运行用户自己写的外部命令了。 以下是例子是echo命令也就是相当于c语言的printf函数。 0x8300 是 grub4dos 系统函数(API)的入口点. 你可以在 asm.S 源码中找到它的定义.
将数据输出到Excel的方法
日常工作中经常需要把某一部份数据导出到EXCEL,通常情况都有软件提供类似方案. 但是这需要手工去打开软件然后导出,不能实现自动化.所以就编写了这个脚本方便实现自动化. 本脚本采用VBSCRIPT语言编写.可以在VB或VBS脚本中使用.
可以在GRUB4DOS下调用BIOS中断的外部命令
本程序可以在GRUB4DOS中直接调用BIOS中断和读写指定端口,从而获取一些功能和需要的数据。 可以方便开发人员临时调试某个功能时使用。 当然你对中断资料比较熟悉的话,就可以利用GRUB4DOS配合本程序作出非常酷的效果(比如移动的文字)
[分享] 直接在GRUB4DOS环境中修改系统时间
修改系统日期有很多种方法,比如直接进入BIOS修改,或者进入系统后修改。 如果我想每次开机都改成一个固定的时间,进入系统后自动更新为正确的时间(一般用于过期软件破解) 现在可以直接使用GRUB4DOS来实现自动修改了。
[原创] GRUB4DOS 通用模块之文件选择模块[2011-10-01 更新]
本模块是一个GRUB4DOS的批处理 可用于搜索N级目录下的指定类型文件,并显示于菜单上 这是一个通用模块,可以通过参数直接调用或者通过预先设置变量的方法再调用, 使用方法请参考本站另一贴子 [原创] GRUB4DOS 通用模块之分区选择
[GRUB4DOS] 通用模块之字符串替换
本程序使用GRUB4DOS批处理编写. 实现了以下功能. 替换某个变量中指定的字符串. 删除某个变量中指定的字符串. 使用方法: 把脚本另存为REPLACE 然后直接调用 replace 变量名 字符串1 字符串2 [起始位置]
[GRUB4DOS] 通用模块之分区选择
通用Grub4dos硬盘分区选择接口模块, 供有需要的朋友使用. 可以在你的菜单中简单的加入一个分区选择模块. 要求: 必须使用2011-08-09以后发布的GRUB4DOS 使用方法: 首先复制代码另存为hd_part.lst然后在你的批处理或菜单中直接调用.调用的方法有两种.
[整理] 汇编几个重要内存单元地址
本附录按类列举出一些重要的系统信息在内存中物理地址,为直接访问内存读取相应信息提供方便。 了解的内容:了解计算机系统的一些重要信息在内存中的存放位置。需要时,可直接访问内存读取相应信息。 本附录主要用于查阅,当使用时,知道在本附录中查阅。
[分享] 解决由于DNS不正常导致不能上网的问题
使用此方法可以解决由于WINSOCK错误造成DNS无法解析,还有和WINSOCK相关的程序无法正常使用的问题。 只需要一个命令就可以搞定了: 说下我碰到这个问题的情况,如果有人碰到和我类似的也可以试试。
MODBOOT DOS程序最后的辉煌[2011-05-03更新]
MODBOOT是何物? MODBOOT是一个模块化的DOS启动控制中心。 基于以下网站的MODBOOT改进而成的,配合GRUB4DOS启动,实现真正的模块化 http://nu2.nu/bootdisk/modboot/
[原创] VHD_MNT VHD文件快速挂载/卸载工具
VHD_MNT 是使用批处理写的一个小程序 , 可以在WIN7以上的系统中使用. 用于快速挂载/卸载VHD虚拟磁盘. 依赖程序: 系统自带的diskpart,reg,find三个命令. 特点: 不使用第三方工具,不生成临时文件.使用方便.你需要做的只是双击.
[分享] 在使用批处理修改WINDOWS的打印机设置
因为无忧里面以下贴子, http://bbs.wuyou.com/viewthread.php?tid=187450 所以就抽空研究了一下整理了一个批处理出来. 自己目前用不上,发在这里留一个底,万一自己以后碰到了就有现成的可用了.
[转]Linux 汇编语言开发指南
汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux 平台上编写汇编代码的程序员提供指南,介绍 Linux 汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux 汇编程序。一、简介作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux 程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:· 能够直接访问与硬件相关的存储器或 I/O 端口;· 能够不受编译器的限制,对生成的二进制代码进行完全的控制;· 能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;· 能够根据特定的应用对代码做最佳的优化,提高运行速度;· 能够最大限度地发挥硬件的功能。同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:· 编写的代码非常难懂,不好维护;· 很容易产生 bug,难于调试;· 只能针对特定的体系结构和处理器进行优化;· 开发效率很低,时间长且单调。Linux 下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux 平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include、#ifdef 等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C 语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的 C 编译器都做了这方面的扩充,这其中当然就包括 Linux 平台下的 GCC。二、Linux 汇编语法格式绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:在 AT&T 汇编格式中,寄存器名要加上 ‘%’ 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:AT&T 格式Intel 格式pushl %eaxpush eax在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:AT&T 格式Intel 格式pushl $1push 1AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:AT&T 格式Intel 格式addl $1, %eaxadd eax, 1在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀‘b’、‘w’、‘l’分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 “byte ptr” 和 “word ptr” 等前缀来表示的。例如:AT&T 格式Intel 格式movb val, %almov al, byte ptr val在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上‘*’作为前缀,而在 Intel 格式中则不需要。远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 “ljump” 和 “lcall”,而在 Intel 汇编格式中则为 “jmp far” 和 “call far”,即:AT&T 格式Intel 格式ljump $section, $offsetjmp far section:offsetlcall $section, $offsetcall far section:offset与之相应的远程返回指令则为:AT&T 格式Intel 格式lret $stack_adjustret far stack_adjust在 AT&T 汇编格式中,内存操作数的寻址方式是section:disp(base, index, scale)而在 Intel 汇编格式中,内存操作数的寻址方式为:section:[base + index*scale + disp]由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:disp + base + index * scale下面是一些内存操作数的例子:AT&T 格式Intel 格式movl -4(%ebp), %eaxmov eax, [ebp - 4]movl array(, %eax, 4), %eaxmov eax, [eax*4 + array]movw array(%ebx, %eax, 4), %cxmov cx, [ebx + 4*eax + array]movb $4, %fs:(%eax)mov fs:eax, 4三、Hello World!真不知道打破这个传统会带来什么样的后果,但既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串 “Hello World!”,那我们也以这种方式来开始介绍 Linux 下的汇编语言程序设计。在 Linux 操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用 Linux 内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯,不需要链接诸如 libc 这样的函数库,也不需要使用 ELF 解释器,因而代码尺寸小且执行速度快。Linux 是一个运行在保护模式下的 32 位操作系统,采用 flat memory 模式,目前最常用到的是 ELF 格式的二进制代码。一个 ELF 格式的可执行程序通常划分为如下几个部分:.text、.data 和 .bss,其中 .text 是只读的代码区,.data 是可读可写的数据区,而 .bss 则是可读可写且没有初始化的数据区。代码区和数据区在 ELF 中统称为 section,根据实际需要你可以使用其它标准的 section,也可以添加自定义 section,但一个 ELF 可执行程序至少应该有一个 .text 部分。下面给出我们的第一个汇编程序,用的是 AT&T 汇编语言格式:例1. AT&T 格式#hello.s .data # 数据段声明 msg : .string ”Hello, world!\\n” # 要输出的字符串 len = . - msg # 字串长度.text # 代码段声明.global _start # 指定入口函数 _start: # 在屏幕上显示一个字符串 movl $len, %edx # 参数三:字符串长度 movl $msg, %ecx # 参数二:要显示的字符串 movl $1, %ebx # 参数一:文件描述符(stdout) movl $4, %eax # 系统调用号(sys_write) int $0×80 # 调用内核功能 # 退出程序 movl $0,%ebx # 参数一:退出代码 movl $1,%eax # 系统调用号(sys_exit) int $0×80 # 调用内核功能初次接触到 AT&T 格式的汇编代码时,很多程序员都认为太晦涩难懂了,没有关系,在 Linux 平台上你同样可以使用 Intel 格式来编写汇编程序:例2. Intel 格式; hello.asm section .data ; 数据段声明 msg db ”Hello, world!”, 0xA ; 要输出的字符串 len equ $ - msg ; 字串长度section .text ; 代码段声明global _start ; 指定入口函数_start: ; 在屏幕上显示一个字符串 mov edx, len ; 参数三:字符串长度 mov ecx, msg ; 参数二:要显示的字符串 mov ebx, 1 ; 参数一:文件描述符(stdout) mov eax, 4 ; 系统调用号(sys_write) int 0×80 ; 调用内核功能 ; 退出程序 mov ebx, 0 ; 参数一:退出代码 mov eax, 1 ; 系统调用号(sys_exit) int 0×80 ; 调用内核功能上面两个汇编程序采用的语法虽然完全不同,但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出程序。在 Linux 内核源文件 include/asm-i386/unistd.h 中,可以找到所有系统调用的定义。四、Linux 汇编工具Linux 平台下的汇编工具虽然种类很多,但同 DOS/Windows 一样,最基本的仍然是汇编器、连接器和调试器。1.汇编器汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序:[xiaowp@gary code]$ as -o hello.o hello.sLinux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是 Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序:[xiaowp@gary code]$ nasm -f elf hello.asm2.链接器由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:[xiaowp@gary code]$ ld -s -o hello hello.o3.调试器有人说程序不是编出来而是调出来的,足见调试在软件开发中的重要作用,在用汇编语言编写程序时尤其如此。Linux 下调试汇编代码既可以用 GDB、DDD 这类通用的调试器,也可以使用专门用来调试汇编代码的 ALD(Assembly Language Debugger)。从调试的角度来看,使用 GAS 的好处是可以在生成的目标代码中包含符号表(symbol table),这样就可以使用 GDB 和 DDD 来进行源码级的调试了。要在生成的可执行程序中包含符号表,可以采用下面的方式进行编译和链接:[xiaowp@gary code]$ as –gstabs -o hello.o hello.s[xiaowp@gary code]$ ld -o hello hello.o执行 as 命令时带上参数 –gstabs 可以告诉汇编器在生成的目标代码中加上符号表,同时需要注意的是,在用 ld 命令进行链接时不要加上 -s 参数,否则目标代码中的符号表在链接时将被删去。在 GDB 和 DDD 中调试汇编代码和调试 C 语言代码是一样的,你可以通过设置断点来中断程序的运行,查看变量和寄存器的当前值,并可以对代码进行单步跟踪。图1 是在 DDD 中调试汇编代码时的情景:图1 用 DDD 中调试汇编程序汇编程序员通常面对的都是一些比较苛刻的软硬件环境,短小精悍的ALD可能更能符合实际的需要,因此下面主要介绍一下如何用ALD来调试汇编程序。首先在命令行方式下执行ald命令来启动调试器,该命令的参数是将要被调试的可执行程序:[xiaowp@gary doc]$ ald helloAssembly Language Debugger 0.1.3Copyright (C) 2000-2002 Patrick Alkenhello: ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)Loading debugging symbols…(15 symbols loaded)ald>当 ALD 的提示符出现之后,用 disassemble 命令对代码段进行反汇编:ald> disassemble -s .textDisassembling section .text (0×08048074 - 0×08048096)08048074 BA0F000000 mov edx, 0xf08048079 B998900408 mov ecx, 0×80490980804807E BB01000000 mov ebx, 0×108048083 B804000000 mov eax, 0×408048088 CD80 int 0×800804808A BB00000000 mov ebx, 0×00804808F B801000000 mov eax, 0×108048094 CD80 int 0×80上述输出信息的第一列是指令对应的地址码,利用它可以设置在程序执行时的断点:ald> break 0×08048088Breakpoint 1 set for 0×08048088断点设置好后,使用 run 命令开始执行程序。ALD 在遇到断点时将自动暂停程序的运行,同时会显示所有寄存器的当前值:ald> runStarting program: helloBreakpoint 1 encountered at 0×08048088eax = 0×00000004 ebx = 0×00000001 ecx = 0×08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0×00000000 esi = 0×00000000 edi = 0×00000000ds = 0x0000002B es = 0x0000002B fs = 0×00000000 gs = 0×00000000ss = 0x0000002B cs = 0×00000023 eip = 0×08048088 eflags = 0×00000246Flags: PF ZF IF08048088 CD80 int 0×80如果需要对汇编代码进行单步调试,可以使用 next 命令:ald> nextHello, world!eax = 0x0000000F ebx = 0×00000000 ecx = 0×08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0×00000000 esi = 0×00000000 edi = 0×00000000ds = 0x0000002B es = 0x0000002B fs = 0×00000000 gs = 0×00000000ss = 0x0000002B cs = 0×00000023 eip = 0x0804808F eflags = 0×00000346Flags: PF ZF TF IF0804808F B801000000 mov eax, 0×1若想获得 ALD 支持的所有调试命令的详细列表,可以使用 help 命令:ald> helpCommands may be abbreviated.If a blank command is entered, the last command is repeated.Type `help <command>’ for more specific information on <command>.General commandsattach clear continue detach disassembleenter examine file help loadnext quit register run setstep unload window writeBreakpoint related commandsbreak delete disable enable ignorelbreak tbreak五、系统调用即便是最简单的汇编程序,也难免要用到诸如输入、输出以及退出等操作,而要进行这些操作则需要调用操作系统所提供的服务,也就是系统调用。除非你的程序只完成加减乘除等数学运算,否则将很难避免使用系统调用,事实上除了系统调用不同之外,各种操作系统的汇编编程往往都是很类似的。在 Linux 平台下有两种方式来使用系统调用:利用封装后的 C 库(libc)或者通过汇编直接调用。其中通过汇编语言来直接调用系统调用,是最高效地使用 Linux 内核服务的方法,因为最终生成的程序不需要与任何库进行链接,而是直接和内核通信。和 DOS 一样,Linux 下的系统调用也是通过中断(int 0×80)来实现的。在执行 int 80 指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之后,返回值可以在寄存器 eax 中获得。所有的系统调用功能号都可以在文件 /usr/include/bits/syscall.h 中找到,为了便于使用,它们是用 SYS_<name> 这样的宏来定义的,如 SYS_write、SYS_exit 等。例如,经常用到的 write 函数是如下定义的:ssize_t write(int fd, const void *buf, size_t count);该函数的功能最终是通过 SYS_write 这一系统调用来实现的。根据上面的约定,参数 fb、buf 和 count 分别存在寄存器 ebx、ecx 和 edx 中,而系统调用号 SYS_write 则放在寄存器 eax 中,当 int 0×80 指令执行完毕后,返回值可以从寄存器 eax 中获得。或许你已经发现,在进行系统调用时至多只有 5 个寄存器能够用来保存参数,难道所有系统调用的参数个数都不超过 5 吗?当然不是,例如 mmap 函数就有 6 个参数,这些参数最后都需要传递给系统调用 SYS_mmap:void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);当一个系统调用所需的参数个数大于 5 时,执行int 0×80 指令时仍需将系统调用功能号保存在寄存器 eax 中,所不同的只是全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针。系统调用完成之后,返回值仍将保存在寄存器 eax 中。由于只是需要一块连续的内存区域来保存系统调用的参数,因此完全可以像普通的函数调用一样使用栈(stack)来传递系统调用所需的参数。但要注意一点,Linux 采用的是 C 语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即最后一个参数先入栈,而第一个参数则最后入栈。如果采用栈来传递系统调用所需的参数,在执行int 0×80 指令时还应该将栈指针的当前值复制到寄存器 ebx中。六、命令行参数在 Linux 操作系统中,当一个可执行程序通过命令行启动时,其所需的参数将被保存到栈中:首先是 argc,然后是指向各个命令行参数的指针数组 argv,最后是指向环境变量的指针数据 envp。在编写汇编语言程序时,很多时候需要对这些参数进行处理,下面的代码示范了如何在汇编代码中进行命令行参数的处理:例3. 处理命令行参数# args.s//有些不明白.text.globl _start _start: popl %ecx # argcvnext: popl %ecx # argv test %ecx, %ecx # 空指针表明结束 jz exit movl %ecx, %ebx xorl %edx, %edxstrlen: movb (%ebx), %al inc %edx inc %ebx test %al, %al jnz strlen movb $10, -1(%ebx) movl $4, %eax # 系统调用号(sys_write) movl $1, %ebx # 文件描述符(stdout) int $0×80 jmp vnextexit: movl $1,%eax # 系统调用号(sys_exit) xorl %ebx, %ebx # 退出代码 int $0×80 ret七、GCC 内联汇编用汇编编写的程序虽然运行速度快,但开发速度非常慢,效率也很低。如果只是想对关键代码段进行优化,或许更好的办法是将汇编指令嵌入到 C 语言程序中,从而充分利用高级语言和汇编语言各自的特点。但一般来讲,在 C 代码中嵌入汇编语句要比“纯粹“的汇编语言代码复杂得多,因为需要解决如何分配寄存器,以及如何与C代码中的变量相结合等问题。GCC 提供了很好的内联汇编支持,最基本的格式是:__asm__(“asm statements”);例如:__asm__(“nop”); 如果需要同时执行多条汇编语句,则应该用“\\n\\t”将各个语句分隔开,例如:__asm__( ”pushl %%eax \\n\\t” ”movl $0, %%eax \\n\\t” ”popl %eax”);通常嵌入到 C 代码中的汇编语句很难做到与其它部分没有任何关系,因此更多时候需要用到完整的内联汇编格式:__asm__(“asm statements” : outputs : inputs : registers-modified);插入到 C 代码中的汇编语句是以“:”分隔的四个部分,其中第一部分就是汇编代码本身,通常称为指令部,其格式和在汇编语言中使用的格式基本相同。指令部分是必须的,而其它部分则可以根据实际情况而省略。在将汇编语句嵌入到C代码中时,操作数如何与C代码中的变量相结合是个很大的问题。GCC采用如下方法来解决这个问题:程序员提供具体的指令,而对寄存器的使用则只需给出“样板“和约束条件就可以了,具体如何将寄存器与变量结合起来完全由GCC和GAS来负责。在GCC内联汇编语句的指令部中,加上前缀‘%’的数字(如%0,%1)表示的就是需要使用寄存器的“样板“操作数。指令部中使用了几个样板操作数,就表明有几个变量需要与寄存器相结合,这样GCC和GAS在编译和汇编时会根据后面给定的约束条件进行恰当的处理。由于样板操作数也使用‘%’作为前缀,因此在涉及到具体的寄存器时,寄存器名前面应该加上两个‘%’,以免产生混淆。紧跟在指令部后面的是输出部,是规定输出变量如何与样板操作数进行结合的条件,每个条件称为一个“约束“,必要时可以包含多个约束,相互之间用逗号分隔开就可以了。每个输出约束都以‘=’号开始,然后紧跟一个对操作数类型进行说明的字后,最后是如何与变量相结合的约束。凡是与输出部中说明的操作数相结合的寄存器或操作数本身,在执行完嵌入的汇编代码后均不保留执行之前的内容,这是GCC在调度寄存器时所使用的依据。输出部后面是输入部,输入约束的格式和输出约束相似,但不带‘=’号。如果一个输入约束要求使用寄存器,则GCC在预处理时就会为之分配一个寄存器,并插入必要的指令将操作数装入该寄存器。与输入部中说明的操作数结合的寄存器或操作数本身,在执行完嵌入的汇编代码后也不保留执行之前的内容。有时在进行某些操作时,除了要用到进行数据输入和输出的寄存器外,还要使用多个寄存器来保存中间计算结果,这样就难免会破坏原有寄存器的内容。在GCC内联汇编格式中的最后一个部分中,可以对将产生副作用的寄存器进行说明,以便GCC能够采用相应的措施。下面是一个内联汇编的简单例子:例4.内联汇编/* inline.c */int main(){ int a = 10, b = 0; __asm__ __volatile__(“movl %1, %%eax;\\n\\r” ”movl %%eax, %0;” :”=r”(b) /* 输出 */ :”r”(a) /* 输入 */ :”%eax”); /* 受影响的寄存器 */ printf(“Result: %d, %d\\n”, a, b);}上面的程序完成将变量a的值赋予变量b,有几点需要说明:· 变量b是输出操作数,通过%0来引用,而变量a是输入操作数,通过%1来引用。· 输入操作数和输出操作数都使用r进行约束,表示将变量a和变量b存储在寄存器中。输入约束和输出约束的不同点在于输出约束多一个约束修饰符‘=’。· 在内联汇编语句中使用寄存器eax时,寄存器名前应该加两个‘%’,即%%eax。内联汇编中使用%0、%1等来标识变量,任何只带一个‘%’的标识符都看成是操作数,而不是寄存器。· 内联汇编语句的最后一个部分告诉GCC它将改变寄存器eax中的值,GCC在处理时不应使用该寄存器来存储任何其它的值。· 由于变量b被指定成输出操作数,当内联汇编语句执行完毕后,它所保存的值将被更新。在内联汇编中用到的操作数从输出部的第一个约束开始编号,序号从0开始,每个约束记数一次,指令部要引用这些操作数时,只需在序号前加上‘%’作为前缀就可以了。需要注意的是,内联汇编语句的指令部在引用一个操作数时总是将其作为32位的长字使用,但实际情况可能需要的是字或字节,因此应该在约束中指明正确的限定符:限定符意义“m”、“v”、“o”内存单元“r”任何寄存器“q”寄存器eax、ebx、ecx、edx之一“i”、“h”直接操作数“E”和“F”浮点数“g”任意“a”、“b”、“c”、“d”分别表示寄存器eax、ebx、ecx和edx“S”和“D”寄存器esi、edi“I”常数(0至31) 1。”m”:操作数是内存变量。 2。”o”:操作数是内存变量,但它的寻址方式必须是“偏移量”类型的, 也就是基址寻址或者基址加变址寻址。 3。”V”:操作数是内存变量,其寻址方式非“偏移量”类型。 4。” ”:操作数是内存变量,其地址自动增量。 6。”r”:操作数是通用寄存器。 7。”i”:操作数是立即操作数。(其值可在汇编时确定) 8。”n”:操作数是立即操作数。有些系统不支持除字(双字节)以外的 立即操作数,这些操作数要用”n”而不是”i”来描述。 9。”g”:操作数可以是立即数,内存变量或者寄存器,只要寄存器属 于通用寄存器。 10。”X”:操作数允许是任何类型。 11。”0″,”1″,…,”9″:操作数与某个指定的操作数匹配。也就是说, 该操作数就是指定的那个操作数。例如,如果用”0″来描述”%1″操作 数,那么”%1″引用的其实就是”%0″操作数。 12。”p”:操作数是一个合法的内存地址(指针)。 13。”=”:操作数在指令中是只写的(输出操作数)。 14。”+”:操作数在指令中是读-写类型的(输入-输出操作数)。 15。”a”:寄存器EAX。 16。”b”:寄存器EBX。 17。”c”:寄存器ECX。 18。”d”:寄存器EDX。 19。”q”:寄存器”a”,”b”,”c”或者”d”。 20。”A”:寄存器”a”或者”d”。 21。”a”:寄存器EAX。 22。”f”:浮点数寄存器。 23。”t”:第一个浮点数寄存器。 24。”u”:第二个浮点数寄存器。 25。”D”:寄存器di。 26。”S”:寄存器si。 27。”I”:0-31之间的立即数。(用于32位的移位指令) 28。”J”:0-63之间的立即数。(用于64位的移位指令) 29。”N”:0-255之间的立即数。(用于”out”指令) 30。”G”:标准的80387浮点常数。 八、小结Linux操作系统是用C语言编写的,汇编只在必要的时候才被人们想到,但它却是减少代码尺寸和优化代码性能的一种非常重要的手段,特别是在与硬件直接交互的时候,汇编可以说是最佳的选择。Linux提供了非常优秀的工具来支持汇编程序的开发,使用GCC的内联汇编能够充分地发挥C语言和汇编语言各自的优点。参考资料1 在网站 http://linuxassembly.org上可以找到大量的Linux汇编资源。2 软件包binutils提供了as和ld等实用工具,其相关信息可以在网站 http://sources.redhat.com/binutils/上找到。3 NASM是Intel格式的汇编器,其相关信息可以在网站 http://nasm.sourceforge.net上找到。4 ALD是一个短小精悍的汇编调试器,其相关信息可以在网站 http://dunx1.irt.drexel.edu/~psa22/ald.html上找到。5 intel2gas是一个能够将Intel汇编格式转换成AT&T汇编格式的小工具,其相关信息可以在网站 http://www.niksula.cs.hut.fi/~mtiihone/intel2gas/上找到。6 IBM developerWorks上有一篇介绍GCC内联汇编的文章( http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/index.shtml)。7 本文代码下载: 代码。GAS中每个操作都是有一个字符的后缀,表明操作数的大小。C声明GAS后缀大小(字节)charb1shortw2(unsigned) int / long / char*l4floats4doublel8long doublet10/12注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。操作数格式:格式操作数值名称样例(GAS = C语言)$ImmImm立即数寻址$1 = 1EaR[Ea]寄存器寻址%eax = eaxImmM[Imm]绝对寻址0×104 = *0×104(Ea)M[R[Ea]]间接寻址(%eax)= *eaxImm(Ea)M[Imm+R[Ea]](基址+偏移量)寻址4(%eax) = *(4+eax)(Ea,Eb)M[R[Ea]+R[Eb]]变址(%eax,%ebx) = *(eax+ebx)Imm(Ea,Eb)M[Imm+R[Ea]+R[Eb]]寻址9(%eax,%ebx)= *(9+eax+ebx)(,Ea,s)M[R[Ea]*s]伸缩化变址寻址(,%eax,4)= *(eax*4)Imm(,Ea,s)M[Imm+R[Ea]*s]伸缩化变址寻址0xfc(,%eax,4)= *(0xfc+eax*4)(Ea,Eb,s)M(R[Ea]+R[Eb]*s)伸缩化变址寻址(%eax,%ebx,4) = *(eax+ebx*4)Imm(Ea,Eb,s)M(Imm+R[Ea]+R[Eb]*s)伸缩化变址寻址8(%eax,%ebx,4) = *(8+eax+ebx*4)注:M[xx]表示在存储器中xx地址的值,R[xx]表示寄存器xx的值,这种表示方法将寄存器、内存都看出一个大数组的形式。数据传送指令:指令效果描述movl S,DD <– S传双字movw S,DD <– S传字movb S,DD <– S传字节movsbl S,DD <– 符号扩展S符号位填充(字节->双字)movzbl S,DD <– 零扩展S零填充(字节->双字)pushl SR[%esp] <– R[%esp] – 4;M[R[%esp]] <– S压栈popl DD <– M[R[%esp]];R[%esp] <– R[%esp] + 4;出栈注:均假设栈往低地址扩展。算数和逻辑操作地址:指令效果描述leal S,DD = &Smovl地版,S地址入D,D仅能是寄存器incl DD++加1decl DD–减1negl DD = -D取负notl DD = ~D取反addl S,DD = D + S加subl S,DD = D – S减imull S,DD = D*S乘xorl S,DD = D ^ S异或orl S,DD = D | S或andl S,DD = D & S与sall k,DD = D << k左移shll k,DD = D << k左移(同sall)sarl k,DD = D >> k算数右移shrl k,DD = D >> k逻辑右移特殊算术操作:指令效果描述imull SR[%edx]:R[%eax] = S * R[%eax]无符号64位乘mull SR[%edx]:R[%eax] = S * R[%eax]有符号64位乘cltd SR[%edx]:R[%eax] = 符号位扩展R[%eax]转换为4字节idivl SR[%edx] = R[%edx]:R[%eax] % S;R[%eax] = R[%edx]:R[%eax] / S;有符号除法,保存余数和商divl SR[%edx] = R[%edx]:R[%eax] % S;R[%eax] = R[%edx]:R[%eax] / S;无符号除法,保存余数和商注:64位数通常存储为,高32位放在edx,低32位放在eax。条件码:条件码寄存器描述了最近的算数或逻辑操作的属性。CF:进位标志,最高位产生了进位,可用于检查无符号数溢出。OF:溢出标志,二进制补码溢出——正溢出或负溢出。ZF:零标志,结果为0。SF:符号标志,操作结果为负。比较指令:指令基于描述cmpb S2,S1S1 – S2比较字节,差关系testb S2,S1S1 & S2测试字节,与关系cmpw S2,S1S1 – S2比较字,差关系testw S2,S1S1 & S2测试字,与关系cmpl S2,S1S1 – S2比较双字,差关系testl S2,S1S1 & S2测试双字,与关系访问条件码指令:指令同义名效果设置条件sete DsetzD = ZF相等/零setne DsetnzD = ~ZF不等/非零sets DD = SF负数setns DD = ~SF非负数setg DsetnleD = ~(SF ^OF) & ZF大于(有符号>)setge DsetnlD = ~(SF ^OF)小于等于(有符号>=)setl DsetngeD = SF ^ OF小于(有符号<)setle DsetngD = (SF ^ OF) | ZF小于等于(有符号<=)seta DsetnbeD = ~CF & ~ZF超过(无符号>)setae DsetnbD = ~CF超过或等于(无符号>=)setb DsetnaeD = CF低于(无符号<)setbe DsetnaD = CF | ZF低于或等于(无符号<=)跳转指令:指令同义名跳转条件描述jmp Label1直接跳转jmp *Operand1间接跳转je LabeljzZF等于/零jne Labeljnz~ZF不等/非零js LabelSF负数jnz Label~SF非负数jg Labeljnle~(SF^OF) & ~ZF大于(有符号>)jge Labeljnl~(SF ^ OF)大于等于(有符号>=)jl LabeljngeSF ^ OF小于(有符号<)jle Labeljng(SF ^ OF) | ZF小于等于(有符号<=)ja Labeljnbe~CF & ~ZF超过(无符号>)jae Labeljnb~CF超过或等于(无符号>=)jb LabeljnaeCF低于(无符号<)jbe LabeljnaCF | ZF低于或等于(无符号<=)转移控制指令:(函数调用):指令描述call Label过程调用,返回地址入栈,跳转到调用过程起始处,返回地址是call后面那条指令的地址call *Operandleave为返回准备好栈,为ret准备好栈,主要是弹出函数内的栈使用及%ebp
weesetup 微型grub安装工具 V1.3
wee 是一个微型的grub4dos用于安装到硬盘mbr上,可以用来代替之前的grldr.mbr方案。 支持的文件系统: FAT12/16/32/NTFS EXT2/3/4 weesetup是为了方便安装wee63.mbr而写的程序。支持自定义脚本。
[原创] 大小写转换函数简化版
在编程中经常会需要对字符串进行大小写的转换。 正常情况下是用两个函数upper和lower进行转换。 其实转换的方法还是有挺多种的 比如我之前写的:C语言的基础函数大小写转换 今天再发一个合二为一的版本,一个函数可以就实现把字符串转换为大写或小写,而且代码也很简单:
金山快盘PHP SDK(普通版+简化版)[2013-04-12]
金山快盘开放平台 PHP SDK 来源: 时间: 2013-04-12使用方法: 有两个版本,一个是普通版kuaipan.class.php,一个是简化版(简化操作)kp.class.php 可以根据自己的需要选择使用。
[PHP] 简易的SMTP邮件发送类
最近由于需要发送(带大附件)的邮件,上网找了一下,像PHPMailer等试了一下,虽然封装得很好,但是用起来都不太顺手。 像PHPMailer发送大附件时就会提示类似如下的错误: Allowed memory size of 16777216 bytes exhausted (tried to allocate 7355049 bytes)
使用共享打印机的另一个方案
一直都懒得写文章,嘿嘿,抽空把一些日常工作中用到的实用功能分享一下,也许会有人需要. 一般情况下使用共享打印机都是直接输入计算机名或IP然后双击那个共享的打印机进行安装,这个方法比较简单. 但是有一些软件它必须使用LPT端口来打印,这时就没有办法用共享了,这里介绍另一种安装方法,可以解决这类问题.如果你早就知道了可以跳过,因为可能是一样的方法.
使用PHP+CURL搭建一个简易的HTTP代理服务端[2012-12-17]
使用PHP做的一个简易HTTP代理服务端,没有多少技术含量.有时可以利用一下.嘿嘿.比如在公司内部可以用它来偷偷上网,当然了要求了内部网站,并且支持PHP而且该服务器可以上网,你还要有办法访问到这个电脑.
PHP相关记录
PHP Curl 417 Expectation Failed原因: 服务端使用lighttpd,而lighttp不支持返回”Expect: 100-continue”这样的header,就会以417 “Expectation failed” 来代替(lighttpd 1.5.0无此问题)。解决方法:更新到新版或设置CURL头信息CURLOPT_HTTPHEADER=>array(‘Expect:’);
关于2345网址导航
关于2345网址导航,我最早是从无忧启动论坛的推广广告中看到的,据说只要设为主页就有工资拿, 平时也不太理会它,只是帮人装机就顺手设置一下主页,应该有一年了吧,才2万左右积分. 三个月前积分被冻结,说是推广数据异常,可是我实在查不出为什么异常,申诉了几次,一直到现在还是冻结状态.
[原创] 电信天翼云盘直链效果测试
最近在学习PHP,随手做几个基于网盘的直链,,嘿嘿以后不用担心没有地方放文件了. 初步测试,挺稳定的说,放一段时间看一下. 没有什么好说的.直接上效果, 图片直链 MP3在线播放 你的浏览器不给力呀,要支持html5的才行喔。建议试试chrome。
[分享] 使用 PHP CURL 模拟登录新浪微博
有时候我们获取一些新浪微博的数据,但又不想使用API,只好使用模拟登录了. 发现以前可以使用的CURL模拟登录代码失效了,Google一下,发现有很多人碰到这个问题.但是没有找到解决方法,所以就自己研究了一下,发现了原因.
[分享]华军软件园免验证码下载
以前经常去华军软件园下载软件,后来很少上了,最近发现下载需要输入验证码才能下载. 这个验证码是带广告类型的,需要输入中文,很是麻烦,对于我等懒人来说当然是能不用输入就不用输入了. 查了一下网页源码,发现可以直接饶过验证下载.原理有兴趣的自己Google一下.^_^这里就不再啰嗦了.直接进入主题.
[分享] 华为网盘的直链测试(免费版)
最近学习了一下PHP,这个其实比金山快盘的直链更早写的, 相比官方的版本,更简单,这个没有限制目录的哦,不需要流量费的,可能会被封锁,不过这个是利用官方提供的API写的,应该不会,关键是华为网盘的速度够快.若是被封锁了就有些可惜.
金山快盘直链
使用快盘API写了一个直链的应用测试.. 以后可以把文件或图片直接上传到快盘中,然后直链. API有调用限制,好像是一天5000次,对于我等小站来说足够用了, 另外好像快盘的文件下载速度没有华为网盘的给力啊.速度相对比较慢,可以对比一下我的另一个文章关于华为网盘直链的测试,显示图片的速度更快.
网盘外链的简单破解
目前国内有许多网盘,大都是禁止外链的,即使支持也需要钱的. 一般网盘的下载链接只能从网盘所属域上链接下载,或直接输入地址下载.如果你把这个链接放到你的网站上是不可以用的. 像这种一般情况下是根据来源地址(Referer)判断的,如果来源地址是合法的域则可以下载,否则提示错误.
[原创] 解除华为网盘下载限制[2012-09-18]
华为网盘其实挺好的,上下载速度都很快。只是下载的时候可以说十之八九会跳出注册登录的窗口,也就是需要登录才能下载。这个本来没有什么,只是我的密码都是随机的,记不住啊,每每下载都要登录太麻烦了。所以就想看看有没有什么办法可以不用登录直接下载的。查看了一下网页源码,发现其实很简单。
[记录] 创建不区分大小写的ZFS卷方便使用FreeNas的TFTP服务器
如题,因为默认情况下创建的卷都是有区分大小写的,这样一来使用TFTP服务就不太方便。而Windows下的TFTP服务器就没有这样的问题,因为WINDOWS都是不区分大小写的,为了方便需要想办法TFTP服务不区分大小写。
[原创]华为网盘免密码一键登录(2012-08-21更新)
因为最近在折腾的自动签到程序,之前使用模拟的方法登录,速度慢,而且很容易出错。 所以就想使用post的方法快速登录。 经过抓包分析终于搞定了,以下是原理。 post 的地址是 http://login.dbank.com/loginauth.php?nsp_app=48049
[原创]各类网站自动签到/带源码[2012-10-10更新]
鉴于目前的许多网络硬盘,一般初始空间比较小,要获取更多免费的空间除了邀请好友加入以外,就是签到功能了,目前国内的网盘都有类似的功能。 一些人可能同时拥有N个网盘,每天打开然后签到,有点浪费时间,但是为了这一些免费空间还是会有人乐此不疲的。
[分享] 基于GRUB4DOS的硬盘工具箱[2012-06-27DP更新]
自用的硬盘工具箱,可以方便进行系统维护工作。 引导程序WEE+GRUB4DOS。 自带基于MODBOOT的一键恢复程序QGHO,可以随时进行备份恢复系统。 可以方便的进行功能扩展,一切皆有可能。 说明:
[分享] Windows NT 系列通用启动盘[204-08-31]
【说明】 本启动盘可以用于直接启动硬盘上的NT系统.可以从任意地方加载这个镜像文件进行启动。 可以通过本镜像启动硬盘上的Windows系统,不依赖硬盘上的系统引导文件. 也可以用于U盘或光盘启动时,直接启动硬盘上的其它系统.
[分享] 自己动手,在WINDOWS系统中搭建GRUB4DOS编译环境[2014-06-25]
因为经常使用WINDOWS系统,为了方便直接在WINDOWS下搭建。 使用Colinux可以很方便的在WINDOWS中运行一直真实的Linux环境。 好了,废话不多说了,直接开始了。如果想偷懒的话,有提供了可以直接使用的成品下载。
[分享]电脑防毒小技巧一则
现在的电脑病毒越来越多,也越来越厉害,有时真的有点防不胜防。 并且它特别喜欢感染可执行程序文件,因为这样就可以一传十,十传百,快速传播。 这里分享一个小技巧,可以让你的应用程序免受感染(当然只是大部份情况下免疫)
卡蝶机
卡碟機 是一項很具創意的發明。它可以讓你把光碟 ISO 映像檔「燒」到 MicroSD 卡中, 而電腦就會從媒體身份(Media Type)的層面把 MicroSD 卡辨認為一部傳統的 DVD/CD 光碟機。 系統管理員可以把操作系統的安裝光碟內容寫到卡碟機裡的 MicroSD 卡裡,就可以免卻使用外置式光碟機和燒碟的麻煩,方便又環保。
[分享] LuaJIT的FFI调用WINDOWS API功能示例
使用LuaJIT的FFI调用WINDOWS API来实现一些特别功能。比如网络访问,修改窗体,获取鼠标下的文本,获取鼠标位置等。
[转] Lua简明教程
Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本。这只是一篇非常简单的语言学习文章,希望能让你在入厕或是上班公车途中一口气很流畅地读完,从而对Lua这个脚本语言有一个比较大致的了解。
静态搏客 jekyll & Hexo
Hexo 和 jekyll 都是简单的免费的Blog生成工具,只生成静态网页,不需要数据库支持,评论可以使用第三方服务像Disqus还有国内的多说。特别是由于github直接支持jekyll很多人已经使用jekyll写搏客了。
[分享] 手贱再次入手一个便宜的VPS $9.99/年
主机商采用的是自己的KiwiVM管理面板,Bandwagonhost好像只能PayPal付款,并有一个30天的退款保证. 目前该主机商给LEB读者发布了一个优惠码,只要在付款时在Promotional Code用中输入”LEB”优惠码价格就会变成原价的%50.01.
[PHP] 中文转拼音首字母简易实现方案
在某些情况下,为了简化查询,我们需要提取中文的拼音首字母, 比如”中华人民共和国” 是ZHRMGHG 最近在ALMRun程序就用到了这个方法,,顺便写了一下PHP版的.感觉PHP的更简单哈, 适用于要求不是很高的场合,因为这个没有处理多音字,只支持GB2312字符,不过优点就是足够简单,几行代码的问题.有需要的可以拿去用,欢迎报错.
[分享] ALMRun–小巧的快速启动工具
ALMRun 是一个实用绿色的快速启动软件,类似于ALTRUN等同类软件,集成了ALTRUN的优点.绿色实用,支持管理热键/程序,支持模拟输入,支持LUA扩展,通过LUA扩展.无所不能.
[学习] LUA脚本学习1
获取WINDOWS文件的文件名/路径/扩展名例子: WINDOWS下环境变量扩展 例子: 获取CMD命令输出结果 例子: 其中read参数可以如下 *a 读取所有内容 *n 读取为数据(当输出为数字时用,否则会得到空值)
最近通过了新浪云计算SAE高级开发者认证
从申请到拿到证书,完成认证,将近一个月的时间. 通过高级认证之后每个月会自动把云豆补满到1.5万,也就是说我以后基本上可以完全免费使用SAE的资源了,嘿嘿. 支持JAVA,PYTHON,PHP等语言,相当于一个免费的虚拟主机,但比虚拟主机更加强大.
[记录] VPS 初步接触
最近从PzEA入手一个xen VPS,从网上搜到的优惠链接(PzEa给力特价VPS 256M Xen VPS 2.5美元 洛杉矶和圣何塞机房)购买的,以下是购买时可以看到的配置信息。实际上硬盘是10G的。够用了
[PHP] 打算整合多个网盘资源
目前有N多的网络硬盘,各有各的好处和优缺点.另外基本上都有开放API.只是API调用方法都不一样.若是可以让所有网盘的调用方法变得一致.这样一来如是要开发什么的都很方便了.一个网盘不行了就换一个,什么代码都不用改.
单文件程序制作利器Cameyo更新
本站的软件大部份是使用该软件制作的. Cameyo News Version 2.0.873 is out Improved Windows 8 support Automatically notifies about new Cameyo versions
[grub4dos] grub4dos 0.4.6a ipxegrldr 功能介绍
grub4dos 0.4.6a ipxegrldr 支持ipxe完整功能调用,ipxe相关介绍
[grub4dos] grub4dos 最新版本initrdfs功能介绍
grub4dos 最新版本initrdfs功能介绍,主要介绍多个程序整合成单个程序
DriveDroid 让安卓手机变成系统启动盘
说明 This application requires root(需要手机有Root权限) DriveDroid allows you to boot your PC from ISO/IMG files stored on your phone. This is ideal for trying Linux distributions or always having a rescue-system on the go… without the need to burn different CDs or USB pendrives.
Cameyo PackageEditor 基本使用介绍
Cameyo 是一款可以媲美 thinstall 的虚拟化软件,可以把整个应用程序虚拟化为单文件版,虚拟化后的软件不需要安装可以在任意电脑上运行,这里简单介绍一下通过 Cameyo PackageEditor 把一个绿色软件制作成单文件版的方法.
Cameyo PackageEditor 简体中文版(增强版)
Cameyo 是一款完全免费的应用程序虚拟化 (Application Virtualization) 工具或者说单文件软件制作工具,PackageEditor 是 Cameyo 的虚拟化程序包修改编辑器,这是基于原版进行细微修改的简体中文版.
linux sudo 命令和配置文件/etc/sudoers介绍
sudo 是linux下常用的允许普通用户使用超级用户权限的工具。 它的配置文件 sudoers 一般在 /etc 目录下。 不过不管 sudoers 文件在哪儿,sudo 都提供了一个编辑该文件的命令:visudo 来对该文件进行修改。强烈推荐使用该命令修改 sudoers,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。
[分享] HG320路由器盲刷64K CFE NVRAM固件
HG320是一款神器级的高性价比无线路由器,由于其厂家为“烽火通信科技股份有限公司”,这款产品更多的被叫做了“烽火HG320”。中国电信采购了这款设备,并作为安装业务时的标配产品,但这次中国电信难得厚道了一把。
Hexo 模块化主题
hexo模块化主题,自由,强大,本主题还通过主题插件实现了很多特色功能(仅此一家).支持多个一级分类、子分类、iLink文章内链、ijs文章内嵌脚本等.
博客转移到hexo
经过一段时间的处理转换,大量的手工活,总体来说搬家还是挺顺利,整个转换过程使用了差不多1个月的时间.终算把博客搬到hexo上了. 前段时间在尝试静态博客,之后决定使用hexo,然后就是一系列的折腾再折腾.设计完善本主题,对hexo进行改进(大部份改进已经并入到官方主源码分支).
[原创] pretty自动加载语言代码
使用jquery代码实现 pretty 根据需要自动加载对应语言的.不受路径/CDN限制,自动获取prettify文件的路径,自动加载需要的代码高亮文件.
[推荐] 免费的云计算Koding
Koding其实是就一个免费的VPS(只是没有独立IP),使用了LINUX UBUNTU操作系统. 支持一键安装各种程序,像WORDPRESS之类的,很简单. 支持在线编写代码,编译等..支持主流环境PHP,PYTHON,PERL,RUBY
【分享】WIMBoot辅助工具 For Windows 7/8
把WINDOWS 8的WIMBOOT功能应用到WINDOWS 7上,目前使用一切正常. 使用WIMBOOT可以节省大量的磁盘空间,特别是多系统的情况下更是明显.另外还具有WIM文件的特性,比如增量备份,如果每隔一段时间就使用增量更新一下WIM那以后就可以随时恢复到每个更新点的状态.
[GRUB4DOS] Universal Master Boot Record
[功能说明] UMBR(Universal Master Boot Record),是一个简单的通用型的MBR引导程序,只支持LBA模式(BIOS不支持LBA的无法使用,目前除了很老的机子大部份都有支持).