汇编语言入门教程

上传人:s9****2 文档编号:543883579 上传时间:2024-02-10 格式:DOCX 页数:10 大小:32.59KB
返回 下载 相关 举报
汇编语言入门教程_第1页
第1页 / 共10页
汇编语言入门教程_第2页
第2页 / 共10页
汇编语言入门教程_第3页
第3页 / 共10页
汇编语言入门教程_第4页
第4页 / 共10页
汇编语言入门教程_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《汇编语言入门教程》由会员分享,可在线阅读,更多相关《汇编语言入门教程(10页珍藏版)》请在金锄头文库上搜索。

1、汇编语言入门教程一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以 被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、 调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴 趣;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的 硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样 混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机 密”,还可以自诩“高手”尽情享受强烈的虚荣感-#$%& “醒醒!”对初学

2、者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂 漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人 看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩 DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩 游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言, 太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂 的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ)。但是 想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩 (用WINZIP

3、、WINRAR依次压迫,嘿嘿!)教程。大言不惭的说,看通本文, 你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试 看!那么这个接下来呢?Here we go!(阅读时看不懂不要紧,下文必有分解)因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU 和内存:(关于数的进制问题在此不提)CPU是可以执行电脑所有算术/逻辑运算与基本I/O控制功能的一 块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言 的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为: 8086f80286f8038680486fPENTIUM

4、,还有 AMD、CYRIX 等旁支。后面 兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了 寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程 序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所 提均为8086汇编语言。寄存器(Register)是CPU内部的兀件,所以在寄存器 之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2. 存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据 到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成 16位寄存器:AH

5、&AL = AX :累加寄存器,常用于运算;BH &BL = BX: 基址寄存器,常用于地址索引;CH&CL = CX :计数寄存器,常用于计数; DH&DL = DX :数据寄存器,常用于数据传递。为了运用所有的内存空间, 8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segmen t):代 码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment): 堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时, 就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS, DS, SS来指向这些起

6、始位置。通常是将DS固定,而根据需要修改CS。所 以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和 其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K 的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前 面所提的寄存器外,还有一些特殊功能的寄存器:IP(In true tion Poin ter): 指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP (Stack Pointer): 堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP (Base Pointer):基 址指针寄存器,可用作SS的一个相对基址位置;

7、SI (Source Index):源变址 寄存器可用来存放相对于DS段之源变址指针;DI (Des tina tion Index):目的 变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器 FR (Flag Regis ter),有九个有意义的标志,将在下文用到时详细说明。内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组 织有许多可存放数值的储存位置,叫“地址”。8086地址总线有20位,所以CPU 拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于 处理16位数据,即只有0到64K,所以,必须用分段寻址才能控制整个内存地

8、址。完整的20位地址可分成两部份:1.段基址(Segment):16位二进制数后面 加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何 一个64K段,通常记做16位二进制数;2偏移量(Offset):直接使用16位二进 制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量), 其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么 是DOS、BIOS功能调用,简单的说,功能调用类似于WIN95API,相当于子程序。 汇编写程序已经够要命了,如果不用MS、IBM的子程序,这日子真是没法过了(关 于功能调用详见电脑爱好者98年11期

9、)。编写汇编语言有两种主要的方法:1使用MASM或TASM等编译器;2使用除 错程序DEBUG.COM。DEBUG其实并不能算是一个编译器,它的主要用途在于除错, 即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而 言,DEBUG更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车, A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译 器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复 杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的 指示性语句,以供编译器识别,使用 DEBUG 可以避免一

10、开始就碰到许多难以理 解的程序行。DEBUG除了能够汇编程序之外,还可用来检查和修改内存位置、载 入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接 触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅, 不可能将所有指令列出)。DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定 要由地址100h (COM文件要求)开始才合法。FOLLOW ME,SETP BY SETP (步步 回车):输入A100 ;从DS: 100开始汇编2输入MOV DL,1 ;将数值01h装入DL寄存器3. 输入 MOV AH,2 ; 将数值 02h

11、 装入 DL 寄存器4输入INT 21 ;调用DOS 21号中断2号功能,用来逐个显示装入DL 的字符5. 输入INT20 ;调用DOS 20号中断,终止程序,将控制权交回给DEBUG6. 请按Enter键7现在已将汇编语言程序放入内存中了,输入G(运行)8.出现结果:输出一个符号。日一输出结果其实不是它,因WORD97无法显示原结果,故找一贋品将就 着。Program terminated normally我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。 你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就 是以机器码来执行程序。1. 输入 U

12、100,1061FED:0100 B201 MOV DL,011FED:0102 B402 MOV AH,021FED:0104 CD21 INT 211FED:0106 CD20 INT 20DEBUG可以用R命令来查看、改变寄存器内容。CS: IP寄存器,保存了将 执行指令地址。1.输入RAX=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当

13、程序由DS: 100开始执行,那么终止程序时,DEBUG会自动将IP内容重 新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对 该程序命名。但一定要为COM文件,否则无法以DEBUG载入。输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106, 故占用7;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。2输入RBX ;查看BX寄存器的内容,本程序只有7个字节,故本步可省 略3. 输入 RCX;查看 CX 寄存器的内容4. 输入 7;程序的字节数5. 输入W ;用可命令将该程序写入(Write)磁盘中修行至此,我们便可以真正接触80

14、86汇编指令了。当我们写汇编语言程序 的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符 号,告诉CPU应执行何种运算。也就是说,助忆符号所构成的汇编语言是为人 设计的,而机器语言是对PC设计的。现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。1. 输入 DEBUG2. 输入 A1003输入 MOV CX,0100 ;装入循环次数MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码MOV AH,02INT 21INC DL ; INC:递增指令,每次将数据寄存器D

15、L内的数值加1 LOOP 0105 ; LOOP:循环指令,每执行一次LOOP,CX值减1,并跳 ;到循环的起始地址105,直到CX为0,循环停止INT 204. 输入G即可显示所有ASCII码当我们想任意显示字符串,女如UNDERSTAND?,则可以使用DOS21H号中断 9H号功能。输入下行程序,存盘并执行看看:1.输入 A100MOV DX,109 ; DS:DX = 字符串的起始地址MOV AH,9 ; DOS的09h功能调用INT 21 ;字符串输出INT 20DB UNDERSTAND? $;定义字符串在汇编语言中,有两种不同的指令:1正规指令:如MOV等,是属于CPU 的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code) 的方式存入内存中;2伪指令:如DB等,是属于DEBUG等编译器的指令,用来 告诉编译器在编译时应做些什么。DB (Define Byte)指令用来告诉DEBUG将单 引号内的所有ASCII码放入内存中。使用9H功能的字符串必须以$结尾。用D 命令可用来查看DB伪指令将那些内容放入内存。6. 输入 D1001975:0100BA0901B409CD21CD-20756E6465727374underst1975:0110616E64248B46F889-45048B463

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号