汇编语言Word文档格式.docx

上传人:b****5 文档编号:15766726 上传时间:2022-11-16 格式:DOCX 页数:69 大小:58.30KB
下载 相关 举报
汇编语言Word文档格式.docx_第1页
第1页 / 共69页
汇编语言Word文档格式.docx_第2页
第2页 / 共69页
汇编语言Word文档格式.docx_第3页
第3页 / 共69页
汇编语言Word文档格式.docx_第4页
第4页 / 共69页
汇编语言Word文档格式.docx_第5页
第5页 / 共69页
点击查看更多>>
下载资源
资源描述

汇编语言Word文档格式.docx

《汇编语言Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言Word文档格式.docx(69页珍藏版)》请在冰豆网上搜索。

汇编语言Word文档格式.docx

但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!

)教程。

大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!

那么――这个接下来呢?

――Herewego!

(阅读时看不懂不要紧,下文必有分解)

  因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:

(关于数的进制问题在此不提)

  CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。

一种汇编语言只能用于特定的CPU。

也就是说,不同的CPU其汇编语言的指令语法亦不相同。

个人电脑由1981年推出至今,其CPU发展过程为:

8086→80286→80386→80486→PENTIUM→……,还有AMD、CYRIX等旁支。

后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。

为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。

本文所提均为8086汇编语言。

寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。

用途:

1.可将寄存器内的数据执行算术及逻辑运算。

2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。

3.可以用来读写数据到电脑的周边设备。

8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:

AH&

AL=AX:

累加寄存器,常用于运算;

BH&

BL=BX:

基址寄存器,常用于地址索引;

CH&

CL=CX:

计数寄存器,常用于计数;

DH&

DL=DX:

数据寄存器,常用于数据传递。

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

CS(CodeSegment):

代码段寄存器;

DS(DataSegment):

数据段寄存器;

SS(StackSegment):

堆栈段寄存器;

ES(ExtraSegment):

附加段寄存器。

当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。

通常是将DS固定,而根据需要修改CS。

所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。

所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。

8086以内存做为战场,用寄存器做为军事基地,以加速工作。

除了前面所提的寄存器外,还有一些特殊功能的寄存器:

IP(IntructionPointer):

指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;

SP(StackPointer):

堆栈指针,与SS配合使用,可指向目前的堆栈位置。

BP(BasePointer):

基址指针寄存器,可用作SS的一个相对基址位置;

SI(SourceIndex):

源变址寄存器可用来存放相对于DS段之源变址指针;

DI(DestinationIndex):

目的变址寄存器,可用来存放相对于ES段之目的变址指针。

还有一个标志寄存器FR(FlagRegister),有九个有意义的标志,将在下文用到时详细说明。

  内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。

内存组织有许多可存放数值的储存位置,叫“地址”。

8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有0到64K,所以,必须用分段寻址才能控制整个内存地址。

完整的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期)。

  编写汇编语言有两种主要的方法:

1.使用MASM或TASM等编译器;

2.使用除错程序DEBUG.COM。

DEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。

不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG更是最佳的入门工具。

因为DEBUG操作容易:

只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用DEBUG可以避免一开始就碰到许多难以理解的程序行。

DEBUG除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。

(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出)。

  DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址100h(COM文件要求)开始才合法。

FOLLOWME,SETPBYSETP(步步回车):

  输入A100;

从DS:

100开始汇编

  2.输入MOVDL,1;

将数值01h装入DL寄存器

  3.输入MOVAH,2;

将数值02h装入DL寄存器

  4.输入INT21;

调用DOS21号中断2号功能,用来逐个显示装入DL的字符

  5.输入INT20;

调用DOS20号中断,终止程序,将控制权交回给DEBUG

  6.请按Enter键

  7.现在已将汇编语言程序放入内存中了,输入G(运行)

  8.出现结果:

输出一个符号。

  ㄖ←输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。

  Programterminatednormally

  我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。

你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。

  1.输入U100,106

  1FED:

0100B201MOVDL,01

0102B402MOVAH,02

0104CD21INT21

0106CD20INT20

  DEBUG可以用R命令来查看、改变寄存器内容。

CS:

IP寄存器,保存了将执行指令地址。

  1.输入R

  AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

  DS=1FEDES=1FEDSS=1FEDCS=1FEDIP=0100NVUPEIPLNZNAPONC

  当程序由DS:

100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。

当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。

但一定要为COM文件,否则无法以DEBUG载入。

  输入NSMILE.COM;

我们得告诉DEBUG程序长度:

程序从100开始到106,故占用7

  ;

字节。

我们利用BX存放长度值高位部分,而以CX存放低位部分。

  2.输入RBX;

查看BX寄存器的内容,本程序只有7个字节,故本步可省略

  3.输入RCX ;

查看CX寄存器的内容

  4.输入7 ;

程序的字节数

  5.输入W;

用W命令将该程序写入(Write)磁盘中

  修行至此,我们便可以真正接触8086汇编指令了。

当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(MnemonicSymbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。

助记符号,告诉CPU应执行何种运算。

也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。

  现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。

  1.输入DEBUG

  2.输入A100

  3.输入MOVCX,0100;

装入循环次数

  MOVDL,00;

装入第一个ASCII码,随后每次循环装入新码

  MOVAH,02

  INT21

  INCDL;

INC:

递增指令,每次将数据寄存器DL内的数值加1

  LOOP0105;

LOOP:

循环指令,每执行一次LOOP,CX值减1,并跳

到循环的起始地址105,直到CX为0,循环停止

  INT20

  4.输入G即可显示所有ASCII码

 

  当我们想任意显示字符串,如:

UNDERSTAND?

,则可以使用DOS21H号中断9H号功能。

输入下行程序,存盘并执行看看:

  1.输入A100

  MOVDX,109;

DS:

DX=字符串的起始地址

  MOVAH,9;

DOS的09h功能调用

  INT21;

字符串输出

  DB'

$'

定义字符串

  在汇编语言中,有两种不同的指令:

1.正规指令:

如MOV等,是属于CPU的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;

2.伪指令:

如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。

DB(DefineByte)指令用来告诉DEBUG将单引号内的所有ASCII码放入内存中。

使用9H功能的字符串必须以$结尾。

用D命令可用来查看DB伪指令将那些内容放入内存。

  6.输入D100

  1975:

0100

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1