汇编语言程序的建立和执行
要建立和运行汇编语言程序、系统盘上应该首先有如下文件:
.(或其它全屏幕编辑软件如,等)编辑程序
.宏汇编程序
(或)普通汇编程序
.链接程序
.调试程序
其中是宏汇编程序,如果使用的是普通汇编程序,则不支持宏汇
编.
下面,以建立和执行用户程序为例来说明上机过程。
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小时内删除。
留言与评论(共有 0 条评论) |