(tng)mov ax, cs
(tng)mov ds, ax
(tng)mov es, ax
(tng)call DispStr ; 调用昄字符串例E?/p>
(tng)jmp $ ; 无限循环
DispStr:
(tng)mov ax, BootMessage
(tng)mov bp, ax ; es:bp = 串地址
(tng)mov cx, 16 ; cx = 串长?/p>
(tng)mov ax, 01301h ; ah = 13, al = 01h
(tng)mov bx, 000ch ; 号?(bh = 0) 黑底U字(bl = 0Ch,高(sh))
(tng)mov dl, 0
(tng)int 10h ; 10h 号中?/p>
(tng)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其内存?sh)?qing)其他资源都是有限的。ؓ(f)?jin)让有限的物理内存满_用程序对内存的大需求量QLinux采用?jin)称为“虚拟内存”的内存理方式。Linux内存划分ؓ(f)Ҏ(gu)处理的“内存页”,在系l运行过E中Q应用程序对内存的需求大于物理内存时QLinux可将暂时不用的内存页交换到硬盘(sh)Q这PI闲的内存页可以满应用E序的内存需求,而应用程序却不会(x)注意到内存(sh)换的发生?
q程
q程实际是某特定应用E序的一个运行实体。在Linuxpȝ中,能够同时q行多个q程QLinux通过在短的时间间隔内轮流q行q些q程而实现“多d”。这一短的旉间隔UCؓ(f)“时间片”,让进E轮?hu)运行的?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?
|
(tng)
被汇编成完全不同的指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> (tng) 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
(tng) (tng) (tng) (tng) (tng) 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>
(tng) (tng) (tng) (tng) (tng) 讄文g׃n(必须先安装好VMware Tools)QVM——〉setting——〉Options——〉Shared FoldersQlinux中对应的目录为:(x)/mnt/hgfs
(tng) (tng) (tng) (tng) (tng) d启动虚拟软驱Q启动虚拟机之前——〉VM——〉setting——〉Hardware——〉如果device选项中没有Floppy的话Q“add”——〉create a blank floppy or use a (tng)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启动盘(sh)载地址Q?a >http://www.cn-dos.net/newdos/doswarea.htm#pcdos
׃n讄Q网l上盛传的文件夹׃nҎ(gu)我L不能成功Q大概是没有权限写。这里有另外一U办法可以访问到所有的盘?sh)息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盘(sh)。安装鼠标驱动也是这么实现的Q先用WinImage鼠标驱动程序加载到dos驱动E序中去Q再在A盘(sh)直接q行安装
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
看看?很不错的!
自由软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)对其开?