汇编语言详解

更新时间:2023-05-16 03:48:11 阅读: 评论:0

对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIPWINRAR依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以不经意间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,下文必有分解)
  因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)
  CPU是可以执行电脑所有算术逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电
脑由1981zip是什么意思年推出至今,其CPU发展过程为:8086802868038680486PENTIUM →……,还有AMDCYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如38632EAX)、增多了寄存器(如486FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 88位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CSDSSS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程
序可以在可寻址空间小于64K的情况下被写成任意大小。 piggie所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IPburton(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SPStack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BPBa Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SISource Index):源变址寄存器可用来存放相对于DS段之源变址指针;DIDestination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器gressoFRFlag Register,有九个有意义的标志,将在下文用到时详细说明。
  内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置,叫地址8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS绿光教育的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有064K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment)16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offt):直接使用16
位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553抱负是什么意思。除了上述营养要充分吸收外,你还要知道什么是DOSBIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MSIBM的子程序,这日子真是没法过了(关于功能调用详见《电脑爱好者》9811期)。
  编写汇编语言有两种主要的方法:1.使用MASMTASM等编译器;2.使用除错程序DEBUGDEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,
不可能将所有指令列出)。
  DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100hCOM文件要求)开始才合法。FOLLOW MESETP BY SETP(步步回车):
  输入 A100 DS100开始汇编
  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.出现结果:输出一个符号。
  ㄖ 输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。Program terminated normally
我们可以用U命令将十六进制的机器码反汇编(Unasmble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。
  1.输入 U100,106
  1FED:0100 B201 MOV DL,01
  1FED:0102 B402 MOV AH,02
  1FED:0104 CD21 INT 21
  1FED:0106 CD20 INT 20
  DEBUG可以用R命令来查看、改变寄存器内容。CSIP寄存器,保存了将执行指令地址。
  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
  当程序由DS100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。
  输入N SMILE ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
  ;字节。我们利用BXname存放长度值高位部分,而以CX存放低位部分。
  2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
  3.输入 RCX  ;查看 CX 寄存器的内容
  4.输入 7  ;程序的字节数
  5.输入 W ;用W命令将该程序写入(Write)磁盘中
  修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。
现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。
  1. 输入 DEBUG
  2. 输入 A100
  3.输入 MOV CX,0100 ;装入循环次数
  MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码
  MOV AH,02
  INT 21
  INC DL INC:递增指令,每次将数据寄存器 DL 内的数值加 1
  LOOP 0105 LOOP:循环指令,每执行一次genie in a bottleLOOPCX值减1,并跳stanford公开课
  ;到循环的起始地址105,直到CX0,循环停止
  INT 20
  4.输入 G即可显示所有ASCII
 
  当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看:
  1.输入 A100
  MOV DX,109 DS:DX 字符串的起始地址
  MOV AH,9 DOS09h功能调用
  INT 21 ;字符串输出
  INT 20
  DB 'UNDERSTAND$';定义字符串
  在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(周丽娜英语OP-code)的方式存入内存中;2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。DBDefine Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内存。
  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 56 .E.3.^_.......WV
  1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B S.....2...
  1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89 E.......
  1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E E....V.^_

本文发布于:2023-05-16 03:48:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/110142.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:寄存器   程序   指令   汇编   内存   数据   执行   编译器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图