2022年2022年汇编语言入门 .pdf
《2022年2022年汇编语言入门 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年汇编语言入门 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言入门教程对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG ,有时 CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。 为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ, ) 。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超
2、浓缩(用WINZIP 、WINRAR , 依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以 “不经意” 间在前辈或是后生卖弄一下DEBUG ,很有成就感的, 试试看! 那么这个接下来呢?Here we go! (阅读时看不懂不要紧,下文必有分解)因为汇编是通过CPU 和内存跟硬件对话的,所以我们不得不先了解一下CPU 和内存:(关于数的进制问题在此不提)是可以执行电脑所有算术逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU 其汇编语言的指令语法亦不相同。个人电脑由1981 年推出至今,其CPU 发展过程为:8086 802868038
3、6 80486 PENTIUM , ,还有AMD 、CYRIX等旁支。后面兼容前面CPU 的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386 的 32 位 EAX ) 、增多了寄存器(如486的 FS) 。为确保汇编程序可以适用于各种机型,所以推荐使用8086 汇编语言,其兼容性最佳。本文所提均为8086 汇编语言。寄存器(Register)是 CPU 内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有 8 个 8 位数
4、据寄存器,这些8 位寄存器可分别组成16 位寄存器:& :累加寄存器,常用于运算;& :基址寄存器,常用于地址索引;&:计数寄存器,常用于计数;&:数据寄存器,常用于数据传递。为了运用所有的内存空间, 8086 设定了四个段寄存器, 专门用来保存段地址: (Code Segment) :代码段寄存器;(Data Segment) :数据段寄存器;(Stack Segment) :堆栈段寄存器;( Extra Segment) :附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS, DS, SS 来指向这些起始位置。通常是将DS 固定,而根
5、据需要修改CS。所以,程序可以在可寻址空间小于64K 的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K 内,这就是 COM 文件不得大于64K 的原因。 8086 以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer ) :指令指针寄存器, 与 CS 配合使用, 可跟踪程序的执行过程;SP (Stack Pointer) :堆栈指针,与 SS配合使用,可指向目前的堆栈位置。BP(Base Pointer) :基址指针寄存器,可用作SS的一个相对基址位置;SI(Source
6、 Index) :源变址寄存器可用来存放相对于DS 段之源变址指针;DI (Destination Index ) : 目的变址寄存器, 可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 数值的储存位置,叫“地址”
7、。8086 地址总线有20 位,所以CPU 拥有达 1M 的寻址空间,这也是 DOS 的有效控制范围, 而 8086 能做的运算仅限于处理16 位数据,即只有 0 到 64K,所以,必须用分段寻址才能控制整个内存地址。完整的20 位地址可分成两部份:1.段基址(Segment): 16 位二进制数后面加上四个二进制,即一个 16 进制,变成 20 位二进制数,可设定1M 中任何一个64K 段,通常记做16 位二进制数; 2.偏移量 (Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址) :3333(偏移量),其实际的 20 位地址值为: 25553。除了上
8、述营养要充分吸收外,你还要知道什么是DOS、BIOS 功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MS、IBM 的子程序, 这日子真是没法过了(关于功能调用详见电脑爱好者98 年 11 期) 。编写汇编语言有两种主要的方法:1.使用MASM或TASM等编译器;2.使用除错程序DEBUG.COM 。DEBUG 其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG 操作容易:只要键入DEBUG 回车, A 回车即可进行汇编,过程
9、简单, 而使用编译器时, 必须用到文本编辑器、编译器本身、 LINK 以及 EXE2BIN 等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG 是为了让我们接触硬件而设计的。 (8086 常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出) 。DEBUG 的的 A 命令可以汇编出简单的COM 文件,所以DEB
10、UG 编写的程序一定要由地址100h(COM 文件要求)开始才合法。FOLLOW ME ,SETP BY SETP (步步回车) :输入A100 ;从 DS:100 开始汇编2.输入MOV DL,1 ;将数值01h 装入DL 寄存器3.输入MOV AH,2 ;将数值02h 装入DL 寄存器4.输入INT 21 ;调用 DOS 21 号中断 2 号功能,用来逐个显示装入DL 的字符5.输入INT 20 ;调用 DOS 20 号中断,终止程序,将控制权交回给DEBUG 6.请按Enter 键7.现在已将汇编语言程序放入内存中了,输入G(运行 ) 8.出现结果:输出一个符号。输出结果其实不是它,因W
11、ORD97 无法显示原结果,故找一赝品将就着。Program terminated normally 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 我们可以用命令将十六进制的机器码反汇编(Unassemble)成汇编指令。 你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086 实际上就是以机器码来执行程序。1.输入U100,106 1FED:0100 B201 MOV DL,01 1FED:0102 B402 M
12、OV AH,02 1FED:0104 CD21 INT 21 1FED:0106 CD20 INT 20 DEBUG 可以用命令来查看、改变寄存器内容。CS:IP 寄存器, 保存了将执行指令地址。1.输入 R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC 1FED:0100 B201 MOV DL,01 当程序由 DS:100 开始执行, 那么终止程序时,DEBUG 会自动将IP 内容重
13、新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用命令对该程序命名。但一定要为COM 文件,否则无法以DEBUG 载入。输入 N SMILE.COM ;我们得告诉DEBUG 程序长度:程序从100 开始到 106,故占用7 ;字节。我们利用BX 存放长度值高位部分,而以CX 存放低位部分。2.输入 RBX ;查看BX 寄存器的内容,本程序只有7 个字节,故本步可省略3.输入RCX;查看CX 寄存器的内容4.输入7;程序的字节数5.输入W ;用命令将该程序写入(Write )磁盘中修行至此,我们便可以真正接触8086 汇编指令了。当我们写汇编语言程序的时候,通常不会直接将机器码放入
14、内存中,而是打入一串助记符号(Mnemonic Symbols ) ,这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU 应执行何种运算。也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC 设计的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - 现在,我们再来剖析一个可以将所有ASCII 码显示出来的程序。1. 输入DEBUG 2. 输入A100 3输入MOV CX,0100 ;装入循环次
15、数MOV DL,00 ;装入第一个ASCII 码,随后每次循环装入新码MOV AH,02 INT 21 INC DL ;INC :递增指令,每次将数据寄存器DL 内的数值加1 LOOP 0105 ; LOOP:循环指令,每执行一次LOOP, CX 值减 1,并跳;到循环的起始地址105,直到 CX 为 0,循环停止INT 20 4.输入G 即可显示所有ASCII 码当我们想任意显示字符串,如:UNDERSTAND ?,则可以使用DOS21H 号中断 9H 号功能。输入下行程序,存盘并执行看看:1.输入A100 MOV DX,109 ; DS:DX 字符串的起始地址MOV AH,9 ;DOS 的
16、 09h 功能调用INT 21 ;字符串输出INT 20 DB UNDERSTAND ?$;定义字符串在汇编语言中,有两种不同的指令:1.正规指令:如MOV 等,是属于CPU 的指令,用来告诉 CPU 在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;2.伪指令:如 DB 等, 是属于 DEBUG 等编译器的指令, 用来告诉编译器在编译时应做些什么。DB ( Define Byte ) 指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。 使用9H 功能的字符串必须以$结尾。用命令可用来查看DB 伪指令将那些内容放入内存。名师资料总结 - - -精品资料
17、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 6.输入D100 1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 .!. underst 1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F.E.F4.d. 1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57
18、56 .E.3._.WV 1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.S.2. 1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 t.3.E. 1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V.t.E.V._ 1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E FE .k.S. 1975:0170 8B C2 E8 FB FD
19、0B C0 75-09 8B 5E FE 8B 47 0C E8 .u.G. 现在, 我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。 db 20 指示 DEBUG保留 20h 个未用的内存空间供缓冲区使用。输入 A100 MOV DX,0116 ;DS:DX 缓冲区地址,由DB 伪指令确定缓冲区地址MOV AH,0A ;0Ah 号功能调用INT 21 ;键盘输入缓冲区MOV DL,0A ;由于功能Ah 在每个字符串最后加一个归位码(0Dh 由 Enter MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的INT 21 ;字符串不会盖掉原来输入的字符串,所以利
20、用功能2h 加一;个换行码 (OAh),使得光标移到下一行的的最前端。MOV DX,0118 ;装入字符串的起始位置MOV AH,09 ;9h 功能遇到 $符号才会停止输出,故字符串最后必须加上INT 21 ;$,否则 9h 功能会继续将内存中的无用数据胡乱显示出来名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - INT 20 DB 20 ;定义缓冲区送你一句话:学汇编切忌心浮气燥。客套话就不讲了。工欲善其事, 必先利其器。 与
21、其说 DEBUG 是编译器, 倒不如说它是 “直译器” ,DEBUG的 A 命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译器(MASM )的运作是利用文本编辑器(EDIT 等) 将汇编指令建成一个独立且附加名为.ASM的文本文件,称源程序。它是MASM 程序的输入部分。MASM 将输入的ASM 文件,编译成.OBJ 文件,称为目标程序。OBJ 文件仅包含有关程序各部份要载入何处及如何与其他程序合并的信息,无法直接载入内存执行。链结程序LINK则可将 OBJ 文件转换成可载入内存执行( EXEcute)的 EXE 文件。还可以用EXE2BIN ,将符合条件的EXE 文件转成COM文件(
22、 COM 文件不但占用的内存最少,而且运行速度最快)。下面我们用MASM 写一个与用DEBUG 写的第一个程序功能一样的程序。用 EDIT 编辑一个SMILE.ASM的源程序文件。源程序DEBUG 程序prognam segment assume cs:prognam org 100h A100 mov dl,1 mov dl,1 mov ah,2 mov ah,2 int 21h int 21 int 20h int 20 prognam ends end 比较一下: 1.因为 MASM 会将所有的数值假设为十进制,而DEBUG 则只使用十六进制,所以在源程序中,我们必须在有关数字后加上代表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年汇编语言入门 2022 汇编语言 入门
限制150内