mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用昄字符串例E?/p>
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; es:bp = 串地址
mov cx, 16 ; cx = 串长?/p>
mov ax, 01301h ; ah = 13, al = 01h
mov bx, 000ch ; 号?(bh = 0) 黑底U字(bl = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中?/p>
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空_(d)使生成的二进制代码恰?/p>
?/p>
; 512字节
dw 0xaa55 ; l束标志
5 使用Floppy Writer编译过的文件写入前面徏立的floppy上?br />6启动虚拟机?br />可以看到效果?jin)?br />
下一步该研究引导E序?/strong>
摘要Q?/b>本文主要讲述?jin)Linux下用汇~的利弊Q以?qing)常用汇~工L(fng)使用和语法特炏V重点讲qC(jin)NASM?
引言Q?/b>汇编语言是低U语aQ与g和操作系l紧密联pR个人电(sh)脑以前都是用DOSQ现在发展成?jin)WINDOWS 98Q而另一个操作系lLinux也正在崛赗下面比较一下这三个操作pȝQ?
DOS较稳定,速度快无法充分发挥计机性能Q没有图形界面较低?
WINDOWS 98操作便,应用软g?g兼容性好Q不E_Q经常死机,速度慢高?
Linux性能优秀Q非常稳定,界面观Q操作简便;~Z软g厂商支持Q应用Y件少免费?
׃上的比较可知QLinux操作pȝ本nh较大优势Q它的普?qing)应该只是时间问题,所以如何在Linux下开发Y件是我们计算机系学生必须学习(fn)与研I的一个课题?
Linux 下的主要~程语言是CQ同时Linuxq支持其他许多编E语aQ汇~语a作ؓ(f)最重要的编E语a之一Q当然也包括在内。它能够完成许多其他语言所不能完成的功能。要学习(fn)Linux~程Q就必须要学?fn)Linux下的汇编E序设计。下面我来介绍一下Linux下的汇编E序设计?
Linux汇编?/b>
一、汇~语a的优~点
׃Linux是用C写的Q所以C自然而然的就成ؓ(f)?jin)Linux的标准编E语a。大部分人都把汇~给忽略?jin),甚至在因特网上找资料都是非常的困难,很多问题都需要靠自己来尝试。我认ؓ(f)q样对待汇编语言是不公^的,不能只看到它的缺点,当然也不能只看到它的优点Q下面把它的优缺点作一个比较:(x)
优点Q汇~语a可以表达非常底层的东?
可以直接存取寄存器和I/OQ?
~写的代码可以非常精的被执行;
可以~写出比一般编译系l高效的代码Q?
可以作ؓ(f)不同语言或不同标准的接口?
~点Q汇~语a是一个非怽U的语言
非常冗长单调Q在DOS下编E时可以体?x)到Q?
易出BUGQ且调试困难Q?
代码不易l护Q?
兼容性不好,与硬件关p非常紧密?
ȝ来说Q汇~语a要用在必ȝ地方Q尽量少用汇~编写大型程序,多采用inline模式?
二、汇~语a工具
DOS 下常用的工具MASM和TASM到Linux下就用不h?jin),Linux有自q汇编工具Q而且U类非常的多。其中Gas可以是标准配置Q每一U?Linux中都包括有GasQ但是GAS采用的不是我们通常在DOS下采用的汇编语法Q它采用的是ATQT的语法格式,与intel语法格式有很大的不同?
如果要采用与DOS接近的语法格式,必ȝ另一U汇~工具NASMQNASM基本与MASM相同Q但也有不少地方有较大区别,特别涉及(qing)到操作系l原理时Q与DOS可以说是截然不同?
Linux汇编E序设计
一、Hello,world!
几乎所有的语言入门都是以“Hello,world!”ؓ(f)例,那么我也以Hello,world!Z开始?
|
说明Q这个程序实际上是调用了(jin)QLinuxpȝ的puts函数Q原理与调用DOS下C语言的函数相同,先用Extern声明puts是外部函敎ͼ再把参数Q即msg的地址Q压入堆栈,最后Call函数实现输出?
我们再来看一个程序:(x)
|
q个E序与DOSE序十分怼Q它用的是linux中的80h中断Q相当于DOS下的21h中断Q只是因为Linux?2位操作系l,所以采用了(jin) EAX、EBX{寄存器。但是Linux作ؓ(f)一个多用户的操作系l与DOS又是有着非常大的区别的。要写出有特色的E序Q不?jin)解操作pȝ和硬件是不行的。下面我介绍一下Linux操作pȝ?
二、Linux操作pȝ?/b>
操作pȝ实际是抽象资源操作到具体g操作l节之间的接口。对Linuxq样的多用户操作pȝ来说Q它需要避免用户对g的直接访问,q止用户之间的互相q扰。所以Linux接管?BIOS调用和端口输入输出,关于端口输入输出斚w请参阅Linux IO-Port-Programming HOWTO。而要通过Linux对硬件硬件进行访问就需要用到System CallQ实际上是许多C的函敎ͼ可以在汇~程序中调用Q调用方法与DOS下的汇编完全相同Q而且用ASM汇编时不用链接额外的库函数?
Linux与DOS的主要区别在于内存管理、进E(DOS下无q程概念Q、文件系l,其中内存理和进E与汇编~程的关pL较密切:(x)
1、内存管?/b>
对Q一台计机而言Q其内存以及(qing)其他资源都是有限的。ؓ(f)?jin)让有限的物理内存满_用程序对内存的大需求量QLinux采用?jin)称为“虚拟内存”的内存理方式。Linux内存划分ؓ(f)Ҏ(gu)处理的“内存页”,在系l运行过E中Q应用程序对内存的需求大于物理内存时QLinux可将暂时不用的内存页交换到硬盘上Q这PI闲的内存页可以满应用E序的内存需求,而应用程序却不会(x)注意到内存交换的发生?
q程
q程实际是某特定应用E序的一个运行实体。在Linuxpȝ中,能够同时q行多个q程QLinux通过在短的时间间隔内轮流q行q些q程而实现“多d”。这一短的旉间隔UCؓ(f)“时间片”,让进E轮运行的Ҏ(gu)UCؓ(f)“调度”,完成调度的程序称度程序。通过多Q务机Ӟ每个q程可认为只有自q占计机Q从而简化程序的~写Q每个进E有自己单独的地址I间Qƈ且只能由q一q程讉KQ这P操作pȝ避免?jin)进E之间的互相q扰以及(qing)“坏”程序对pȝ可能造成的危実?
Z(jin)完成某特定Q务,有时需要综合两个程序的功能Q例如一个程序输出文本,而另一个程序对文本q行排序。ؓ(f)此,操作pȝq提供进E间的通讯机制来帮助完成这L(fng)d。Linux中常见的q程间通讯机制有信受管道、共享内存、信号量和套接字{?
三、Linux下的汇编工具
Linux下的汇编工具可谓癑֮争鸣Q不像DOS下都要给MASM和TASMl控制了(jin)。但是Linux下每一U汇~工具都有很大的区别Q要惛_部掌握几乎是不可能的Q下面我介绍几种常用的汇~工P重点介绍NASM?qing)其使用和语法?
1、GCC
GCC其实是GNU的C语言产品Q但它支持Inline AssembleQ在GCC中inline assemble使用像宏一P但它比宏能更清楚更准的表达机器的工作状态?
C是汇~编E的一个高度概括,它可以减许多汇~中的麻?ch),特别是在GCCq个C~译器中Qassembleg起不?jin)多大的作用?
2、GAS
GAS 是Linux各版本中基本的汇~工P但它采用的是AT&T的语法标准与Intel的语法标准有很大的不同,对于DOS~程的我们来_(d)学习(fn)h是非常困隄。当然如果要_NLinux下的汇编~程Q学?fn)GAS也是非常必要的,具体的语法标准可以参看Using GNU Assembler?
3、GASP
GASP是GAS的扩展,它增Z(jin)GAS对宏的支持?
4、NASM
NASM是linux中语法与DOS最为相像的一U汇~工兗虽说如此,它与MASM也是有着很大区别的?
l NASM的用格式如下:(x)
Nasm –f -o
例如Q?
Nasm -f elf hello.asm
把hello.asm汇编成ELF object文gQ而Nasm -f bin hello.asm -o hello.com?x)把hello.asm汇编成二q制可执行文件hello.com.Nasm –h会(x)列出NASM命o(h)行的完整说明。NASM不会(x)有Q何输出,除非有错误发生?f 在Linux下主要有aout和ELF两种Q如果你不确定你的Linuxpȝ应该用AOUTq是ELFQ可以在NASM目录中输?File nasm Q如果输出nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1表示是ELFQ如果输出nasm: Linux/i386 demand-paged executable (QMAGIC)表示是aout?
NASM与MASM的主要不同:(x)
首先与linuxpȝ一Pnasm是区分大写的,Hello与hello是不同的标识符Q如果要汇编到DOS或OS/2Q需要加入UPPERCASE参数?
其次Qnasm中内存操作数都是以[ ]表示?
在MASM?
|
被汇编成完全不同的指o(h)Q虽然它们在MASM中的表达方式完全一栗而NASM完全避免?jin)这U乱,它用的是这L(fng)规则Q所有对内存的操作都必须通过 [ ]来实现。例如上例中对bar的操作就要写成如下Ş?mov ax,[bar]。由此可见,nasm中对offset的用也是没有必要的Qnasm中无offsetQ。Nasm对[ ]的用与masm也有所不同Q所有的表达式都必须写在[ ]中,下面举两个例子来说明Q?
|
Nasm 中不存储变量cdQ原因很单masm中通过[ ]d方式的变量也必须要指定类型。Nasm中不支持LODS, MOVS, STOS, SCAS, CMPS, INS, OUTSQ只支持lodsb、lodsw{已l指定类型的操作。Nasm中不再有assume操作Q段地址完全取决于存入段寄存器的倹{关于NASM的用方法及(qing)语法q可以参阅NASM使用手册?
l论
我认Z论是在Windows/DOS下还是在Linux下完完全全用汇编~一个大型程序已l是不可能了(jin)Q也不会(x)有h愿意去这样做。在windows下我们可以用VCQ在Linux/Xwindows下我们可以用C甚至C++ BuilderQ但是像VC、C++ Builder之类的工具尽量隐藏了(jin)底层的调用,同时也阻隔了(jin)成ؓ(f)高手的机?x),因?f)~出来的E序无法?jin)解它的执行q程也就使编E中最重要的“可预测”性变得很低。正因ؓ(f)如此汇编才有它存在的必要性,同时q有一个更重要的原因,正如《超U解霸》的作者梁肇新所_(d)(x)“编E序的重点不是“编”,而是调试E序Q理Z的完在实现的时候会(x)遇到很多l节问题Q这些问题必调试才能解冟뀂我的编E习(fn)惯是一天写五天调试Q《超U解霸》是调试出来的,而不是写出来的。调试就涉及(qing)到汇~的问题Q不q行汇编U的调试是不d的,也不能让人放?j)?/p>
在这里,我们ȝ一下?/span> NASM 的几大理由:(x)
?/span> NASM ?/span> MASM 接近Q入门比较容易?/span>
?/span> NASM 在不同^C均可使用Q可以在 Windows 下编写ƈ调试Q然后拿?/span> Linux 下用?/span>
?/span> 自带反汇~程序,方便取用?/span>
?/span> 文档丰富Q自带的文档?/span> Word ?/span> PDF ?/span> CHM 三种版本Q检索极为方ѝ?/span>
?/span> 它是免费的?/span>
NASM 安装h也很单,?/span> http://nasm.sourceforge.net/ 可以扑ֈ各个q_下的安装包和相关文档?/span>
1、VMware4.5
host与guest操作pȝ的共享首先需要安装VMware ToolsQ步骤如下:(x)1Q在启动虚拟?strong>文本模式(否则安装?x)失?以后Q鼠标依ơ单击VMwareȝ面上的“设定”选单→“VMware工具安装”选单,然后在弹出的对话框里单击“Install”;[2Q在该对话框上选中“DVD/CD-ROMQIDE 1:0Q”列表项Q可以看到虚拟机光驱有两U连接方式,一U是直接使用物理驱动器,另一U是使用ISO映像。这里选中后者。然后单几Z浏览”按钮,指定Linux.iso映像文g的\径(位于VMware的安装目录\VMware\VMware Workstation\Programs\Linux.iso下)(j)卛_。]3Q此时在/mnt[/cdrom]目录下,?x)发现多了(jin)一个文Ӟ(x)vmware-linux-tools.tar.gzQ这是VMware Tools的Linux安装包;4Q然后再把该文g拯到tmp目录下,键入“cp ./vmware-linux-tools.tar.gz /tmp”命令即可?Q现在虚拟机光驱的命完成了(jin)Q应该把它卸载,用命令“umount /dev/cdrom”即可?Q接下来应该解压~vmware-linux-tools.tar.gz文g。首先进入tmp目录Q用“cd /tmp”命令,然后用“tar zxf vmware-linux-tools.tar.gz”命令将其解压羃Q把它释攑ֈ同名目录下(即vmware-linux-tools目录Q?Q然后用“cd vmware-linux-tools[或者别的名字]”进入解压后的目录,用“ls”命令显C其下的内容Q从中可以看到install.pl是VMware Tools的安装程序?Q最后用?/install.pl[可能是别的文件名]”命令来q行该安装程序,然后Ҏ(gu)屏幕提示一路回车。到此整个安装过E算是完成了(jin)?/p>
讄文g׃n(必须先安装好VMware Tools)QVM——〉setting——〉Options——〉Shared FoldersQlinux中对应的目录为:(x)/mnt/hgfs
d启动虚拟软驱Q启动虚拟机之前——〉VM——〉setting——〉Hardware——〉如果device选项中没有Floppy的话Q“add”——〉create a blank floppy or use a floppy: *.img——?/p>
2、Linux9.0
3、WinImage8.0Q创拟Y?.img文g
4、FloppyWriterQ将*.bin文g写入*.img文g的工?/p>
5、asm汇编~译、调试工?/p>
nasmQ?a >http://webster.cs.ucr.edu/AsmTools/NASM/index.html
nasm manualQ?a >http://nasm.sourceforge.net/doc/html/nasmdoc0.html
ald(需要搜?Q?a >http://sourceforge.net/project/showfiles.php?group_id=102112Q安装这个Y件运?/configure的时候,因ؓ(f)要修Ҏ(gu)件夹的读写属性,如果没有_的权限或者是q行在与host׃n的文件夹(该文件夹一般不允许修改d属性,但是可以d文g)下,则会(x)报告?strong>chmod …?"710" "700" permited”类似的错误?/p>
gdb的图形版本dddQ?a >www.gnu.com/ddd
6、安装virtualpc和PC-DOS/MS-DOS——没有必要装微Y的这个破东西Q在VMware中也可以和硬盘共?/p>
到microsoft主页上下载virtual pc2004(热键为键盘右边的Alt)Q?a >http://www.microsoft.com/downloads/details.aspx?FamilyId=6D58729D-DFA8-40BF-AFAF-20BCB7F01CD1&displaylang=en
dos启动盘下载地址Q?a >http://www.cn-dos.net/newdos/doswarea.htm#pcdos
׃n讄Q网l上盛传的文件夹׃nҎ(gu)我L不能成功Q大概是没有权限写。这里有另外一U办法可以访问到所有的盘信息Q只是不能写Q但是矣。主Z写asmE序Qdos虚拟Zq行实模式下的comE序?/p>
新徏一个MS-DOS的虚拟机——〉新Z个虚拟的hard disk——〉完成之后,点击此虚拟机的setting——〉在hard Disk1中,q行Virtual Disk向导——〉创Z个新的Virtual Disk——〉在Virtual Hard Disk Option选项中选择“Linked to a hard disk”——〉返回到此虚拟机的setting中的Hard Disk 1Q将刚刚新徏的Virtual Disk加蝲到Hard Disk 1中去——〉运行此虚拟机,点击菜单栏的Floppy中的“Capture Floppy Disk Img”,加蝲下蝲的MS-DOS/PC-DOS img文g?/p>
7、Virtual PC中启动Turbo debugger(tasm5中包含此软g)
下蝲地址Q?a >http://www.begin.org.cn/
正式?.0Q推荐)(j)Q?a >http://tt.stu.edu.cn/download/Application.htm
虽然?中说C能在与主机共享的文g夹中q行写操作,但是是可以在虚拟软驱中写文g的,所以在VPC的dos中可以将E序安装在A盘中。安装鼠标驱动也是这么实现的Q先用WinImage鼠标驱动程序加载到dos驱动E序中去Q再在A盘中直接q行安装
看看?很不错的!
自由软gC是一个充满自由和梦想的地方,?0余年的时间里它创造了(jin)一个又一个奇qV然而,q些奇迹的创造者不只是StallmanQ也不只是Linus TorvaldsQ而是z跃在世界各地的不计其数的开发h员?
作者:(x)伊梅
自由软gC是一个充满自由和梦想的地方,?0余年的时间里它创造了(jin)一个又一个奇qV然而,q些奇迹的创造者不只是StallmanQ也不只是Linus TorvaldsQ而是z跃在世界各地的不计其数的开发h员?
在用各U功能强大的自由软gӞ我M(x)对其开?