aaa13 com

更新时间:2022-12-28 09:26:20 阅读: 评论:0


2022年12月28日发(作者:同桌教育)

汇编语言程序的建立和执行

要建立和运行汇编语言程序、系统盘上应该首先有如下文件:

.(或其它全屏幕编辑软件如,等)编辑程序

.宏汇编程序

(或)普通汇编程序

.链接程序

.调试程序

其中是宏汇编程序,如果使用的是普通汇编程序,则不支持宏汇

编.

下面,以建立和执行用户程序为例来说明上机过程。

1.用EDIT命令建立汇编语言源程序(.ASM文件)

源程序就是用户用汇编语言的语句编写的程序,它不能被机器识别。源程序必须以

ASM为附加文件名。

例如打入命令:

A>(每个命令后面应输入回车,以下均如此)

此时用户可以通过编辑程序的插入命令编写用户的源程序。至于EDIT的

使用方法可以查阅手册。

2.用MASM(或者ASM)命令产生目标文件[.OBJ文件]

源程序建立以后,就可以用宏汇编程序(或者普通汇编程序)进

行汇编。所谓汇编,实际上就是把以ASM为附加名的源文件转换成用二进制代码表

示表示的目标文件,目标文件以OBJ为附加名。汇编过程中,汇编程序对源文件进

行两次扫描,如果源程序中有语法错误,则汇编过程结束后,汇编程序会指出源程序

中的错误,这时,用户可以再用编辑程序来修改源程序中的错误,最后,得到没有

语法错误的OBJ文件。

例如,对的汇编过程如下:

A>

此时,汇编程序给出如下回答:

Microsoft(R)MacroAsmblerVersion5.00

CopYright(C)MicrosoftCorpl981一1985,1987.Allrightsrerved。

Objectfilename[]:

Sourcelisting[]:

Cross-reference[]:

51526十402346Bytessymbolspacefree

0WarningErrors

0SevereErrOrs

从上面的操作过程中可以看到,汇编程序的输入文件就是用户编写的汇编语言

源程序,它必须以ASM为文件扩展名。汇编程序的输出文件有三个,第一个是目标

文件,它以OBJ为扩展名,产生OBJ文件是我们进行汇编操作的主要目的,所以这

个文件是一定要产生,也一定会产生的,操作时,这一步只要打人回车就行了;第

二个是列表文件,它以LST为扩展名,列表文件同时给出源程序和机器语言程序,

从而,可以使调试变得方便,列表文件是可有可无的,如果不需要,则在屏幕上出

现提示信息[]:时打入回车即可,如果需要,则打入文件名后回车;第三

个是交叉符号表,此表给出了用户定义的所有符号,对每个符号都列出了将其定义

的所在行号和引用的行号,并在定义行号上加上“#”号,同列表文件一样,交叉

符号表也是为了便于调试而设置的,对于一些规模较大的程序,交叉符号表为调试

工作带来很大方便。当然,交叉符号表也是可有可无的,如果不需要,那么,在屏

幕上出现提示信息[]:时,打入回车即可。

汇编过程结束时,会给出源程序中的警告性错误[WarningErrors]和严重错

误[ServersErrors],前者指一般性错误,后者指语法性错误,当存在这两类错

误时,屏幕上除指出错误个数外,还给出错误信息代号,程序员可以通过查找手册

弄清错误的性质。

如果汇编过程中,发现有错误,则程序员应该重新用编辑命令修改错误,再进

行汇编,最终直到汇编正确通过。要指出的是在汇编过程中只能指出源程序中的语

法错误,并不能指出算法错误和其他错误。

3.用LINK命令产生可执行文件(EXE文件)

汇编过程根据源程序产生出二进制的目标文件(OBJ文件),但OBJ文件用的是

浮动地址,它不能直接上机执行。所以还必须使用链接程序(LINK)将OBJ文件转

转换成可执行的EXE文件。LINK命令还可以将某一个目标文件和其它多个模块(这

些模块可以是由用户编写的,也可以是某个程序库中存在的)链接起来。

具体操作如下(以对进行链接为例):

A>LINKABC

此时,在屏幕上见到如下回答信息:

IBMPersonalComputerlink

Version2.00(C)CopyrightIBMCorpl981,1982,1983

RunFile[]:

ListFile[]:

Libraries[.LIB]:

Warnhg:NOSTACKSegment

L1NK命令有一个输入文件,即由汇编程序产生的OBJ文件,有时,用户程序

用到库函数,此时,对于提示信息Libraries[.LIB],要输入库名。

L1NK过程产生两个输出文件,一个是扩展名为EXE的执行文件,产生此文件

件当然是L1NK过程的主要目的,另一个是扩展名为MAP的列表分配文件,有人也称

它为映象文件。它给出每个段在内存中的分配情况。比如某一个列表分配文件为如下

内容:

Warning:NoStackSegmcnt

StartStopLengthNameClass

0000H0015H0016HCODE

0020H0045H0026HDATA

0050H0061H0012HEXTRA

originGroup

ProgramentryPointat0000:0000

MAP文件也是可有可无的。

从L1NK过程的提示信息中,可看到最后给出了一个“无堆栈段”的警告性错误

,这并不影响程序的执行。当然,如果源程序中设置了堆栈段,则无此提示信息。

4.程序的执行

有了.EXE文件后,就可以执行程序了,此时,只要打入文件名即可。仍以ABC

为例:

A>ABC(回车)

A>

实际上,大部分程序必须经过调试阶段才能纠正程序设计中的错误,从而得到正

确的结果。所谓调试阶段,就是用调试程序(DEBUG程序)发现错误,再经过编辑、

汇编、链接纠正错误。关于DEBUG程序中的各种命令,可参阅DOS手册,本实验指

导书后面附有一些常用命令,下面给出最常用的几个命令。

先进入DEBUG程序并装入要调试的程序,操作命令如下:

A>;进入DEBUG,并装配

此时,屏幕上出现一个短划线,表明以进入DEBUG状态。为了察看程序运行情

况,便于调试,常常要分段运行程序,为此,要设立“断点”,即让程序运行到某处

自动停下,并把所有寄存器的内容显示出来。为了确定我们所要设定的断点地址常

常用到反汇编命令,反汇编命令格式如下:

一U;从当前地址开始反汇编

也可以从某个地址处开始反汇编,如下所示。

一U200;从CS:200处开始反汇编

程序员心中确定了断点地址后,就可以用G命令来设置断点。比如,想把断点

设置在0120H处,则如下打入命令:

一G120

此时,程序在0120H处停下,并显示出所有寄存器以及各标志位的当前值,在

最后一行还给出将要执行的指令的地址、机器语言和汇编语言,程序员可以从显示

的寄存器的内容来了解程序运行是否正确。

对于某些程序段,单从寄存器的内容看不到程序运行的结果,而需要观察数据

段的内容,此时可用D命令,使用格式如下:

一dDS:0000

从数据段的0单元开始显示128个字节

在有些情况下,为了确定错误到底由哪条指令的执行所引起,要用到跟踪命令。跟

踪命令也叫单步执行命令,此命令使程序每执行一条指令,便给出所有寄存器的内

容,并处于等待状态。

比如:

一T3

从当前地址往下执行三条指令

此命令使得从当前地址往下执行三条指令,每执行一条,便给出各寄存器内容。

最后,给出下一条要执行的指令的地址、机器语言和汇编语言.

从DEBUG退出时,使用如下命令:

一Q;

每一个有经验的程序员都必定熟练掌握调试程序的各主要命令。为此,初学者

可通过软件实验部分的实验一来掌握DEBUG的一些基本操作并花一些功夫查阅、掌

握DOS手册中有关DEBUG程序的说明。

建立和运行汇编源程序的基本步骤见下图:

利用汇编语言

编制汇编语言源程序

使用编辑软件上机

编辑汇编语言源程序

使用汇编程序对源程序进行

汇编使之生成浮动目标码程序

使用LINK连接程序使浮动

目标码程序变成可执行程序

利用DEBUG调试程序对

可执行的程序进行调试

运行

编程过程

汇编过程

调试运行过程

软件实验部分

实验一DEBUG软件的使用

是专为8086/8088汇编语言设计的一种调试工具,是汇编语言程序设计者必

须掌握的工具。具有显示、修改、动态跟踪等功能。使用它可以对*.COM、*.EXE文件

进行动态跟踪。

DEBUG可以显示和修改内存与寄存器内容,以便在调试中检查程序,查找与改错;亦支

持小汇编,直接对小段程序进行汇编;也可对磁盘进行读写。DEBUG部分指令请见本书附

录。

一、实验目的

1.通过实验掌握DEBUG软件的基本使用方法。

2.进一步熟悉、理解8088/8086的寻址方式。

3.掌握数据传送、算术运算、逻辑运算等类指令的基本操作。

二、实验内容与步骤

本实验进行前必须保证系统盘上有文件。

进入DEBUG只需在DOS环境下执行DEBUG命令,即键入DEBUG回车后,屏幕上显示

DEBUG提示符:“_”(短划线)。操作如下:

A:>DEBUG

-

注:字符下有下划线的为键入的内容,\代表回车,后面内容均如此.

1.程序输入汇编命令(A命令)

在输入程序应注意以下几点:

(1)输入的数字必须是十六进制数,并且不输入H。

(2)分号后面的内容(注释)不要输入。

(3)不输入标号,条件转移指令中的标号用偏移地址代替。

方法:先用一个离本转移指令的IP不远的但不一定准确的偏移地址代替标号

,待程序输入且完成反汇编后获得标号所在处的准确的偏移地址时再

修改。

在DEBUG提示符下键入A即进入汇编输入状态

-A

键入下面的汇编程序

13F2:0100MOVAX,2000

13F2:0103MOVDS,AX

13F2:0105MOVSS,AX

13F2:0107MOVBX,2050

13F2:010AMOVSI,BX

13F2:010CMOVDI,3050

13F2:010FMOVSI,DI

13F2:0111MOVSP,5FFF

13F2:0114MOVCL,19

13F2:0116MOVBL,CL

13F2:0118MOVAH,F0

13F2:011AMOVCH,AH

13F2:011CMOVBYTEPTR[DI],40

13F2:011FMOVWORDPTR[SI],0100

13F2:0123MOVDL,[SI+01]

13F2:0126MOVDH,[SI+01]

13F2:0129MOVAL,[SI+01]

13F2:012CMOVWORDPTR[BX+SI],0022

13F2:0130MOV[BX+SI+02],BX

13F2:0133MOV[BX+SI+02],BX

13F2:0136MOVBP,[BX+DI+02]

13F2:0139MOV[BX+DI],BX

13F2:013BMOVAX,[BP+DI]

13F2:013DMOVBL,AL

13F2:013FMOVES,BX

13F2:0141PUSHBX

13F2:0142PUSHDI

13F2:0143PUSHDI

13F2:0144POPCX

13F2:0145POPDX

13F2:0146XCHGBP,AX

13F2:0147XCHGDH,BL

13F2:0149SCHF

13F2:014ACMC

13F2:014BLAHF

13F2:014CSTD

13F2:014DCLI

13F2:014EPUSHF

13F2:014FCLD

13F2:0150POPF

13F2:0151INT21

13F2:0153^C

重新回到DEBUG提示符“-”状态,表示汇编命令已结束。

2.反汇编命令(U命令)

-U01000153

则屏幕显示如下信息:

13F2:0100B80200MOVAX,2000

13F2:01038ED8MOVDS,AX

13F2:01058ED0MOVSS,AX

13F2:0107BB5052MOVBX,2050

13F2:010A89DEMOVSI,BX

13F2:010CBF5053MOVDI,3050

13F2:010FB119MOVSI,DI

.

.

.

.

13F2:014E9CPUSHF

13F2:014FFCCLD

13F2:01509DPOPF

13F2:0151CD21INT21

3.写文件于磁盘中

在程序键入后,应及时存盘,以免发生错误操作时,丢失程序。写文件前先用N命

令给文件命名。若文件名定为,则具体操作如下:

-

定义好名称后,再在CX中存放文件长度即字节数:

文件长度=终止地址一起始地址+1

具体操作如下:

-RCX;利用R命令显示CX寄存器当前内容

CX0000;屏幕显示CX的现存内容

:0153\;输入文件长度

-W\;利用W命令将文件写入

Writing0153bytes;写入完成

若文件长度>65536则用BX、CX存放长度。返回DO5后用DIR命令可以见到

LXA.COM文件已经存在,文件长度339字节。

4.程序跟踪调试

在状态下主要是可以对程序进行调试,调试前可先装入已存好的程序。

注意:在DEBUG环境下不要执行INT20H。

对已存在的COM文件(或EXE文件)可以这样装人文件:键人

A:>DEBUGELXA.COM\

又出现提示符“-”。此时可以用R命令查看DEBUG对文件(或.EXE文件)的

段寄存器、IP及F寄存器的初始化值。

-R\

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

DS=13F2ES=13F2SS=13F2CS=13F2IP=0100NVUPDIPLNZNAPONC

13F2:0100B80020MOVAX,2000

可以用T命令来进行单步和多步指令的运行,运行指令后将显示各寄存器内容和下一条将

要执行的指令:

T=100\;从CS:0100H开始单步执行,显示寄存器值

AX=2000BX=0000CX=0153DX=0000SP=FFFEBP=0000SI=0000DI=0000

DS=13F2ES=13F2SS=13F2CS=13F2IP=0103NVUPDIPLNZNAPONC

13F2:01038ED8MOVDS,AX

-T\;从当前IP开始执行一条指令

AX=2000BX=0000CX=0153DX=0000SP=FFFEBP=0000SI=0000DI=0000

DS=2000ES=13F2SS=13F2CS=13F2IP=0105NVUPDIPLNZNAPONC

13F2:01058ED0MOVSS,AX

-T4\;用Tn命令来跟踪几条指令,n为需跟踪的指令条数。

Ax=2000BX=2050CX=0153DX=0000SP=FFFEBP=0000SI=3050DI=3050

DS=2000ES=13F2SS=2000CS=13F2IP=0111NVUPDIPLNZNAPONC

13F2:0111BCFF5FMOVSP,5FFF

Ax=2000BX=2050CX=0153DX=0000SP=5FFEBP=0000SI=3050DI=3050

DS=2000ES=13F2SS=2000CS=13F2IP=0114NVUPDIPLNZNAPONC

13F2:0114B119MOVCL,19

Ax=2000BX=2050CX=0119DX=0000SP=5FFEBP=0000SI=3050DI=3050

DS=2000ES=13F2SS=2000CS=13F2IP=0116NVUPDIPLNZNAPONC

13F2:011688CBMOVBL,CL

Ax=2000BX=2019CX=0119DX=0000SP=5FFEBP=0000SI=3050DI=3050

DS=2000ES=13F2SS=2000CS=13F2IP=0118NVUPDIPLNZNAPONC

13F2:0118B4F0MOVAH,F0

用G命令执行指定区域中的指令

-g=0100013f;从IP=0100H开始执行到113FH,并显示寄存器的内容

AX=2019BX=2019CX=0119DX=0101SP=SFFFBP=2019SI=3050DI=3050

DS=2000ES=13FZSS=2000CS=13FZIP=013FNVUPDIPLNZNAPONC

13F2:013F8EC3MOVES,BX

用D命令可查看指定存储单元后的128个存储单元的内容。如若需查看数据段3050

存储单元的内容,可用下面的命令。丛中可看出3050H单元的内容为00H。

-dds:3050

2000:36000000-B4000000D3000000........4...S...

2000:3060FZ00-2F0100004D010000r......./...M...

2000:30706CZDOD-SD000000SD0000001....-.]...].-.

2000:3ZD00OD00-5D000000SD000000...-...]...]...

2000:300000000000.'...-.-.-.---..

2000:30A0ZE00-0000...-............

2000:30B000000000.......--...-...

2000:30C000000000......-.-..-....

5.程序调试练习

修改并调试以下程序,使之完成向以30000H开始的内存单元中存入31个先自然递增然

后又自然递减的数据(00H~0FH~00H)的功能。程序从CS:0100H开始存放。调试完成后程

序命名为LXB.COM并存盘。

程序如下:

;LXB

MOVAX,3000

MOVDS,AX

MOVSI,0

MOVCL,OFH

XORAX,AX

L1:MOV[SI],AL

INCSI

DECCL

JNZL1

MOVCX,10H

L2:MOV[SI],AL

INCSI

DECAL

LOOPL2

INT20

步骤如下:

1.用汇编A命令输入程序。

2.用反汇编U命令显示程序及目标码。

-U0100\

13F2:0100B80030MOVAX,3000

13F2:0103SED8MOVDS,AX

13F2:0105BE0000MOVSI,0000

13F2:0108B10FMOVCL,OF

13F2:010A31C0XORAX,AX

13F2:010C8804MOV[SI],AL

13F2:010EFECOINCAL

13F2:0110FEC9DECCL

13F2:011275F8JNZ010C

13F2:0114B91000MOVCX,0010

13F2:01178804MOV[SI],AL

13F2:011946INCSI

13F2:0llAFEC8DECAL

13F2:0llCE2F9LOOP0117

13F2:0llECD20INT20

-g=01000lle

AX=00FFBX=0000CX=0000DX=0000SP=FFFEBP=0000SI=0010DI=0000

DS=3000ES=13F2SS=13F2CS=13F2IP=0llENVUPDINGNZACPENC

13F2:0llECD20INT20

3.用W命令将文件存入磁盘,文件名定为

4.用G命令运行程序到INT20H(注意:不执行INT20H命令)

5.用D查看数据段中0000H处数据,检查是否将数据按要求存入该区域

-dds:0000

3000:0000OFOEODOCOBOA03020100-.............-.

3000:000000000000......----...-.-

3000:000000000000......-....-....

3000:000000000000....-.-....-....

3000:000000000000...'....-'...---

3000:000000000000..-....--.......

3000:000000000000.........-......

3000:000000000000-....--.-...-.-.

检查内存可发现数据只有从0FH到00H,说明程序存在一定的问题

6.用T命令单步执行程序(执行到INT20H)并检查问题所在

可看出在程序中少了一条INCSI指令,在适当的位置加入该指令

7.修改程序

用块移动指令M将010EH以后的程序下移两个字节后插入INCSI指令

-m010e011f0110

-a010e

13F2:010EINCSI

13F2:010FNOP

13F2:0110^C

用反汇编命令检查程序,特别注意转移指令中偏移地址是否有变化,若有可用反汇编A命令进

行修改后再反汇编。反汇编后程序如下:

13F2:0100B80030MOVAX,3000

13F2:01038ED8MOVDS,AX

13F2:0105BE0000MOVSI,0000

13F2:0108B10FMOVCL,OF

13F2:010A31C0XORAX,AX

13F2:010C8804MOV[SI],AL

13F2:010E46INCSI

13F2:010F90NOP

13F2:0110FECOINCAL

13F2:0112FEC9DECCL

13F2:011475F6JNZ010C

13F2:0116B91000MOVCX,0010

13F2:01198804MOV[SI],AL

13F2:0llB46INCSI

13F2:0llCFEC8DECAL

13F2:0llEE2F9LOOP0119

检查程序正确后,可用G命令执行并再次在数据区检查运行结果。

-g=01000120

AX=00FFBX=0000CX=0000DX=0000SP=FFFEBP=0000SI=00IFDI=0000

DS=3000ES=13F2SS=13F2CS=13F2IP=0120NVUPDINGNZACPENC

13F2:0120CD20INT20

-dds:0

3000:000000OEODOCOBOA030201OF-.--.....-..-...

3000:0010OEODOCOBOA0902010000...---..-..-....

3000:000000000000....-......-....

3000:000000000000.....'..........

3000:000000000000......-......-..

3000:000000000000.........-...-..

3000:000000000000.............`..

3000:000000000000..`.....-....--.

00H~0FH~00H这31个数已填人以30000H开始的内存区域。将修改好的程序命名为LXB.

COM,写入磁盘。

三、思考题

在DEBUG环境下显示的程序和数字是什么形式?标号又是什么形式?

通过本次实验你学会了那些DEBUG命令。

实验二:汇编语言程序的建立和执行

一.实验目的:

1.熟悉部分伪指令及汇编运算符,掌握汇编源程序的编写方法。

2.进一步掌握汇编源程序的编辑、连接、调试及运行的全过程。

二.实验内容及步骤:

建立和运行汇编语言程序,系统盘上应具有如下文件:

具体步骤及说明请见前面。

(一).熟悉伪指令及汇编运算符的检查性编辑练习

将结果添入后,上机检验结果是否正确。

DATASEGMENTPARA'DATA'

QAEQU255;QA=

QA1=QAGT3000;QA1=

QA2=0FFFH;QA2=

QA3=EQUQA2-255;QA3=

QA4=88MOD5;QA4=

QA5=88HSHR2;QA5=

QA6=QA3/16+15;QA6=

ORG1060H

G1DB32,QA,98/2,NOT25;DS:1060H

G2DWOFF6H,OFFSETG2;DS:1064H

G3Dw3DUP(5);DS:1068H

G4DWSEGG1;DS:106EH

SAEQULENGTHG3;SA=

SBEQUSIZEG3;SB=

SC=TYPEG3;SC=

ORG1200H

F1=THISWORD;OFFSETF1=,TYPEF1=

F2DB11H,22H,33H,44H;1200H:

F3DD12345H;1204H:

DATAENDS

STACKSEGNENTSTACK'STACK';

DB100DUP(?)

STACKENDS;SP=

CODESEGMENTWORD'CODE'

AASSUMECS:CODE,DS:DATA

STARPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX;DS=

MOVAL,BYTEPTRG2;AL=

MOVBL,TYPEFF;BL=

MOVAX,WORDPTRFF;AX=

ANDAX,OFFH;AX=

MOVBX,WORDPTRG1;BX=

MOVBX,255ANDOFH;BX=

MOVCL,LOWQA4;CL=

MOVAL,LOWQA1;AL=

MOVBL,HIGHQA5;BL=

MOVDL,TYPESTAR;DL=

ADDAX,OFFSETF2;AX=

MOVBX,F1;BX=

RET

STARENDP

CODEENDS

ENDSTAR

上机运行该程序,运行步骤如下:(详细说明见汇编源程序的建立和执行)

1.编辑上面的汇编程序:

A:>

Microsoft(R)MacroAsmblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,htsrerved.

Objectfilename[]:

Sourcelisting[]:

Cross-reference[]:

51518+402370Bytessymbolspacefree

0WarningErrors

0SevereErrors

A:>linklx2a

IBMPersonalComputerLinker

Version2.00(C)CopyrightIBMCorp1981,1982,1983

RunFile[]:

LiStFile[]:IX2a

Libraries[.LIB]:

A:>

StartStopLengthNameClass

00000H01207H1208HDATADATA

01210H01273H0064HSTACKSTACK

01274H0129EH002BHCODECORD

OriginGroup

Programentrypointat0127:0004

A:>

-r

AX=0000BX=0000CX=1300DX=0000SP=0064BP=0000SI=0000DI=0000

DS=13FIES=13FISS=1522CS=1528IP=0004NVUPDIPLNZNAPONC

1528:00041EPUSHDS

-u42e

1528:00041EPUSHDS

1528:000533C0XORAX,AX

1528:000750PUSHAX

1528:0008B80114MOVAX,1401

1528:000B8ED8MOVDS,AX

1528:000DA06410MOVAL,[1064]

1528:0010B304MOVBL,04

1528:0012A10412MOVAX,[1204]

1528:001525FF00ANDAX,00FF

1528:00188BIE6010MOVBX,[1060]

1528:001CBBOF00MOVBX,000F

1528:001FB103MOVCL,03

1528:0021B000MOVAL,00

1528:0023B300MOVBL,00

1528:0025B2FEMOVDL,FE

1528:ADDAX,1200

1528:002A8BIE0012MOVBX,[1200]

1528:002ECBRETF

-gOd

AX=1401BX=0000CX=1300DX=0000SP=0060BP=0000SI=0000DI=0000

DS=1401ES=13FISS=1522CS=1528IP=000DNVUPDIPLZRNAPENC

1528:000DA06410MOVAL,[1064]DS:1064=F6

-Dds:1060

1401:.d.........

1401:0---.------..--

1401:0.---.-.----...--

1401:0.---.-.----...--

1401:10A000000000.---.-.----...--

1401:10B000000000.---.-.----...--

1401:10C000000000.---.-.----...--

1401:10D000000000.---.-.----...--

-Dds:1200

1401:0.``3DE#..........

1401:0.---.-.----...--

1401:0.---.-.----...--

1401:0.---.-.----...--

1401:0.---.-.----...--

1401:0.---.-.----...--

1401:12600000-0000OD002815EO10............(.`.

1401:12700000F1131E33CO50-B801148ED8AO6410..q..38PS...Xd.

-t

AX=14F6BX=0000CX=1300DX=0000SP=0060BP=0000SI=0000DI=0000

DS=1401ES=13FISS=1522CS=1528IP=0010NVUPDIPLZRNAPENC

1528:0010B304MOVBL,04

-t

AX=14F6BX=0004CX=1300DX=0000SP=0060BP=0000SI=0O00DI=0000

DS=1401ES=13FISS=1522CS=1528IP=0012NVUPDIPLZRNAPENC

1528:0012A10412MOVAX,[1204]DS:1204=2345

-t

AX=2345BX=0004CX=1300DX=0000SP=0060BP=0000SI=0000DI=0000

DS=1401ES=13FISS=1522CS=1528IP=0015NVUPDIPIZRNAPENC

1528:001525FF00ANDAX,00FF

-t

(二)正负数分流程序设计

设首址为BUFFER的内存缓冲区中存有32个数,试将数据块中的正数(包括0)存至起

始地址为PLUS的缓冲区,负数存至起始地址为MINUS的缓冲区中。初步编写的程序如下,先

进行调试。首先编辑ASM文件。

DATASEGMENT

BUFFERDBF5H,46H,78H,4F,0BCH,0DAH,0ABH,02H

DB12H,56H,0D5H,0ACH,34H,89H,45H,0C3H

DB00,14H,45H,58H,64H,0D3H,0C3H,OA5H

DB0B3H,0FFH,0D9H,64H,0D3H,90H,80H,7FH

COUNTEQU$-BUFFER

PLUSDBCOUNTDUP(?)

MINUSDBCOUNTDUP(?)

DATAENDS

STACKSEGMENTSTACK'STACK'

DB100DUP(?)

CODESEGMENTPARA'CODE'

ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA

STARTPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVES,AX

MOVXI,OFFSETBUFFER

LEADI,PLUD

LEABX,MINUD

MOVCX,COUNT

CLD

L1:LODSB

TESTAL,80H

JNZL2

STOSB

L2:XCHGBX,DI

STOSB

XCHGBX,DI

AGAIN:LOOPL1

RET

STARTENDP

CODEENDS

EMDSTART

A:>

Microsoft(R)MacroAsmblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,htsrerved.

Objectfilename[]:

Sourcelisting[]:LXZC

Cross-reference[]:

Endoffileencounteredoninputfile

(38):warningA4085:Endoffile,noENDdirective

Opengments:STACK

(2):errorA2009:Synbolnotdefined:F5H

(21):errorA2009:Symbolnotdefined:XI

(22):errorA2009:Symbolnotdefined:PLUD

(23):errorA2009:Synbolnotdefined:MINUD

(37):errorA2105:Expected:instructionordirective

Endoffileencounteredoninputfile

(38):warningA4085:Endoffile,noENDdirective

Opengments:STACK

51048+402840Bytessymbolspacefree

1WarningErrors

7SevereErrors

由于在连接过程中生成了.LST文件,所以可利用其进行检查.

A:>

Microsoft(R)MacroAsmblerVersion5.00

Page1-1

0000DATASEGMENT

EBCDAABBUFFERDBF5H,46H,78H,4F,OBCH,ODAH,OABH,02H

(2):errorA2009:Symbolnotdefined:F5H

02

00081256D5AC348945DB12H,56H,0D5H,0ACH,34H,89H,45H,0C

C3

64D3C3DB00,14H,45H,58H,64H,0D3H,0C3H,0A5

A5

0018B3FFD964D39080DB0B3H,0FFH,0D9H,64H,0D3H,90H,80H,7F

H

7F

=0020COUNTEQU$-BUFFER

00200020[PLUSDBCOUNTDUP(?)

??

]

00400020[MINUSDBCOUNTDUP(?)

??

]

0060DATAENDS

0000STACKSEGMENTSTACK'STACK'

00000064[DB100DUP(?)

??

]

0000CODESEGMENTPARA'CODE'

ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA

0000STARTPROCFAR

00001EPUSHDS

000133COXORAX,AX

000350PUSHAX

0004B8----RMOVAX,DATA

00078ED8MOVDS,AX

00098ECOMOVES,AX

000BC7060000U0000RMOVXI,OFFSETBUFFER

(21):errorA2009:Symbolnotdefined:XI

00ll8D3E0000ULEADI,PLUD

(22):errorA2009:SYmbolnotdefined:PLUD

00158D1E0000ULEABX,MINUD

(23):errorA2009:Symbolnotdefined:MINUD

0019B90020MOVCX,COUNT

001CFCCLD

001DACL1:LODSB

001EA880TESTAL,80H

00207501JNZL2

0022AASTOSB

002387DFL2:XCHGBX,DI

0025AASTOSB

002687DFXCHGBX,DI

0028E2F3AGAIN:LOOPL1

002ACBRET

002BSTARTENDP

002BCODEENDS

Microsoft(R)MacroAsmblerVersion5.00

Page1-2

EMDSTART

(37):errorA2105:Expected:instructionordirective

(38):warningA4085:Endoffile,noENDdirective

Opengments:

STACK.............

Microsoft(R)MacroAsmblerVersion5.00

Symbols-1

SegmentsandGroups:

NameLengthAlignCombineClass

CODE..............002BPARANONE'CODE'

DATA..............0060PARANONE

STACK.............0064PARASTACK'STACK'

Symbols:

NameTypeValueAttr

AGAIN.............LNEAR0028CODE

BUFFER.............LBYTE0000DATA

COUNT.............NUMBER0020

L1...............LNEAR001DCODE

L2...............LNEAR0023CODE

MINUS.............LBYTE0040DATALength=0020

PLUS..............LBYTE0020DATALength=0020

START.............FPROC0000CODELength=002B

@FILENANE...........TEXTLX2C

37SourceLines

38TotalLines

13Symbols

51048+402840Bytessymbolspacefree

1WarningErrors

7SevereErrors

根据文件中指出的出错位置及相应的信息提示,可以很快查找出语法错误。在回

到编辑状态下,将错误修改后再次汇编,直至无语法错误。

没有语法错误的程序不一定能得到最终的正确结果,还要在DEBUG状态下调试运行,进一

步检查是否有算法及逻辑错误。

A:>

AX=0000BX=0000CX=0100DX=0000SP=0064BP=0000SI=0000DI=0000

DS=13F1ES=13F1SS=1407CS=140EIP=0000NVUPDIPLNZNAPONC

14OE:00001EPUSHDS

-U027

14OE:00001EPUSHDS

14OE:000133C0XORAX,AX

14OE:000350PUSHAX

14OE:0004B80114MOVAX,1401

14OE:00078ED8MOVDS,AX

14OE:00098ECOMOVES,AX

14OE:000BBE0000MOVSI,0000

14OE:000E8D3E2000LEADI,[0020]

14OE:00128D1E4000LEABX,[0040]

14OE:0016B92000MOVCX,0020

14OE:0019FCCLD

14OE:001AACLODSB

14OE:001BA880TESTAL,80

14OE:00lD7501JNZ0020

14OE:001FAASTOSB

14OE:002087DFXCHGDI,BX

14OE:0022AASTOSB

14OE:002387DFXCHGDI,BX

14OE:0025E2F3LOOP001A

14OE:0027CBRETF

-G27

AX=147FBX=0060CX=0000DX=0000SP=0060BP=0000SI=0020DI=002F

DS=1401ES=1401SS=1407CS=140EIP=0027NVUPDIPLZRNAPENC

14OE:0027CBRETF

-Dds:0

1401:0000F546784FBCDAAB02-1256DSAC348945C3uFxO4Z+..VU,

1401:64D3C3AS-B3FFD964D390807F..EXdSC%...

1401:002046784F-7F00FXO..V4E..EXdd..

1401:000000000000.........--..-.

1401:0040F546784FBCDAAB02-1256D5AC348945C3uFxO

1401:64D3C3A5-B3FFD964D390807F..EXdSC%..-

1401:000000000000....--.....-....

1401:000000000000....-.---.......

通过检查内存结果,可以发现程序显然没有按要求完成正负数分流任务。回到编辑状态,

检查源程序,可看出程序中少了一条跳转指令。修改源程序后,经汇编连接,进入调试状态

调试。

-UO2A

14OE:00001EPUSHDS

14OE:000133C0XORAX,AX

14OE:000350PUSHAX

140E:0004B80114MOVAX,1401

14OE:00078ED8MOVDS,AX

14OE:00098ECOMOVES,AX

14OE:000BBE0000MOVSI,0000

14OE:000E8D3E2000LEADI,[0020]

14OE:00128D1E4000LEABX,[0040]

14OE:0016B92000MOVCX,0020

14OE:0019FCCLD

14OE:001AACLODSB

14OE:001BA880TESTAL,80

14OE:001D7504JNZ0023

14OE:001FAASTOSB

14OE:0020EB06JMP0028

14OE:002290NOP

14OE:002387DFXCHGDI,BX

14OE:0025AASTOSB

140E:002687DFXCHGDI,BX

14OE:0028E2FOLOOP001A

14OE:002ACBRETF

-G2A

AX=147FBX=0051CX=0000DX=0000SP=0060BP=0000SI=0020DI=002F

DS=1401ES=1401SS=1407CS=140EIP=002ANVUPDIPLZRNAPENC

140E:002ACBRETF

-DDS:0

1401:0000F546784FBCDAAB02-1256D5AC348945C3uFXO

1401:64D3C3AS-B3FFD964D390807F..EXdSC%...

1401:002046784F-7F00FXO..V4E..EXdd..

1401:000000000000-.--..........--

1401:0040F5BCDAABD5AC89C3-D3C3A5B3FFD9D390u

1401:000000000000--.-...---..'...

1401:000000000000-....--.---...

1401:000000000000--.........-....

可看出运行结果正确。经调试后的正确程序如下:

DATASEGMENT

BUFFERDBOF5H,46H,78H,4FH,OBCH,ODAH,OABH,02H

DB12H,56H,OD5H,OACH,34H,89H,45H,OC3H

DB00H,14H,45H,58H,64H,OD3H,OC3H,OA5H

DBOB3H,OFFH,OD9H,64H,OD3H,90H,80H,7FH

COUNTEQU$-BUFFER

PLUSDBCOUNTDUP(?)

MINUSDBCOUNTDUP(?)

DATAENDS

STACKSEGMENTSTACK'STACK'

DB100DUP(?)

STACKENDS

CODESEGMENTPARA'CODE'

ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA

STARTPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DATA

MOVDS,AX

MOVES,AX

MOVSI,OFFSETBUFFER

LEADI,PLUS

LEABX,MINUS

MOVCX,COUNT

CLD

L1:LODSB

TESTAL,80H

JNZL2

STOSB

JMPAGAIN

L2:XCHGBX,DI

STOSB

XCHGBX,DI

AGAIN:LOOPL1

RET

STARTENDP

CODEENDS

ENDSTART

三.思考题

1.用DEBUG软件调试程序(.EXE文件形式),不执行任何命令,可以用D命令(-DDS:0)

查看数据段的原始数据吗?为什么?

2.汇编语言源程序通过了汇编和连接,是否就真确无误了?为什么?

3.汇编语言源程序经过了汇编和连接后产生的是那一种可执行文件?这种文件中IP

的初始值一般是多少?

四.实验报告

1.回答思考题

2.填写程序中的空白部分

实验三两个多位十进制数相加

一.实验目的:

1.学习并掌握数据传送指令和算术逻辑指令的用法。

2.进一步熟悉在PC机上建立、汇编、链接、调试和运行8086汇编语言源程序。

二.实验内容:

将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放

在以DATA1和DATA2为首的五个内存单元中(低为在前),结果送回DATA1处。

三.编程提示:

1.因加数和被加数均以ASCII码形式存放,所以在加之前必须转化为BCD码,

可用不压缩的BCD码进行相加。注意:相加后需要进行AAA调整。

2.显示数据可用DOS功能调用。

3.程序流程图如下:

四.思考题:

如果是减法,程序应如何修改?如果加数和被加数均以压缩的BCD码形式存放在以

DATA1、DATA2为首址的内存缓冲区中,程序应如何修改?

实验四两个数相乘的实验

一、实验目的

掌握乘法指令和循环指令的用法

二、实验内容

实现十进制数的乘法。被乘数和乘数均以ASCII码的形式存放在内存中,乘积在

屏幕上显示出来。

三、编程提示

1.十进制数的乘法,在乘法指令后必须进行AAM调整。多位十进制数乘一位,

必须把每一位乘法运算的积加至结果单元,十进制数相加还必须进行AAA

调整。下面以两位数乘一位数说明其运算过程。

DATA1DB38H,35H

DATA2DB39H

RESULTDB3DUP(0)

先乘个位。08H*09H后,AX=0048H;经AAM调整后AX=0702H。这个部

分积加至乘积单元,因此RESULT单元内容为:02H,07,00H。

再乘十位。05H*09H后,AX=002DH;经AAM调整后AX=0405H。AX这

个部分积应加至乘积单元的十位:

05H+07H,AL中得到0CH,经AAA指令调整,AL加6并将高四位清零

变成02H,AH则加1变成05H,于是AX=0502H。低字节02H应放入结果的十

位,高字节05H应送到百位。于是乘积单元为02H,02H,05H,即58*9=522,

得到正确的十进制积。

2.程序流程如下图:

四、思考题

如果多位十进制数(未组合BCD)与多位十进制数相乘,用什么方法计算简单?

硬件实验部分

实验一8255A控制交通信号灯实验

一、实验目的

熟练掌握通过对8255A可编程并行接口传输数据的编程方法,以实现对

红、绿、黄LED发光二极管的控制。

二、实验内容

编写程序控制8255A可编程并行接口芯片B端口和C端口,使其控制实验台上的红、

绿、黄12只发光二极管按照十字路口交通信号灯的亮灭规律发光。当按下任意键则停止运

行,返回DOS。

三、实验步骤

1.按下图连接硬件线路:

·将PB4~pB7插孔与发光二极管L1~14相连,以控制黄灯。

·将PC0~pC3插孔与发光二极管L5~L8相连,以控制红灯。

·将PC4~pC7插孔与发光二极管L9~L12相连,以控制绿灯。

·CS接地址译码器218~21FH插孔。

·连接+5V电源

2.编写程序,用8255A控制发光二极管,模拟交通信号灯的亮灭规律,按任意

键返回DOS。

3.运行程序,验证所编程序的正确性。

四、编程提示

1、要完成本实验,首先必须了解交通信号灯的亮灭规律。设有一个十字路口,1、3为

南北向,2、4为东西方向。

(1)初始状态为4红灯全亮,禁止通行。

(2)1、3路口绿灯亮,同时2、4路口红灯亮。1、3路口方向通车并相应延迟一

段时间

(3)1、3路口绿灯灭。1、3路口黄灯闪烁。

(4)4个路口红灯全亮。

(5)2、4路口绿灯亮,同时1、3路口红灯亮。2、4路口方向通车并相应延迟一

段时间

(6)2、4路口绿灯灭。2、4路口黄灯闪烁。

(7)转向(1)循环执行。

2.各发光二极管阳极通过电阻接十5V。因此,要使其点亮应使8255A相应端口位清0。

例如要使四个红灯亮,四个绿灯灭。应往PC口送F0H。

3.程序运行过程中,按下任意一个键,要返回DOS可以用6H号系统功能调用来识别

有无键按下。这是直接控制台I/O调用。是输入还是输出,要视DL寄存器的内容而定。当

DL=FFH时,如果要输入的字符已经准备好,就从标准输入设备上输入字符。调用返回时,

该字符放在AL寄存器中,并清除零标志位;如果字符没准备好,零标志位将被置1。当D1

不等于FFH时,表是要进行输出,此时把DL的内容作为一个要输出的有效字符,输出

到标准的输出设备上。注意这个功能调用不对Ctrl-Break进行检查、也就是说,在此功

能调用期间系统对Ctrl-Break不予响应。因此可用以下指令来判断是否有键按下,有键按下

则转.TTT,无键按下顺序执行。

MOVAH,06H

MOVDL,0FFH

INT21H

JNZTTT

4.8255A可编程并行接口控制LED发光二极管应采用工作方式0.

5.参考程序流程图如下图所示。

五、思考题

1.数据段中开辟PB单元起什么作用?

2.8255A是否可以不通过驱动器而直接驱动LED发光二极管?为什么?

实验二8251A串行口的实验

一、实验目的

1.了解串行通讯的一般原理和8251A芯片的工作原理。

2.了解RS232串行接口标准及与TTL电路的连接方法。

3.掌握8251A作异步串行接口时的编程方法。

二、实验内容

利用实验台的上的8251A实现PC机与终端间的异步串行通讯。主机发送数据用查询方

式,接收数据用查询方式或中断方式。进一步做8251A自发自收实验。波特率可选1200bps

或4800bps。

三、实验步骤

1.设计电路并在实验台上接线。

8MHZ输出接计数器部分A孔,B孔接+5V,计数器部分Q4(250KHZ输出)接

8253CLK2;

GATE2接+5V

8253OUT2和8251的TXC、RXC相连,作为发送时钟和接收时钟;

8253的CS和200—207插孔相连;

8251A的CS和208—20F插孔相连;

如有终端设备,可用电缆线将终端与J1插座连成为收发方式;

如用短路片将J1的1、2相短接或用单股导线将TXD和RXD插孔短接,则成为

自发自收方式。

CTS端必须为低电平,8251A才可向外发送数据,其它回答信号RTS、DTR、

DSR可不用。

2.编写程序,使得在主机键盘大入的字符显示在中断屏幕上;在终端键盘上打入的字符

显示在主机屏幕上。串行通信波特率可选1200bps、4800bps;主机发送数据用查询方式,接

收数据用查询方式或中断方式。

3.调试程序。汇编、连接后执行程序,验证结果。

四、编程提示

1.8253—2号定时计数器初值计算公式:

定时器2初值=FDK2/(bps*波特率因子)

式中:

FDK2:8253定时器2的时钟频率

bps:8251A和终端之间数据传送的波特率。

波特率因子在8251A初始化时由编程确定。

2.主机发送、接收均采用查询方式的程序流程如下图所示。

3.主机查询方式发送,中断方式接收程序与前不同的是:

·在主机接收数据前需将0AH中断的中断服务程序入口地址填入中断矢量表

中。

·清除IRQ2的中断屏蔽位,而在程序退出时要置IRQ2的中断屏蔽位为1。

·接收字节时主程序处于死循环状态;而由中断服务子程序完成接收字节和判

断是否返回DOS的工作。程序流程如图一39所示。

4.查询式自发自收编程与自发他收,他发自收编程有所不同。PC机用查询方式

发送一个字符后程序应转为查询式接收,判断是不是‘!’字符,是则返

回DOS,不是则继续循环。查询式自发自收程序流程如图2一40所示。

5.查询式发送中断式自收程序流程如图2一41所示。

五、思考题

若用8251A自发自收,电路接线上作何修改?程序又应如何修改?执行

程序时,若在键盘上按下A键,屏幕上应显示什么?

本文发布于:2022-12-28 09:26:20,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/45783.html

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

上一篇:兔趴帝国
下一篇:松鼠教育
标签:aaa13 com
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图