Archive for the Category »program «

软盘引导扇区

当电脑以磁盘启动时,BIOS会自动载入这个磁盘的第一个扇区(共512字节),即这个磁盘的0面0磁道1扇区。如果这个扇区是以0xAA55这个两字节的16进制数结束,即该扇区最后两位是0×55、0xAA(AA为高位,因此在后),那么BIOS就会认为它是一个引导扇区。0xAA55因此也称为引导标识(Boot Sector Signature),而磁盘的第一个扇区也称为引导扇区(Boot Sector)。

如果BIOS发现该引导扇区可引导,那么BIOS就会将控制权全部交给这个扇区的代码。也就是说从此BIOS撒手不管了,接下来的时就由这512字节的引导代码来做了。你可以认为BIOS唯一做的东西就是载入引导扇区(固定地都是载入到内存中的0000:7C00处),并判断最后的两字节是否0xAA55,如果是那么就将控制权交给这个扇区的代码。

详细内容见这里

好了,下面来实践一下。在网上找到了很多代码,其中这个代码是最简短的一个,使用NASM来进行编译。

[BITS 16] ;Tells the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded

MOV SI, HelloString ;Store string pointer to SI
CALL PrintString ;Call print string procedure
JMP $ ;Infinite loop, hang it here.

PrintCharacter: ;Procedure to print character on screen
;Assume that ASCII value is in register AL
MOV AH, 0×0E ;Tell BIOS that we need to print one charater on screen.
MOV BH, 0×00 ;Page no.
MOV BL, 0×07 ;Text attribute 0×07 is lightgrey font on black background

INT 0×10 ;Call video interrupt
RET ;Return to calling procedure

PrintString: ;Procedure to print string on screen
;Assume that string starting pointer is in register SI

next_character: ;Lable to fetch next character from string
MOV AL, [SI] ;Get a byte from string and store in AL register
INC SI ;Increment SI pointer
OR AL, AL ;Check if value in AL is zero (end of string)
JZ exit_function ;If end then return
CALL PrintCharacter ;Else print the character which is in AL register
JMP next_character ;Fetch next character from string
exit_function: ;End label
RET ;Return from procedure

;Data
HelloString db ‘Hello World’, 0 ;HelloWorld string ending with 0

TIMES 510 – ($ – $$) db 0 ;Fill the rest of sector with 0
DW 0xAA55 ;Add boot signature at the end of bootloader

使用NASM编译成boot.bin,并写到磁盘(可千万不要写到自己的硬盘上哦,拿软盘做实验吧~)的第一扇区上就可以了。重启动系统并以该磁盘启动就行了。瞧,经典的Hello World!

Category: program, reading  Comments off

Apache上运行Perl CGI

最近迷上了Perl,想用Perl写一个WEB软件来管理一些工作上的内容。以前都是用Java来写的web程序,这次换成Perl尝试一下,估计也挺有趣。可是一开始就遇到一些问题,折腾了一个晚上。幸好最后还是解决了。将过程记录下来,希望对后来者有用。

安装Apache服务器

web服务器是一个软件,也可以把它看作是一个web程序的运行平台,我们通过它来发布我们的web程序。Apache便是众多的web服务器软件中的一个,应该也是最流行的那一个。

首先到Apache的官方网站下载。我这里使用了Apache HTTP Server 2.2的Windows版本,后面也都是按照这个版本进行安装配置。

下载下来一路“下一步”安装完成后,打开浏览器输入“http://localhost/”。如果显示“It works!”的话,恭喜你,Apache服务安装成功了。

安装Perl

Perl在Windows上的Perl语言解释器是Active Perl。我这里使用的版本是5.8。

下载后同样是一路“下一步”。安装完后在命令行中输入“perl -V”,如果显示版本信息的话则表示你安装成功了。

让Apache运行Perl CGI

在Apache的安装目录下找到conf/httpd.conf文件,用记事本或其他的文本编辑器打开。

查找“ScriptAlias /cgi-bin/”,可能你的会是下面的这个结果:

ScriptAlias /cgi-bin/ “C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/”

如果这行前面的有个“#”符号,就将它去掉。

找到下面的这段文本:

<Directory />
Options FollowSymLinks
AllowOverride all
Order deny,allow
Deny from all
</Directory>

加上“+ExecCGI”,即:

<directory />
Options FollowSymLinks +ExecCGI
AllowOverride all
Order deny,allow
Deny from all
</Directory>

一般来说,Perl CGI脚本就是以cgi为拓展名的,不过你也可以设置成pl为拓展名。修改方法是这样的,查找下面的这行:

AddHandler cgi-script .cgi

在末尾加上“.pl”,即:

AddHandler cgi-script .cgi .pl

好了,修改完上面所说的配置,重新启动Apache即可。

哦,对了,忘了写测试页面。在“C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/”下建立一个名叫“index.pl”的文件,里面写:

#!/usr/bin/perl
print “Content-type: text/html\r\n\r\n”;
print “Hello, Perl CGI!”;

打开浏览器输入“http://localhost/cgi-bin/index.pl”。如果显示“Hello, Perl CGI!”的话,恭喜你,你的第一个基于Apache的Perl CGI程序部署成功了!

安装mod_perl模块

最后作为题外话需要提一下mod_perl模块。关于mod_perl是什么,官方网站说得比较清楚,我就不说了。我们还是来说说如何安装及配置mod_perl吧。

首先是安装mod_perl。在命令行中输入以下命令:

ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd

这时ppm就会自动下载并进行编译安装,到最后它会问你Apache的模块目录在哪里,这时你要输入你的Apache的mudules文件夹的路径。如:

C:\Program Files\Apache Software Foundation\Apache2.2\modules

安装好mod_perl.so了。下面来进行配置,让Apache装置mod_perl模块。在你的httpd.conf的末尾加上以下文字:

LoadFile “D:/Perl/bin/perl58.dll”
LoadModule perl_module modules/mod_perl.so
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

其中 “D:/Perl/bin/perl58.dll”根据你的perl的实际安装路径进行修改。

好了,配置到此为此。重新启动Apache,并在浏览器地址栏中输入“http://localhost/cgi-bin/index.pl”。嗯,又看到“Hello, Perl CGI!”了!

现在,你可以自由自在地写Perl CGI程序了~Enjoy~!

Category: program  Comments off

linux下使用gcc进行编译

linux下使用gcc编译C程序和编译C++程序是不一样的。编译C程序时,应使用gcc命令,而编译C++程序时,则应该使用g++命令了。gcc和g++实际上用的都是同一个编译器,它们的区别只是在于默认的链接库不一样而已。

编译C程序(文件后缀为c)
gcc helloc.c -o helloc

编译C++程序(文件后缀为cpp)
g++ hellocpp.cpp -o hellocpp

Category: program  Comments off

《Javascript核心技术》读后感

learning javascript

手上这本《Javascript核心技术》读了有一个半月了,好不容易终于读完了。其实这本书不厚,也就300页多点;不新,很多东西我甚至都实践过;不难,说的都是些基础知识。但是我还是用了一个多月,有工作忙的原因,当然我想更多的还是我的懒惰。仅仅半年前,我读那1000+页的《蒙古帝国》也就只用了1周。

这本书谈到了许多基础性的知识,如变量的作用域,Javascript的正则表达式,函数直接量,回调函数,DOM事件等。这些技术可能每天都在用,但只是在用其很小的一部分,使得一直以来只见树木,不见森林,只是其果,不知其由。特别是函数一章,以前不是太理解参数是如何传递给回调函数的,于是只好将参数作为全局变量,在回调函数中调用这个全局变量,从而变相地实现向回调函数传递参数的效果。虽说现在工作中web部分的设计及开发都是我负责的,可是代码质量我知道还有很多改进的地方,因此底气也并不是那么足。现在终于知道了,可以使用函数直接量来很好地解决这个问题。另一个比较大的收获则是了解了DOM的事件机制,了解了原理后,现在写起页面的事件控制来真的有种得心应手的感觉。

不过话说回来,编程毕竟不是生活的全部,有时间的话还是关上电脑出去会会朋友,陪陪父母、女朋友,他们才是陪伴你一生的人。

– EOF –

Category: program, reading  Comments off

工作小结

忙活了一个月,终于将前一阵分给我的任务完成了。呵呵,真不容易啊!说说完成这个工作的小结吧。

一直以来我就有想将页面标准化的打算,但是一直没有充足的时间来仔细推敲每一个细节,从而做到页面的MVC化。也就是页面本身只维护语义,不含有修饰与操作,而把修饰将给了CSS,操作交给了Javascript。如果将CSS与Javascript拿掉的话,页面仍然是能够正常运行的,而且能从源文件(HTML)中容易得看出信息体来,不会被大量的修饰代码(HTML中内嵌的CSS)而干扰。页面的标准化应该算是我的最大的收获了。

更熟悉了JQuery这个js库。JQuery可真是好东西,用它来写代码可真是有行云流水的感觉,十分地痛快!这回我大量地使用了这个库,基本上它每一个函数我都用到了,也算是一次充分的实践学习了。至于CSS,主要是学习了其如何进行排版,恩,应该还算是中级水平吧。

总结了使用Struts的一个最佳实践。在开发中我去掉了恼人的ActionForm以及Struts Tag。我觉得ActionForm实在是个冗余的东西,虽然说有了这个东西,似乎在结构上更完整了,但同时导致更琐碎了——我不得不为每一个表单写一个ActionForm,而我的目的仅仅是为了将页面上提交过来的字段集转换成一个bean!ActionForm使得类库十分臃肿,于是我去掉了ActoinForm,写了一个通过request中提交的参数来构造bean的通用类来代替它的转换能力。呵呵,在Action中就一行代码就可以获得我要的bean了,实在痛快。如何用上ActionForm我还要写一大推的ActionForm与Bean的转换代码,烦死人了。你可能会说校验呢?校验是ActionForm的一个好处,但是我把校验放到了界面层去做了,还有必要重复吗?在JSP层上我去掉了Struts Tag。倒不是它不好,只是完全标签化了,我进行预览时页面上就一个字都看不见了,像一座空城。使用EL表达式就爽快很多了,预览时也能看到些东西,表示这个地方有信息要信息。当然还有一个好处,就是用EL表达式能少敲好些字符呢。对于喜欢偷懒的我自然是乐在其中了。

由于人员紧张,因此整个工作从页面设计到实现、从前端到到数据库都是我一个人完成的,甚至包括恼人的字符集问题。收获很多,当然也很累。不过也是值得的,出来出来的效果不错外,还说明我的能力还是挺全面的嘛,而不是之前认为的只强于页面技术。这回好了,一专多能!

总结比较凌乱,就这么招吧,不修改了。

– EOF –

Category: program  Comments off