学习汇编前你应该知道的知识 1.doc
《学习汇编前你应该知道的知识 1.doc》由会员分享,可在线阅读,更多相关《学习汇编前你应该知道的知识 1.doc(17页珍藏版)》请在三一文库上搜索。
1、学习汇编前你应该知道的知识 1学习汇编前你应该知道的知识(1)2010-11-02 20:53第一讲学习汇编前你应该知道的知识1汇编需要什么工具和程序,到哪里下载?目前阶段,汇编程序仅需要两个程序就够了。masm.exe,link.exe。二者可由下载,前者是编译程序,后者是链接程序。另外,为了验证和调试程序,还需要一个程序debug.exe,该程序由windows本身就提供,所以就不提供下载地址了。将二者下载后,放到某一个目录中(任意目录都可以),考虑到很多命令需要通过键盘敲入,所以建议你不要把文件放入到长文件名目录、中文目录或很深的目录中。比如你可以建一个D:Masm目录,并建议此后的程序
2、都放这个目录,此后称这个目录为汇编目录。2学习汇编需要有哪些编程方面的知识。没有任何编程方面的知识,学习此语言等于缘木求鱼,所以请放弃学习的想法。一般来说至少要知道如下几点:*)程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF.THEN.ELSE.),循环结构(FOR.NEXT)三种结构。*)知道什么是子程序,什么是调用。*)汇编程序员的视角。不同编程视角编程要求是不一样的。比如删除文件,用户的视角是找到删除按钮或菜单,然后单击一下即可。高级程序员的视角是知道删除的文件,并发出删除命令。这些通过API实现。汇编程员的视角是得到要删除的文件名,找到该文件所在位置,通过调用删除中断命令进
3、行删除。操作系统开发人员的视角则是接到删除命令后,先找到系统根目录区,由根目录区的链接依次找到子目录区,直到找到要删除的文件,然后按照操作系统删除文件的规则对该文件名进行修改。比如DOS,只把第一个字符改成?。按程序语句等价的角度看,一行VB的打印语句,用汇编实现大约需要一百二十多行。知道汇编语言的视角后就要知道,前面的道路是坎坷的,没有耐心是不行的。想通过几分钟几行程序就完成很复杂的操作不是件容易的事。3学汇编有什么用?汇编产生于DOS时代或更早,而现在是Windows时代,所以可能遗憾地说:尽管还有批牛人在用汇编开发核心级程序,但我们几乎没什么用,除了必要时间能拿来分析一两个程序的部分代码
4、之外,别的也就没干什么用了。并且并不是所有的汇编命令都能在windows下使用。而泛泛地追求时髦而学本语言,最后的结果是损了夫人又折兵。所以学之前你要考虑好。我劝那些为了当黑客而学汇编的人就此止步。第零讲预备知识1一个汇编程序的编译过程是怎么样的。1)首先你需要找一个编辑器,编辑器用任何纯文本编辑器都可以。比如记事本。编好以后保存到汇编目录中。扩展名为asm,比如myfirst.asm。但这里建议你找一个能显示出当前行的编译器。这样出错后排错很容易。2)然后在DOS下进入D:Masm目录中,输入masm myfirst.asm,如果有错系统会提示出错的行位置和出错原因。3)然后再输入link
5、myfirst.obj,即可看到当前目录下有一个myfirst.exe程序。2宏汇编和汇编有什么区别吗?二者的区别在于前者提供宏,后者不提供。后者已找不到了,所以你可以认为二者没有区别。3机器语言、汇编语言、高级语言的关系最早的计算机采用机器语言,这种语言直接用二进制数表示,通过直接输入二进制数,插拔电路板等实现,这种编程很容易出错,每个命令都是通过查命令表实现,既然是通过查表实现的,那当然也可以让计算机来代替人查表实现了。于是就产生了汇编语言,所以不管别人怎么定义机、汇语言,我就认为,二者是等价。后来人们发现,用汇编语言编某一功能的时候,连续一段代码都是相同或相似,于是就考虑用一句语言来代替
6、这一段汇编语言,于是就产生了高级语言。因此,所有高级语言都能转化成汇编语言,而所以汇编语言又可转化成机器语言。反之,所有机器语言可以转成汇编语言(因为二者等价)。但并不是所以汇编语言都能转成高级语言。4计算机的组成通常都把计算机定义成五部分:运算器、控制器、存储器、输入系统、输出系统。为了简单其间,我们如此理解:运算器+控制器=CPU。存储器=内存(暂不包括外存,永不包括CACHE)。输入系统=键盘(不包括鼠标),输入系统=显示器(不包括打印机,绘图仪)。5寄存器和内存的区别寄存器在CPU中。内存在内存条中。前者的速度比后者快100倍左右。后面的程序要求每条指定要么没有内存数据,要么在有一个寄
7、存器的参与下有一个内存数据。(也就是说,不存在只访问内存的指令)。6汇编语言的计数与生活中的计数不一样,汇编中的计数是从0开始的。比如16个计数,则是从015,而不是生活中的116。这一点看起来简单,真运算起来就不是件容易的事了,不信等着瞧。7进制问题又与生活中不一样的地方是进制。切记下面的常识:*)计算机内部存储都用二进制。*)我们的汇编源程序默认都用十进制。(除非你指明类型)*)我们用的调试程序debug默认的都是十六进制。(无法指明其他类型)其中十六进制的十六个个位数依次是:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。8进制转换一个比较简单的方法是查表法。十进制十六进
8、制二进制0 00000 11 0001 22 0010 33 0011 44 0100 55 0101 66 0110 77 0111 88 1000 99 1001 10 A1010 11 B1011 12 C1100 13 D1101 14 E1110 15 F1111好了,结合6,7,8三条。大家来算一个题。某一组数据显示时,每个数据占了四个位置,每行共十六个。问:十六进制的13位置在哪里(第几行,第几列)。格式如下:m mm mn nn no oo op pp p注:之所以没用ABC是怕与上面十六进制弄混。r rr rs ss st tt tu uu u第一讲基础知识1访问内存程序在内
9、存中,访问内存是几乎每一程序都要进行的操作,计算机对内存编址是线性的,也就是说是一维的,比如256M的内存,地址就应该是从0(256M-1),这个地址称为物理地址或绝对地址。1.1地址表示但从汇编程序员的角度看,内存却是二维的,要说明一个地址,需要给出两个值,就象你在平面上指定一点需要说出(X,Y)坐标一样,汇编程序员的内存视角也需要两个坐标,前一个称为段地址(Segment),后一个称为偏移地址(Offset),该地址称为逻辑地址。比如1234:3DF5就是一个地址。1F3F:不是一个地址,因为他只有段地址,没有编移地址。注意此后的地址都用十六进制表示。1.2地址计算前面提到,计算机编址是一
10、维的,汇编程序员是二维的,那么二者怎么换算呢?由后者到前者的换算方法是,段地址串后面加个0,然后再加上偏移地址。比如1234:3DF5(十六进制的加减运算参见相关资料)12340串后加了一个0 3DF5-16135注意此串仍然是十六进制。所以,汇编程序员眼中的地址1234:3DF5就是物理地址(计算机编址):16135。知道了由后者向前者的转换,那么由前者向后者的转换呢?不知道,为什么不知道,继续往下看。1.3到底哪个地址对。知道了1.2的地址算法后,我又发现一个问题:1000:6135的物理地址是多少呢?10000+6135=16135。1001:6125的物理地址呢?10010+6125=
11、16135。.那么到底哪个对呢?问题的回答是这样的:假设我现在让你按一下L键,我可以告诉你如下几种方法中的一种或几种。1请按一下L键;2请按一下键盘上第四行第十个键;3请按一下第十列中的第四个键;4请按一下K右边的键;5按标准指法单击一下右手无名指。举上面的例子也就是说,同一个地址有很多种表示方式,具体用哪一种,要看实际使用时的情况。但无论用哪种方式,只要能达到目的即可。(实际中该问题一般不会受此问题困扰,但初学时突然想不通)。1.4有多少内存可以访问无论是段地址还是偏移地址都是四位十六进制(如果不够四位,前面补0)。也就是说:总共可以访问的地址说是:0000:0000FFFF:FFFF。总共
12、FFFF0+FFFF+1=10FFF0个地址。也就是不到1M的空间。记住如下结论:*)不管你实际内存有多少,目前我们只能访问不到1M的空间。*)而实际上连这1M也用不完。其中上端的384K的址只能读不能写,只能读,一般称为ROM。*)低端的640K可以读写。但这640K的低端100多K也不能随便写,因此DOS系统使用该区。*)原来1024M的内存,汇编程序只能使用其中400多K。这段内存的容易相当于一个普通文档的大小。不过这就足够了。2 DEBUG的使用先记住以下两个命令:D命令和Q命令。前者是显示内存内容,后者是退出DEBUG命令。-以下为抄别的人内容-DEBUG.EXE程序是专门为分析、研
13、制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。1)DEBUG程序使用在DOS提示符下键入命令:C DEBUG盘符:路径文件名.EXE参数1参数2这时屏幕上出现DEBUG的提示符-,表示系统在DEBUG管理之下,此时可以用DEBUG进行程序调试。若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG程
14、序调入内存后,再由DEBUG将指定的文件名装入内存。2)DEBUG的常用命令(1)退出命令Q格式:Q功能:退出DEBUG,返回到操作系统。(2)显示存储单元命令D格式1:D起始地址格式2:D起始地址结束地址|字节数功能:格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示。格式2显示指定范围内存储单元的内容,其他显示方式与格式1一样。如果缺省起始地址或地址范围,则从当前的地址开始按格式1显示。例如:-D 200;表示从DS:0200H开始显示128个单元内容-D 100 120;表示显示DS:0100-
15、DS:0120单元的内容说明:在DEBUG中,地址表示方式有如下形式:段寄存器名:相对地址,如:DS:100段基值:偏移地址(相对地址),如:23A0:1500-小抄结束-3验证第一节里的内容运行开始/程序/附件/MS-DOS命令提示符(这是win2000,win98下自己找吧)在_下输入D,显示-d 1398:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1398:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 87 13.4.1398:0120 00 00 00 00 00 00 00
16、 00-00 00 00 00 00 00 00 00.1398:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1398:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1398:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1398:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1398:0170 00 00 00 00 00 00 00 00-00 00
17、00 00 00 00 00 00.-我们记下:1398:011C的值是个34。1389:011C的物理地址应该是:13A9C。那么1000:3A9C的物理地址也应该是13A9C,他的内存也应该是34,(因为本来就是一个地址吗,就象第三行第十列和第十列第三行当然应该是同一个位置)。-d 1000:3A9C 1000:3A90 34 00 87 13 4.1000:3AA0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3AB0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3
18、AC0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3AD0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3AE0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3AF0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3B00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00.1000:3B10 00 00
19、00 00 00 00 00 00-00 00 00 00.-果然如此,同样你可以验证:13A9:000C也肯定是指这一个地址,不信试试。4 DEBUG命令-继续小抄-前面已学过:显示存储单元命令D再学一个命令(1)修改存储单元命令E格式1:E起始地址内容表格式2:E地址功能:格式1按内容表的内容修改从起始地址开始的多个存储单元内容,即用内容表指定的内容来代替存储单元当前内容。例如:-E DS:0100VAR12 34表示从DS:0100为起始单元的连续五个字节单元内容依次被修改为V、A、R、12H、34H。格式2是逐个修改指定地址单元的当前内容。如:-E DS:0010 156F:0010
20、41.5F其中156F:0010单元原来的值是41H,5FH为输入的修改值。若只修改一个单元的内容,这时按回车键即可;若还想继续修改下一个单元内容,此时应按空格键,就显示下一个单元的内容,需修改就键入新的内容,不修改再按空格跳过,如此重复直到修改完毕,按回车键返回DEBUG-提示符。如果在修改过程中,将空格键换成按-键,则表示可以修改前一个单元的内容。-小抄结束-5使用DOS时,汇编用户可以从DOS操作系统中得到什么?现在编程,通常很多功能都是通过调用系统API。很多高级语言都直接把这些API包装起来,以系统接口或函数的方式提供给用户,那么汇编函数都能得到什么呢?首先,汇编用户有很多东西可以调
21、用。他们主要是:5.1 BIOS提供的接口。现在硬件与软件的区分已越来越不明显,很多硬件不仅仅是电路,而还要提供一些固化写入硬件的一部分程序,这些程序以ROM的方式出现,汇编用户最大的好处就是可以直接使用这些程序,这些使用不仅功能强大,而且效率非常高。5.2 DOS功能调用,作为操作系统也象BIOS一样向用户提供了相应的程序。这些程序在很大程序上扩充了BIOS。与BIOS不同的是,这部分程序放在内存中,它可以被修改。而BIOS中不能再修改。=以上两种接口都通过一种相同的格式调用,这些程序统称为中断,现在先不要理解中断的本意,你现在可以认为是系统提供给你的函数。=5.3系统共享数据区。编过程序的
22、人都知道全局变量的好处,全局变量方便之外在于任何函数、过程都可以调用、读取、修改。全局变量不足之处是危险性,有一个过程改了这个变量值,其它的也得跟着改变了。DOS操作系统同样也提供了这样的共享数据区,该区是整个系统的共享区,任何程序都可以查找、修改。当然,修改某处必然会对其它程序造成影响。6再谈中断前面5.2已提到中断了,现在问题是不同硬件不一样,即使相同硬件的ROM,不同版本,各个BIOS中断程序所处的位置也不一样,DOS中断也一样,不同版本、不同配置,在内存位置也不一样。那么你使用某一个中断,系统怎么知道你使用的那个中断程序在哪呢?为了解决这一问题,DOS会在启动的时候,把所有这些(BIO
23、S和DOS)中断的首地址保存到一个地址。这个地址很容易记,这段地址是内存的绝对零地址(0000:0000)。前面已讲过,每个地址在汇编程序员角度来看是二维的,也就是分为段地址和偏移地址。每个地址各占两个字节,所以要表示这个二维地址需要4个字节。所以每个中断首地址由4个字节表示。一共256个中断,占用了1024个字节的位置。另外需要注意的是,这4个表示地址的字节,数据是由低向高的。比如12 34 56 78所表示的地址是:7856:3412。一般用INT M表示中断M,如果M是十六进制,则在后面加上一个H。比如19号中断,十六进制应该是13H。所以该中断就是INT 13H。7再谈系统共享数据区该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习汇编前你应该知道的知识 学习 汇编 应该 知道 知识
链接地址:https://www.31doc.com/p-2784793.html