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