文档详情

编语言程序设计的实验环境及实验步骤

桔****
实名认证
店铺
PDF
18.83MB
约159页
文档ID:575997911
编语言程序设计的实验环境及实验步骤_第1页
1/159

第一章汇编语言程序设计的实验环境及实验步骤知识提要:本章主要进行汇编语言实验环境及实验步骤,涉及到的知识点包括:1 、汇编语言源程序编写好以后, 必须经过下列儿个步骤才能在机器上运行:( 1 ) 编辑源程序( 生成. AS M文件)( 2 ) 汇编源程序( . AS M - . O BJ)( 3) 连接目标程序( . O BJ f . EXE )( 4) 调试可执行程序( 使用调试程序Debu g 调试生成的. EXE文件)( 5) 运行程序输出结果2 、 Wi n do ws 环境下的汇编语言集成编程环境的使用实验一 DOS环境下的汇编语言编程环境使用( 基础与验证型)一、实验要求和目的1 、掌握汇编语言程序设计的基本方法和技能;2 、熟练掌握使用全屏幕编辑程序EDI T编辑汇编语言源程序;3、熟练掌握宏汇编程序M A SM 的使用;4、熟练掌握连接程序L I N K 的使用二、软硬件环境1 、硬件环境:微机CP U 48 6 以上,5 0 0 M B 以上硬盘,3 2 M 以上内存;2 、软件环境:装有 MA S M 5 . 0 、D E B U G 、LI N K、EDI T、CR EF . EXE 和 EXR 2 BI N . EXE 等应用程序。

三、实验涉及的主要知识单元1 、汇编语言源程序的汇编过程汇编语言源程序的汇编过程是是利用汇编程序( MAS M) 对已编辑好的源程序文件( . AS M) 进行汇编,将源程序文件中以AS CI I 码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3 个文件:扩展名为. O BJ的目标文件、扩展名为. LS T的列表文件和扩展名为 . CR F 的交叉索引文件目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址列表文件( . LS T) 中包含了源程序的全部信息( 包括注释) 和汇编后的目标程序,列表文件可以打印输出,可供调试 检查用交叉索引文件( . CR F )是用来了解源程序中各符号的定义和引用情况的 LS T和. CR F 两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择在对源程序文件( A SM 文件) 汇编时,汇编程序将对A SM 文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编, 直到最后得到无错误的目标程序,即 O B J 文件。

因此, 汇编程序的主要功能可以概括为以下三点:( 1 )检查源程序中的语法错误,并给出错误信息;( 2 )产生目标程序文件( O B J 文件) ,并可给出列表文件( . LS T文件) ;( 3)展开宏指令汇编程序是系统提供的用于汇编的系统软件,目前常用的汇编程序有Mi cr o s o f t公司推出的宏汇编程M A S M ( M A C R O A S S E M B L E R ) 和 B O R L A ND 公司推出的 T A S M ( T U R B O A S S E M B L E R ) 两种M ic r o s o f t 公司推出有宏汇编程序M A S M 和小汇编程序A S M 两种,二者的区别在于:MASM有宏处理功能,而 ASM没有宏处理功能, 因 此 MASM比 ASM的功能强大, 但 MASM需要占据较大的内存空间, 当内存空间较小时( 如 6 4 K B ) ,只能使用A S M 2 、目标程序的连接过程汇编后产生的目标程序( O B J 文件) 并不是可执行程序文件( E X E 文件) ,还不能直接运行,它必须通过连接程序( L INK ) 连接成一个可执行程序后才能运行。

连接程序进行连接时,其输入有两个部分:一是目标文件( . O B J) ,目标文件可以是•个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言( 例如C语言) 经编译后产生的目标文件;另一是库文件( . L IB ) ,库文件是系统中已经建立的,主要是为高级语言提供的连接后输出两个文件,一是扩展 名 为 . E XE 的可执行文件,另一个是扩展名为. M A P的内存分配文件,它是连接程序的列表文件,又称为连接映像( L in k M ap ) ,它给出每个段在存储器中的分配情况,该文件可有可无连接程序给出的“ 无堆栈段的警告性错误”并不影响程序的运行所以,到此为止,连接过程已经结束,可以在操作系统下执行该. E XE 程序了3 、汇编语言和D O S 操作系统的接口编写的汇编语言源程序是在D O S 环境下运行时,必须了解汇编语言是如何同D O S 操作系统接口的用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区P S P ,其长度为2 5 6 个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。

操作系统在程序段前缀的开始处( 偏移地址0 0 0 0 H) 安排了一条INT 2 0 H软中断指令INT 2 0 H 中断服务程序由D O S 提供,执行该服务程序后,控制就转移到D OS,即返回到D O S 管理的状态因此,用户在组织程序时,必须使程序执行完后能去执行存放于P S P 开始处的INT 2 0 H指令,这样便返回到D O S , 否则就无法继续键入命令和程序D O S 在建立了程序段前缀区P S P 之后,将要执行的程序从磁盘装入内存在定位程序时,D O S 将代码段置于P S P 下方,代码段之后是数据段,最后放置堆栈段内存分配好之后,D O S 就设置段寄存器D S和 E S 的值,以使它们指向P S P 的开始处,即 I N T 2 0 H 的存放地址,同时将CS设置为P S P 后面代码段的段地址, I P 设置为指向代码段中第一条要执行的指令位置,把 S S 设置为指向堆栈的段地址,让 S P 指向堆栈段的栈底,然后系统开始执行用户程序为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法 -)标准方法首先将用户程序的主程序定义成一个F A R 过程,其最后一条指令为R E T 。

然后在代码段的主程序( 即F A R 过程) 的开始部分用如下三条指令将P S P 中 I N T 2 0 H 指令的段地址及偏移地址压入堆栈:P U S H D S ;保护P S P 段地址M O V AX , 0 ;保护偏移地址0P U S H A X 这样,当程序执行到主程序的最后- - 条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到C S和 I P ,从而执行INT 20H指令,使控制返回到DOS状态返回DOS的标志就是程序运行完后出现一个DOS的标识符,如 C: \ > )非标准方法也可在用户的程序中不定义过程段,只在代码段结束之前( 即CODE ENDS之前) 增加两条语句:MOV AH, 4CHINT 21H则程序执行完后也会自动返回DOS状态此外,由于开始执行用户程序时, DS并不设置在用户的数据段的起始处,E S 同样也不设置在用户的附加段起始处,因而在程序开始处使用以下方法重新装填D S和 E S的值使其指向用户的数据段:MOV A X ,段名MOV 段寄存器名,AX ;段寄存器名可以是DS、ES、SS之一四、实验内容与步骤1、实验内容编写程序,判断一个年份是否是闰年。

2、实验步骤汇编语言程序设计上机过程如图1.1所示图 L 1 汇编语言程序上机过程(-)用编辑程序E D I T建立汇编语言源程序文件( AS M文件)例如,编写程序,判断一个年份是否是闰年的汇编语言源程序,可 以 在 D O S模式下用编辑程序EDIT.EXE建立汇编语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM 也可以在Windows 2000或者在Windows XP环境下鼠标单击“ 开始” 一 “ 运行”,在 “ 运行”中输入“CMD” 进入DOS模式,运行EDIT软件,例如:C> EDIT ABC.ASM进入EDIT的程序编辑画面时,输入汇编语言源程序如下:D AT AS E G M E N TI N FO N D BO D H , O AH ,J P l e a s e i n pu t a y e a r: $ 'Y D BO D H , O AH , ' T h i s i s a l e a p y e a r! $ 'N D BO D H , O AH , ' T h i s i s n o t a l e a p y e a r! $ 'W D W0BU FD B8D B?D B8 D U P (? )D A T A E N D SS T A C K S E G M E N T's t a c k ,D B2 0 0 D U P (0 )S T A C K E N D S CODESEGMENTASSUMEDS:DATA,SS:STACK, CS:CODESTART:MOVAX,DATAMOVDS, AXLEADX,INFONMOVAH, 9INT21HLEADX, BUFMOVAH, 10INT21HMOVCL, [BUF+1]LEADI,BUF+2CALLDATACATECALLIFYEARSJCAlLEADX,NMOVAH, 9INT21HJMPEXITA l:LEADX, YMOVAH, 9INT21HEXIT:MOVAH, 4CIIINT21HDATACATEPROCNEARLEASI,BU F+2MOVBX,0X3:MOVAL , [S I]SUBAL , 30HMOVAH,0XCIIGAX, BXMOVDX,10DMULDXXCHGAX, BXADDBX, AXINCSILOOPX3MOVW, BXRETDATACATEENDPIFYEARSPROCNEARPUSHBXPUSHCXPUSHDXMOVAX, WMOVCX, AXMOVDX,0MOVBX,4DIVBXCMPDX,0JNZLABIMOVAX, CX M O VB X , 1 0 0D I VB XC M PD X , 0J N ZL A B 2M O VA X , C XM O VB X , 4 0 0D I VB XC M PD X , 0J ZL A B 2L A B I :C L CJ M PL A B 3L A B 2 :S T CL A B 3 :P O PD XP O PC XP O PB XR E TI F Y E A R SE N D PC O D E E N D SE N DS T A R T(二 ) 用汇编程序M A S M将A S M文件汇编成目标程序文件(O B J文件)当源程序建立以后,仍以ABC.ASM程序为例,我们用汇编程序MASM对 ABC.ASM源程序文件进行汇编,以便产生机器码的目标程序文件ABC.OBJ,其操作步骤如下:C>MASM ABCMicrosoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [ABC.OBJ]:Source listing [NUL.LST]: ABCCross-reference [NUL.CRF]: ABC50674 + 450574 Bytes symbol space free0 Warning Errors0 Severe Errors由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。

第一个提示行为:Object filename [ABC.OBJ]:这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示) ,这是我们汇编的主要目的第二个提示行为: Source listing [NUL.LST]:这是询问是否建立列表文件若不建立,直接回车:若要建立,可以输入文件名ABC再回车,表示要建立名为ABC的列表文件列表文件中同时列出源程序和机器语言程序清单,并给出符号表,有利于程序调试第三个提示行为:Cross-reference [NUL.CRF]:这是询问是否要建立交叉索引文件若不建立,则直接回车;若要建立,可以输入文件名A B C ,表示要建立ABC.CRF文件由于.CRF是非文本文件,为了建立交叉索引文件,还必须调用CREF.EXE程序,即输入:OCREF ABCMicrosoft (R) Cross-Reference Utility Version 5.00Copyright (C) Microsoft Corp 1981 - 1985, 1987. All rights reserved.listing [ABC.REF]: 1 7 S y m b o l s这时首先显示版本号,然后出现一个提示行:L i s t i n g [ A B C . R E F ] :这是询问交叉索引文件名。

这时可用回车承认方括号内机器默认的文件名,如上所示这样就建立了A B C . R E F 文件其内容是用户定义的所有符号( 包括变量) ,并给出每个符号定义所在的行号( 附以# ) 以及引用的行号如下是A B C . R E F 文件的内容:M i c r o s o f t C r o s s - R e f e r e n c e V e r s i o n 5 . 0 0S y m b o l C r o s s - R e f e r e n c eAl. . . . . . . . . . . . . . . . . . . . . . . . . . . . .B U F . . . . . . . . . . . . . . . . . . . . . . . . . . . . .C O D E . . . . . . . . . . . . . . . . . . . . . . . . . . .D A T A . . . . . . . . . . . . . . . . . . . . . . . . . . .D A T A C A T E . . . . . . . . . . . . . . . . . . . . . . .E X I T . . . . . . . . . . . . . . . . . . . . . . . . . . .I F Y E A R S . . . . . . . . . . . . . . . . . . . . . . . . .I N F O N . . . . . . . . . . . . . . . . . . . . . . . . . . .L A B I . . . . . . . . . . . . . . . . . . . . . . . . . . .L A B 2 . . . . . . . . . . . . . . . . . . . . . . . . . . .L A B 3 . . . . . . . . . . . . . . . . . . . . . . . . . . .N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .S T A C K . . . . . . . . . . . . . . . . . . . . . . . . . . .S T A R T . . . . . . . . . . . . . . . . . . . . . . . . . . .W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .X 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . .Y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 7 S y m b o l sS a t D e c 0 1 1 8 : 4 9 : 4 2 2 0 0 7(# d e f i n i t i o n , + m o d i f i c a t i o n ) C r e f - 14 24 7 #1 5 #3 53 83 95 52 8 #2 91 1 11 #2 12 93 04 05 3 #8 04 65 0 #4 18 2 #1 1 02 #3 29 21 0 3 #9 71 0 21 0 5 #1 0 41 0 6 #1 0 #4 32 2 #2 22 72 93 0 #1 1 21 4 #7 6 +8 66 0 #7 36 #4 7调入汇编程序,当我们回答了上述各提示行的询问之后,汇编程序就对源程序进行汇编。

若汇编过程中发现源程序有语法错误,则列出有错误的语句和错误的代码错误分警告错误( W r a n i n g E r r o r s ) 和严重错误( S e v e r e E r r o r s )o警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数及行号、错误的性质等这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序加以修改,修改后重新汇编,直到汇编后无错误为止 三 ) 用连接程序L I N K 生成可执行程序文件( E X E 文件)经汇编后产生的二进制的目标程序文件( O B J 文件) 并不是可执行程序文件( E X E 文件) ,必须经连接以后,才能成为可. 执行文件连接程序并不是专为汇编语言程序设计的如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件连接过程如下:C>LINK ABCMi c r o s o f t ( R) Ov e r l a y Li n k e r Ve r s i o n 3.60Co p y r i g h t ( C) Mi c r o s o f t Co r p 198 3-198 7. Al l r i g h t s r e s e r v e d .Ru n Fi l e [ ABC.EXE] :Li s t Fi l e [ NUL.MAP] : ABCLi b r a r i e s [ .LIB] :在连接程序调入后,首先显示版本号,然后出现三个提示行。

第一个提示行为:Run File [ABC.EXE]:这是询问要产生的可执行文件的文件名一般直接回车采用方括号内规定的隐含文件名第二个提示行为:List File [NUL.MAP|:这是询问是否要建立连接映象文件若不建立,则直接回车;若要建立,则输入文件名再回车如果要建立该文件,可以输入文件名ABCo第三个提示行为:Libraries [.LIB]:这是询问是否用到库文件若无特殊需要,则直接回车即可上述提示行回答后,连接程序开始连接若连接过程中有错,则显示错误信息,错误分析清楚后,要重新调入编辑程序进行修改,然后重新汇编,再经过连接,直至无错为止连接以后,便产生了可执行程序文件(EXE文件) 四) 程序的执行当我们建立了可执行文件ABC.EXE后,就可直接在DOS下执行该程序:C>ABC根据程序提示,输入一个年份,计算机会输出是否闺年的结果五、实验要求与提示1、实验要求( 1 ) 掌握汇编语言程序设计上机过程;( 2 ) 回答思考问题;( 3 ) 记录实验结果2、实验提示按照图L 1 的上机过程进行实验六、思考与练习以及测评标准( 1 ) 汇编过程中MASM ABC和 MASM ABC.ASM的结果是否一致。

2 ) 连接过程中LINK ABC和 LINK ABC.OBJ的结果是否一致3 )使用Word如何录入汇编语言源程序 实验二Debug的使用( 基础与验证型)一、实验要求和目的熟练掌握动态调试程序D E B U G 的使用;二、软硬件环境1、硬件环境:微机CPU 48 6以上,5 0 0 M B 以上硬盘,3 2 M 以上内存;2、软件环境:装有 MA S M 5 . 0 、De b u g 、LINK、EDIT, CREF. EXE 和 EXR2BIN. EXE 等应用程序三、实验涉及的主要知识单元通过编辑、汇编和连接后的程序是可以执行的程序但是,一个程序特别是比较复杂的程序不能保证没有一点错误因此,在投入正式运行前必须进行调试,以检查程序的正确性调试程序D e b u g 就是用来调试汇编语言程序的一种工具D e b u g 的主要功能有显示和修改寄存器及内存单元的内容;按指定地址启动并运行程序;设置断点使程序分段运行,以使检查程序运行过程中的中间结果或确定程序出错的位置;反汇编被调试程序,它将一个可执行文件中的指令机器码反汇编成助记符指令并同时给出指令所在的内存地址; 单条追踪或多条追踪被调试程序, 它可以逐条指令执行或儿条指令执行被调试程序, 每执行一条( 或几条) 指令后,D e b u g 程序将中断程序的运行并提供有关结果信息;汇编一段程序,在 D e b u g 的汇编命令下可以直接输入助记符指令,并将其汇编成可运行程序段。

此外,D e b u g 还可以将磁盘指定区的内容或一个文件装入到内存或将内存的信息写到磁盘上等等启动D e b u g 程序: 在D O S 状态下可以用下面的命令启动D e b u g 程序:D E B U G [ 路径文件名. 扩展名]D e b u g 后面的文件名及路径是指被调试程序的文件名及路径,D e b u g 后面的文件必须是程序的可执行文件,其扩展名可以是. E X E 或. C O M 在此命令后,D O S 将调试程序D e b u g 调入内存,D e b u g 接着将被调程序送入内存比如:D E B U G 1 2 3 . E X E调试程序D e b u g 的主要命令如下:( -)显示内存单元内容的命令D格式⑴ :-D地址从指定地址开始,显示1 2 8 个字节的内容,每一行的左边显示段内偏移地址,接着显示1 6 个单元的内容,最右边区域则显示这一行的1 6 个单元所对应的可显示的字符若无可显示的字符,则用圆点( 小数点) 填充D命令中的地址可为段内偏移量, 也可为段基址和段内偏移量两部分, 中间用冒号隔开, 如 1 6 8 0 : 0 1 1 0 ,即指段基址为1 6 8 0 H , 段内偏移量为0 1 1 0 H 。

D e b u g 中所显示的数据均为十六进制数,且省去了后面的H机; 志O格式( 2 ) : -D范围将显示指定地址范围内的内存单元的内容,起始地址可由段基址及段内偏移量两个部分组成,中间用冒 号 “ :”隔开,也可以只指出段内偏移量,而此时的段基址在DS中这里所说的范围包含起始地址和结束地址比 如 - D D S U O O O 1 0 2 0 将显示数据段偏移地址为1000H到 1020H的内容 -)修改内存单元内容的命令E格式( 1) : - E 地址内容表它的功能是用给定的内容表去代替所指定的内存单元的内容例如:E DS: 0110 41 'CLOSE' 41该命令执行后,将用列表中的7 个字符填入从DS: 0110到 DS: 0116的 7 个存储单元中格式( 2) : E 地址它的功能是可以连续地逐个修改内存单元的内容当屏幕上显示指定单元的地址和内容之后,可采取下列办法:①若指定单元的内容需要修改,则将新的内容的十六进制数输入,再按空格键,修改便告完成,然后显示下一个存储单元的地址及内容,若需要修改,可进行同样的操作若某一个单元的内容不需要修改,而操作又要进行下去,则可宜接按空格键。

②若需要显示前一个单元的地址和内容,则输入连接号',若要修改,则输入新的内容;若显示前一个单元的地址和内容仍要修改,则可进行同样的操作;若显示的内容不需要修改,则可直接按'键,使该操作由高地址向低地址单元连续不断地进行o③按< CR> 键,结束E 命令 三)检查和修改寄存器内容的命令R格 式 ⑴ : R此时将显示所有寄存器的内容和全部标志位的状态,以及现行CS: IP所指的机器指令代码和反汇编符号格式( 2) : R 寄存器名该格式可用于检查和修改指定寄存器的内容若不修改其内容,可按< CR> 键,若需要修改其内容,可以输入1-4个十六进制数,再按< CR> 键格式( 3) : RF该格式可用于显示标志和修改标志位状态当系统给出标志位状态后,可采取下列办法:①若不需要修改任一标志位,可按< CR> 健②若需要修改一个或多个标志位,可输入其相反的值各标志位之间可以无空格且与顺序无关,修改后按< CR> 键由于标志位状态显示时,是用下列特殊符号表示的,因而修改时,只要输入规定的符号即可下面是标志名和状态符号的对照表:只有追踪标志T F ,不能用指令直接修改例如:输入RF命令,系统可能作出如下响应:OV DN EI NG Z R AC PE CY -标志名置位符号复位符号溢出标志OF( 是/ 否)OVNV方向标志DF( 减/ 增)DNUP中断标志IF( 允许/ 禁止)EIDI符号标志SF( 负/ 正)NGPL零标志Z F( 是/ 否)Z RNZ辅助进位标志AF( 是/ 否)ACNA奇偶校验标志PF( 偶/ 奇)PEPO进位标志CF( 是/ 否)CYNC 若现在要修改奇偶、零、中断和溢出标志位,可在光标处输入:PO NZ DI NV( 四)运行程序命令G格式:G [ = 地址] [ 地 址 [ 地址… ]]该命令可以在程序运行中设置断点。

它是Debug程序进行程序调试的主要命令之%示例:-g 001a则执行从当前cs:ip至 001a的指令, 注意:地址设置必须从指令的第一字节设起①第一个参数“ = 地址”规定了程序执行的起始地址,以 C S内容作段地址,等号后面的地址只需给出地址偏移量此时,命令G 与地址之间的等号不能省去如果在G 命令执行前,已经设置了 CS值 和 IP值,则也可以直接用G 命令,从指定地址执行程序②格式中后面给出的地址是指断点地址,最多可设置10个断点当程序执行到一个断点时,就停下来,显示CPU各寄存器的内容和标志位的状态,以及下一条待执行的指令,被调试程序的所有断点全部被取消,并返回Debug③地址参数所指的单元,必须包含有有效的8088指令的第一个字节,否则将产生不可预料的结果④堆栈必须至少包含有6 个可用字节,否则也将产生不可预料的结果⑤若断点地址只包括地址偏移量,则认为段地址在C S寄存器中 五)追踪命令T格式( 1) : T [ = 地址]该命令可以在指令执行中进行追踪,若略去地址,则从CS: IP现行值执行每一次T 命令都执行- -条指令格式( 2) : T [ = 地址] [ 值]此时,它可对多条指令进行追踪,即在执行了由值所指定的若干条指令之后,停止执行并显示各寄存器的内容和各标志位,还指出下一条待执行的指令。

六)汇编命令A若在调试目标程序的过程中,要求改写或增添一段目标程序,则可以用A 命令直接在Debug下实现格式:A [ 地址]该命令可以从指定地址开始,将输入的汇编语言语句立即汇编成机器代码,连续存放在内存单元中•在程序输入完毕后,最后一行不输入内容,直接按回车键,即可返回DEBUG程序,还可用反汇编命令U对刚输入的内容进行反汇编,以验证输入的程序是否正确使用A 命令应遵守以下规则:①所有输入数值,均为十六进制数②前缀助记符,必须在相关指令的前面输入,可以在同一行,也可以在不同行输入③段超越助记符为CS:、 DS:、 ES:、 SS:④远调用时的返回指令助记符用RETFo⑤使用串操作指令时,助记符中必须注明是字节还是字传送⑥汇编语言能自动汇编短、近和远的转移及近和远的调用,也能由NEAR和 FAR前缀来超越例如:0110:0600 JMP 602;短转移0110:0602 JMP NEAR 605;近转移0110:0605 JMP FAR 60A;远转移第一条JM P指令中含有一个字节偏移量第二条JM P指令中含有两个字节偏移量第三条JM P指令中含有两个字节的偏移量及两个字节的段地址。

⑦ 当 DEBUG不能确定某些操作数涉及的是字类型存储单元还是字节类型的存储单元时,在这种情况下,必须用前缀“WORDPTR” 或 “BYTEPTR” 来加以说明例如:NEG BYTE PTR [128]DEC WORD [SI]⑧ 当 Debug不能确定一个操作数是立即数还是存储单元的地址时,可以把地址放在方括号中⑨ 两个最常用的伪指令DB和 DW 可以在A 命令中使用,用来直接把字节或字的值送入相应的存储单元例如:DB 2, 5, 3, 4, ' THIS IS AN EXAMPLE(DW 6000 , 2000 , 7000, ' BA'⑩Debug支持所有形式的寄存器间接寻址命令例如:ADD BX, 74 [BP+3] [SI-5]POP [BX+DI]( 七)反汇编命令U格 式 ⑴ : U 地址该命令从指定的地址开始,反汇编32个字节若略去指定地址,则以上一个U 命令反汇编的最后一条指令地址的下一条指令地址作为起始地址; 若没有用过U 命令, 则以由Debug初始化的段寄存器的值作段地址,以 100作为地址偏移量格式( 2) : U 范围这种格式的命令,可以对指定范围的内存单元进行反汇编,范围可以由起始地址、结束地址( 只能包含地址偏移量) 或起始地址及长度来指定。

其命令格式如:U04BA:100 0108 或 U 04BA:0100 L7两者是等效的 A )输入命令I格式:I 端口地址该命令从指定端口输入一个字节并显示例如:1 2E8C C它表示所显示的是从02E8端口输入的一个字节为CC 九)输出命令O格式:O 端口地址字节值其功能是向指定的端口输出一个字节例如:O2E8 12它表示将一个字节12H送到输出端口 2E8 十)命名命令N格式:N 文件标识符[ 文件标识符]该命令用给定的两个文件标识符格式化在CS:5C和 CS:6C的两个文件控制块中( 若在调用Debug时具有一个文件标识符,则它已格式化在CS:5C的文件控制块中) ,文件控制块是将要介绍的装入命令L 和写命令W 所需要的N 命令能把文件标识符和别的参数放至CS:81开始的参数保存区中 在 CS:80中保存输入的字符个数,寄存器AX保存前两个文件标识符中的驱动器标志例如: A> DEBUGN TESTLN 命令后, 用 L 命令可将TEST调入自己的CS: 100开始的存储区中 若对正在调试的程序TEST进行调试时,需要用到其它的文件标识符及其它参数,也可用N 命令加以实现。

例如:A> DEBUG TESTN文 件 1 文件2( H' ■ 一 )装入命令L格式1: L 〈 地址〉〈 驱动器号》( 起始逻辑扇区》〈 所读扇区个数n>其中〈 地址》 的缺省值为CS: 100逻辑扇区可由物理扇区号换算得到,以双面双密度盘为例:物理扇区是按0 面 道 1 区,面 0 道 2 区,. . .,面 0 道 9 区,0 面 1 道 1 区,. . . . ,0 面 39道 9 区,1 面0 道 1 区,……,1 面 39道 9 区排列而逻辑扇区与物理扇区号的对应关系为物理扇区0 面 0 道 1 扇区至9 扇区,逻辑扇区号为0—8;物理扇区1 面 0 道 1 扇区至9 扇区,逻辑扇区号为9—11H;物理扇区0 面 1道 1扇区至9 扇区,逻辑扇区号为12—1AH;……o 这样每道先0 面后1 面一直排下去其中〈 驱动器号》 为 0、1 或 2, 0 表示A驱,1 表示B驱,2 表示硬盘功能:将〈 驱动器号〉 指定的盘上,从〈 起始逻辑扇区》 起,共 n 个逻辑扇区上的所有字节顺序读入指定内存地址开始的一片连续单元当 L 后的参数缺省时,必须在L之前由N命令指定( 或进入DEBUG时一并指出)所读驱动器文件名。

此时L 执行后将该文件装入内存例 如 :-N EXAMPLE -L 将当前驱动器上的EXAMPLE文件装入CS: 100起始的一片内存单元格式2: L 地址或L该命令把已在CS:5c中格式化的文件控制块所指定的文件装入到指定区域中若省略地址,则装入到CS: 100开始的内存区域中若是带有扩展名CO M 或.EXE文件,无论命令中是否指定了地址,一律装入到CS:100开始的内存区域中去通常在BX和 C X 中包含了所读入文件的字节数,但对具有扩展名.EXE文件,则 BX和 C X 中还包含实际程序长度 十二)写命令W功能:为 L / W 命令指定待装入/ 写盘文件格 式 1: W <地址> < 盘号> < 起始逻辑扇区> < 所写逻辑扇区数n>功能:与 L 命令不同的地方是将内存从< 地址》 起始的一片单元内容写入指定扇区只有W 而没有参数时,与 N 命令配合使用将文件写盘该命令把由地址所指定的内存区域中的数据写入指定的驱动器若地址中只包含偏移量,则段地址在C S中其中,扇区号决定了写入起始扇区;区段数决定了写入的区段个数;扇区号和区段数均用十六进制数表示格式2: W 地址或W该命令把指定内存区域中的数据,写入到由CS:5c处的文件控制块所规定的文件中去。

若省略地址,则内存区域从CS: 100开始对于扩展名为.EXE或.HEX文件不能写入因为这些文件的写入要用一种特殊格式,而此格式Debug程序不支持 ( 十三 ) 退出D e bu g命令Q格式:Q该命令退出D e bu g程序并返回DOSQ命令并不把内存中的文件存盘,若需要存盘的话,应在退出前用W命令写入磁盘四、实验内容与步骤1、实验内容( 1 )进入和退出D e bu g程序( 2 )学会D e bu g中的D命令、E命令、R命令、T命令、A命令、G命令、U命令、N命令、W命令等的使用 3 )利用D e bu g ,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能 4 )使用D e bu g调试程序调试汇编程序2、实验步骤(1 )在D OS提示符下,进入D ebu g程序2)详细记录每一步所用的命令,以及查看结果的方法和具体结果 3 )现有•个双字加法源程序如下,其中存在错误现假设已汇编、连结生成了可执行文件H B . E XE ,存放在d: \ MA S M目录下请使用D ebu g对其进行调试C ode S E G ME NTA S S UME C S : code, D S : codeORG 10 0 H; 从10 0 H处开始存放下列指令S t art : MOV A X, code; 将口$ 置成code段的首地址MOV D S , A XMOV S I , 2 0 0 H; 取第一个数的首地址MOV A X, [ S I ]; 将第一个数的低16位取到A XMOV D I , 2 0 4 H; 取第二个数的首地址A D D A X, [ D I ]; 第一个数和第二个数的低16应相加MOV[ S I + 8 ] , A X; 低16位相加的结果送到2 0 8 I I和2 0 9 H单元MOV A X, [ S I + 2 ]; 取第一个数的高16位送到A X中A D D A X, [ D I + 2 ]; 两个数的高16位相加MOV[ S I + OA H ] , A X; 高16位相加的结果送到2 0 A H , 2 0 B H单元MOV A X, 4 C 0 0 H; 使用D O S的4 cH号功能调用I NT 2 1H; 进入功能调用,返回D OSORG 2 0 0 11; 从2 0 0 11处开始存放下列数据D D 12 3 4 5 6 7 8 h , 6 5 4 3 8 7 A 9 h , Oh ; 被加数、加数、和C ode E ND SE ND st art调试过程: ① 进入D ebu g并装入可执行文件H B .E XED : \ MA S M> D ebu g H B . E XE < E n t er>②观察寄存器初始状态- R < E n t er>A X= OOOO B X= OOOOD S = 18 9 2 E S = 18 9 2C X= 0 2 0 C D X= OOOO S P= OOOO B P= OOOO S I = 0 0 0 0 D I = OOOOS S = 18 A 2 C S = 18 A 2 I P= 0 10 0 NV UP E I PL NZ NA PO NC18 A 2 : 0 10 0 B 8 A 2 18MOVA X, 18 A 2注:( 1)以上显示的寄存器值,可能和你的电脑显示的不一样。

2 ) D ebu g中默认的进制是十六进制③以单步工作方式开始运行程序首先用T 命令顺序执行用户程序的前I 两条指令,将段寄存器DS预置为用户的数据段 T < E n t er>A X= 18 A 2 B X= 0 0 0 0C X= 0 2 0 c D X= OOOO S P= OOOOB P= 0 0 0 0 S 1= 0 0 0 0 D I = 0 0 0 0D S = 18 9 2 E S = 18 9 2S S = 18 A 2 C S = 18 A 2 I P= 0 10 3NV UP E I PL NZ NA PO NC18 A 2 : 0 10 3 8 E D 8MOVD S , A X- T < E n t er>A X= 18 A 2 B X= OOOOC X= 0 2 0 C D X= OOOO S P= OOOOB P= 0 0 0 0 S I = 0 0 0 0 D I = 0 0 0 0D S = 18 A 2 E S = 18 9 2S S = 18 A 2 C S = 18 A 2 I P= 0 10 5NV UP E I PL NZNA P0 NC18 A 2 : 0 10 5 B E 0 0 0 2MOVS I , 0 2 0 0④观察用户程序数据段初始内容- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 7 8 5 6 3 4 12 A 9 8 7 4 3 6 5 - 0 0 0 0 0 0 0 0 0 0 7 4 13 5 0x V4 ... C e.... t . P⑤ 连续工作方式运行程序至返回DOS前 ( 设断点) ,查看运行结果。

为此,现使用U 命令反汇编 U 10 0 < E n t er>18 A 2 : 0 10 318 A 2 : 0 10 518 A 2 : 0 10 818 A 2 : 0 10 A18 A 2 : 0 10 D18 A 2 : 0 10 F18 A 2 : 0 11218 A 2 : 0 11518 A 2 : 0 10 0 B 8 A 2 18MOVA X, 18 A 28 E D 8MOVD S , A XB E 0 0 0 2MOVS I , 0 2 0 08 B 0 4MOVA X, [ S I ]B F 0 4 0 2MOVD I , 0 2 0 40 3 0 5A D DA X, [ D I ]8 9 4 4 0 8MOV[ S 1+ 0 8 ] , A X8 B 4 4 0 2MOVA X, [ S I + 0 2 ]0 3 4 5 0 2A D DA X, [ D I + 0 2 ] 18 A 2 : 0 118 8 9 4 4 0 AMOV[ S I + OA ] , A X18 A 2 : 0 11B B 8 0 0 4 CMOVA X, 4 C 0 018 A 2 : 0 11E C D 2 1I NT2 1可见,要执行1 0条指令, 至0 1 I B处停止- G = 10 0 , 0 1 I B < E n t er>A X= 7 7 7 7 B X= OOOO C X= 0 2 0 C D X= OOOO S P= OOOOB P= OOOO S I = 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2 C S = 18 A 2 I P- 0 1I BNV UP E I PL NZ NA PE NC18 A 2 : 0 11B B 8 0 0 4 CMOVA X, 4 C 0 0- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 7 8 5 6 3 4 12 A 9 8 7 4 3 6 5 - 2 1 D E 7 7 7 7 4 3 4 3 8 3 0 6x V4 ...C e! . w w C C ..和为7 7 7 7 D E 2 1H ,正确。

⑥再取一组数据,查看运行结果为此,首先用E命令修改数据 E 2 0 0 C D , A B , 7 8 , 5 6 , 9 0 , E F , 3 4 , 12 < E n t er>- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 C D A B 7 8 5 6 9 0 E F 3 4 12 - 2 1 D E 7 7 7 7 4 3 4 3 8 3 0 6..x V.. 4 . ! . w w C C ..- G = 10 0 , 11B < E n t er>A X= 6 8 A C B X= OOOO C X= 0 2 0 C D X= OOOO S P= OOOOB P= 0 0 0 0 S I = 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2C S = 18 A 2 I P= Ol l BNV UP E I PL NZ NA PE NC18 A 2 : 0 11B B 8 0 0 4 CMOVA X, 4 C 0 0- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 C D A B 7 8 5 6 9 0 E F 3 4 12 - 5 D 9 B A C 6 8 4 3 4 3 8 3 0 6 .. x V.. 4 . ] .. h C C ..和为6 8 A C 9 B 5 D H ,错误。

说明程序有问题⑦再将断点设在完成低位字加法后,查看运行结果 G = 10 0 , 112 < E n t er>A X= 9 B 5 D B X= OOOO C X= 0 2 0 C D X= OOOO S P= OOOOB P= OOOO S I = 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2 C S = 18 A 2 I P= 0 112NV UP E I NG NZ NA P0 C Y18 A 2 : 0 112 8 B 4 4 0 2MOVA X, [ S I + 0 2 ]D S : 0 2 0 2 = 5 6 7 8- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 C D A B 7 8 5 6 9 0 E F 3 4 12 - 5 D 9 B A C 6 8 4 3 4 3 8 3 0 6..x V.. 4 . ] .. h C C ..低位和为9 B 5 D ,正确说明错误可能出在后面⑧ 使用T命令从刚才的断点处向后单步调试,查看运行结果。

- T= l 12 < E n t er>A X= 5 6 7 8 B X= OOOOC X= 0 2 0 C D X= OOOO S P= OOOOB P= OOOO S I = 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2 C S = 18 A 2 I P= 0 115NV UP E I NG NZ NA PO C Y18 A 2 : 0 115 0 3 4 5 0 2A D DA X, [ D I + 0 2 ]D S : 0 2 0 6 = 12 3 4- T < E n t er>A X= 6 8 A C B X= OOOOC X= 0 2 0 C D X= OOOO S P= OOOOB P= OOOO S 1= 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2 C S = 18 A 2 I P= 0 118NV UP E I PL NZ NA PE NC18 A 2 : 0 118 8 9 4 4 0 AMOV[ S I + OA ] , A XD S : 0 2 0 A = 6 8 A CA X寄存器的结果为6 8 A C , 而应为6 8 A D 。

可见是本条加法指令使用错误,这里应使用带进位加法指令⑨ 使 用 A命令装入正确指令后再次运行,察看结果 A 115 < E n t er>18 A 2 : 0 115 A D C A X, [ D I + 0 2 ] < E n t er>18 A 2 : 0 118 < E n t er>- G = 10 0 , 11B < E n t er>A X= 6 8 A D B X= OOOO C X= 0 2 0 C D X= OOOO S P= OOOO B P= OOOO S I = 0 2 0 0 D I = 0 2 0 4D S = 18 A 2 E S = 18 9 2 S S = 18 A 2 C S = 18 A 2 I P= 0 11B NV UP E I PL NZ NA P0 NC18 A 2 : 0 11B B 8 0 0 4 C MOV A X, 4 C 0 0- D 2 0 0 2 0 F < E n t er>18 A 2 : 0 2 0 0 C D A B 7 8 5 6 9 0 E F 3 4 12 - 5 D 9 B A D 6 8 4 3 4 3 8 3 0 6 .. x V.. 4 . ] .. h C C ..和为6 8 A D 9 B 5 D H , 正确。

对于这样一个简单程序一般来说不会再有问题退出后修改源程序即可⑩退出- Q < E n t e r >D : \>需要说明的是此程序很简单, 只需使用T命令逐条单步调试即可 本例采用的调试方法似乎过于繁琐,但这是为了说明程序调试的一般方法,以便读者调试复杂程序时借鉴五、实验要求与提示1 、实验要求( 1 ) 熟练掌握D e b u g 的命令;( 2 ) 熟练掌握使用D e b u g 调试汇编程序;( 3 ) 回答思考问题;( 4 ) 记录实验结果2 、实验提示一般使用D e b u g 调试汇编程序的步筹如下:(1 )调用DEBUG,装入用户程序 (2)观察寄存器初始状态(3 )以单步工作方式开始运行程序(4)观察用户程序数据段初始内容(5)继续以单步工作方式运行程序(6)连续工作方式运行程序(7)修改程序和数据(8)运用断点调试程序六、思考与练习以及测评标准(1 )如何启动和退出Debug程序2 )整理每个Debug命令使用的方法,实际示例及执行结果3 )启动Debug后,要装入某一个.EXE文件,应通过什么方法实现?(4 )用Debug调试程序时, 如何设置断点?⑸编写计算下面函数值的程序:l,x>0y = < 0, x = 0-l,x < 0设输入数据为X、输出数据Y ,且皆为字节变量,使用Debug查看X、Y两个变量的数据。

⑹分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和Z ero中,数组元素个数保存在其第, •个字中使用Debug查看Positive、Negative和Z ero三个变量的数据七、参考程序;CH1EX1.ASM编写计算下面函数值的程序:l,x>0y = \ 0,x = 0- l,x<0设输入数据为X、输出数据Y , 且皆为字节变量程序如下:源程序如下:DATA SEGMENTX DB -10Y DB ?DATA ENDSSTACK SEGMENT STACK DB 200 DUP(O)STACK ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART: MOVAX,DATAMOVDS,AXCMPX,0; 与 0 进行比较JGE Al;X 2 0 转 AlMOVY,-l;X VO 时,-1-YJMPEXITAl:JGA2;X>0 转 A2MOVY,0;X=0 时,0 - YJMPEXITA2:MOVY,1;X > 0 ,l-YEXIT:MOVAH, 4CHINT 21HCODEENDSEND STARTDebug chlexl.exe»:\n a s n > d e b u g c h le x l-U:00 00:0003:0005:0008:000B:000E: 0012:0014:0018:001B:001D:001FB8590B8 EDSB 80000BB0000BA0 0 0 08B 0E 0000E3198D 360200833C 007C06740840uuuuuuxApcOOOOOOCEMLZNMMMMMMJLCJJIA X ,0B 59DS,AXAX, 0 0 0 0B X ,0 0 0 0D X ,0 0 0 0C X ,[0 0 0 0 ]002 DS I ,[0 0 0 2 ]WORD PTR [ S I ],+ 0 0002300 27AX c, C:\¥INDO¥S\syste>32\cBd. exe - debug ch lezl. exe0B5B:000E0B5B:00120B5B:00140B5B:00180B5B:001B0B5B:001D0B5B:001F0B5B:00200B5B:00220B5B:00230B5B:00240B5B:00260B5B:00270B5B:00280B5B:002B0B5B:002D0B5B:00300B5B:00340B5B:00380B5B:003A0B5B:003C0B5B:003EBA00008B0E0000E3198D360200833C007C06740840EB069043EB02904283C602E2EBA31600891E180089161A00B44CCD2100000000M O UM O UJCXZLEACMPJLJZINCPPCPPCDOUUUUTDDMONMONDOOOOONDDJNIJNIALMMMMIAADX.0000CX,[0000]002 DS I ,[0002]W ORD PTR LSI],+000023002?AX0028BX0028DXS U +020018[0 0 1 6 ],AX[0018 KBX[001ALDXAH, 4c21[BX+SI],AL[BX+SI],AL可以知道该程序执行的最后一条指令的地址是0B5B:0038键入如下两条命令,第一条命令是使程序运行到0B5B:()038结束,第二条命令是显示数据段的内容,就可以显示X、Y 的值了。

G 0038-D DS:0c: C:\fINDOTS\syste>32\cBd.exe 一 debug ch lex l.ex e0B5B:00270B5B:00280B5B:002B0B5B:002D0B5B:00300B5B:00340B5B:00380B5B:003A0B5B:003C0B5B:003E-G 00384283C602E2EBA31600891E180089161A00B44CCD2100000000CDOUUUUTDDNDOOOOONDDIALMMMMIAADXS I ,+020018[0016 LAX[0018 LBX[001ALDXAH,4c21[BX+SI],AL[BX+SI],ALAX=0005PS=0B590B5B:0038PD DS:00B59:00000B59:00100B59:00200B59:00300B59:00400B59:00500B59:00600B59:0070BX=0003ES=0B49B44CCX=0000 DX=0002 SP=0000SS=0B59 CS=0B5B IP=0038M O UAH, 4cBP=0000 81=0016NU UP EI PL NZDI=0000NA PO NCF5862600F1B30100558DB900D6D8E80080E930000081400020B30800500E91000c906E0000500100AD80B90008B0E800IF 00-BF05 00-0300 00-BB02 00-8390 42-831A 00-B400 00— 0000 00— 00B0AC2100F0B7E200E2002D0020000C00E00C6C00F003C40000E0000000040000cscsn0 Dr 00sjsi00801000100430000007A000;CH1EX2.ASM; 分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和 Z ero中,数组元素个数保存在其第一个字中。

源程序如下:DATA1 SEGMENTData DW 10DW 2130, -43,31,-321,-1234, 345, 0, 3213, 0, 5477 Positive DW 0Negative DW 0Z ero DW 0DATA1 ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA 1START:MOV AX, DATA1MOV DS, AXMovAX,0; 用AX来对正数计数MovBX,0; 用BX来对负数计数MovDX,0; 用DX来对零计数MOVCX, data; 用 e x 来进行循环计数JCXZ save; 考虑数组的元素个数为0 的情况LEASI, data+2; 用指针S I来访问整个数组again: CMP word ptr [SI], 0JL lowerJE equalINC AXJMP loopllower: INC BXJMPlooplEqual :INC DXloopl:ADD SI, 2LOOP againSave :MOV Positive, AX; 把各类的统计数保存到内存单元中MOVMOVNegative, BXZ ero, DXMOVAH, 4CHINT21HCODEENDSEND START使用Debug查看Positive、Negative和 Z ero三个变量的数据的方法,参照上面的方法就可以了。

实验三Windows环境下的汇编语言集成编程环境(基础与验证型)一、实验要求和目的1、熟练掌握Windows环境下汇编语言程序设计的基本方法和技能;2、Borland公司出品的汇编语言调试工具T D 的使用二、软硬件环境1、硬件环境:微机CPU 586以上,10GB以上硬盘,64M 以上内存;2、软件环境:Windows 9 8 以上和轻松汇编软件三、实验涉及的主要知识单元1、轻松汇编集成开发环境的介绍轻松汇编是个汇编语言的集成开发环境,主要面向汇编语言的初学者,提供了一个在Windows界面下的汇编语言开发环境,具有了一般的集成开发环境所提供的功能例如:原来需要烦琐的命令行才能完成的工作,现在只需要简单的鼠标单击就可以完成,而且复杂的参数也只要进行一下设置就可以了它会截获错误信息,并显示在错误窗口上,只要点击一下错误信息,对应的错误行就会在编辑窗 口 突出显示出来O轻松汇编集成开发环境针对汇编语言的特殊性和汇编语言初学者的特殊性,提供了一些专门针对汇编语言和专门针对汇编语言初学者的功能例如:格式整理,当您写完一行程序,换行时,轻松汇编会自动先简单的检查该行语法,如无错误则整理该行的格式,使您的汇编程序格式整齐,具有如同艺术品i样的建筑美。

在集成环境里,具有交叉文件和映像文件的自动读入功能,使初学者阅读交叉文件和映像文件更方便,有利于初学者养成良好的编程习惯和加深对汇编语言、机器语言的理解目前主流的汇编语言编译器有Microsoft的 MASM和 Borland的 TASM ,这两种编译器基本上是兼容的,有区别,但是很小,可以忽略不计,完全不影响两者都是D os平台的汇编工具,互相是兼容的,在 MASM下写成的程序一般不加修改就可以在TASM下编译通过,而 TASM下的部分程序,也可以在MASM卜编译通过但是TASM的调试工具T D 比 MASM的调试工具CV 要好用的多,所以在轻松汇编中选用了 TASM轻松汇编调用的是TASM 5 .0作为内核编译汇编程序的,错误信息也是通过TASM 5.0来截获的MASM对语法的要求比TASM的要严格一点,一是C ”在 MASM中是个保留字而在TASM中不是;二是定义子程序的时候,MASM要求在ENDP指令前面要写上子程序的名字,而 TASM不要求,但 TASM不允许一些英文单词不能作为变量名和标号名1) TASM的格式TASM [ 参数] [ 汇编文件名] [ , 目标文件名] [ , 交叉文件名] [ , XREF文件名]其中:参数是要TASM编译用的参数,如/ l a 等,具体含义见下面的解释汇编文件名是要编译的文件名目标文件名、交叉文件名、XREF文件名是要生成的此类文件的文件名例如:TASM /1 /zi c:\word. asm, c:\word. obj, c:\word. 1st, c: \word. xef作用是编译在C:\Word. asm ,生成目标文件、交叉文件、XRef文件 其中的交叉文件名和目标文件名,X R E F 文件名是可以省略的。

2 ) T A S M 的参数/zi生成全部调试信息/zd生成部分调试信息/la生成详细交叉文件/ I 生成简略交叉文件用到的主要就是上面的四个了,调试信息是一些在可执行文件中的附加信息,包含在编译完成的机器指令中,C P U 执行的时候会忽略这些附加信息,但是在用T D 调试的时候,可以通过这些附加信息,找到机器指令在原代码中对应的部分,从而实现原代码形式的调试生成调试信息会使可执行文件变的很大,所以在发布一个应用程序的时候,最好不要生成调试信息而且在C o m 文件中,调试信息是不能附加进去的交叉文件是编译的结果机器指令和对应的原代码之间的对应关系列表,详细的交叉文件还有宏扩展、变量定义、子程序定义等等其他信息的列表学会阅读交叉文件对学习汇编语言很有好处交叉文件也叫列表文件 2 ) T L i n k 的格式T L i n k [ 参数] 目标文件文件名[ , 可执行文件名] [ , 映像文件名]例如:T l i n k /m c : \ w o r d . o b j , c : \ w o r d . c o m , c : \ w o r d . m a p是把c : \ w o r d . o b j 编译成C : \ w o r d . e x e , 并且生成映像文件c : \ w o r d . m a p其中可执行文件名和映像文件名可以省略。

4 ) T L i n k 的参数/ v把调试信息链接到可执行文件中/ t用细小模式,生成c o m 文件/ m生成映像文件主要要用到的也就是上面的三个,其中的/ v 的含义是:当T A SM 用/z i 或/z d 生成了调试信息,还要在L i n k 中使用这个参数,才可以最终把调试信息编译到可执行文件中,实现原代码形式的调试使用人要注意使用该参数时,只能有•个代码段,否则会报错,链接失败映像文件是可执行文件的一些信息,分析映像文件可以分析程序的性能2 、T u r b o D e b u g g e r 调试工具的介绍T D ( T u r b o D e b u g g e r ) 是美国B o r l a n d 公司的经典产品B C 3 . 1 中包含了一个重要的应用程序调试工具,可以实现原代码级的调试应用程序调试工具就是让应用程序在调试工具软件TD的监控下运行,从而让程序设计者能即时了解应用程序,在运行过程中的状态或结果,这些结果或状态包括CPU的寄存器、存储器、程序变量和I /O 端口状态T D 是一个多窗口调试工具,其中的一个窗口为源代码,另外一个窗口可以随着程序运行同步显示相关的信息,用户可设定显示内容。

窗口的上部为下拉菜单,每个菜单名的第一个字母为红色,为关键字,打开下拉菜单操作为A l t + 〈 关键字〉 关闭操作则总是按< ESC> 键主界面的下部为常用的调试功能快捷键,也是以红色标注最常用的下拉菜单是Vi e w , 按A l t + V弹出Vi e w 菜单如图1 . 2 : 一 「 ■】= M o d u l© : HE# 1 n u lu d e < sn d u d e < c济 彳 n c lu d e < t#5 n cT u d e ech>:m- Fb;£en -kt点rr:ric?u七erfrzsnc<9pi>ur-nr *t1r2 >ac l究需o p e n a. b r e a k p o i n x s w i ndow图[2 TD的View下拉菜单View菜单主要用于选择各种显示窗口,以观察所需信息菜单中每一选择行中的红色字母为快捷键。

最常用的为CPU和Dump窗口,CPU窗口用于观察对应的汇编指令,CPU的寄存器内容,操作I/O端口,而Dump窗口主要用于查看存储器中的数据直接按红色的快捷键字母,就可打开相应窗口,如按〈 C> 键打开CPU窗口,如图1.3所示CPU窗口由若干子窗口组成,包括汇编、CPU、 Registers, C PU Flag、堆栈和Dump窗口通过< Tab>键可循环激活各个子窗口特别的在汇编窗口还可进行I/O 端口的读写三 Fl le E d it view Run BreaKpoints Dat:a options window Haip^include#inc1ude^include^includeu le: HELLO F ile: HELLO.CPP 6

按 Alt+F3则关闭当前激活窗口可反复使用这些快捷键来熟悉TD窗口的界面操作假设我们调试abc.asm,在命令行下,编译、链接生成可执行文件,然后得到了可执行文件abc.exe在命令行键入:td abc.exe,就进入了 td 的调试界面,或直接键入t d , 这样进入td 后要在File菜单中再打开 abc.exe 然后在view菜单中选取CPU项,此时的活动窗口分成五个部分,左上面的大窗口是abc.exe的机器指令和汇编指令的对应,也就是代码段,有 个右箭头指向着abc.exe的第•条指令;左下面的窗口是数据段;右面三个小窗口分别是寄存器窗口,显示寄存器数据;状态字窗口,显示状态字的状态;堆栈段窗口,显示堆栈中的信息按 F 9 是执行,在执行完毕,如果没有发生执行阶段的错误,如被零除等,就会有一个弹出窗口显示"Termined, exite code O", F7和 F8是单步执行,F7可以进入到被调用函数的内部,而 F8不能Alt+F5可以看到运行结果在屏幕上的输出如果你在编译和链接时使用了/z i和/v 参数,那么可以在View菜单中选Module项,或按F 3 ,显示汇编原代码调试,用法和上面的一样。

这时候的感觉就和T C 或 T P 一样但是如果没有用/z i和/ v , 会收到报错信息“ Program has no symbol table.”其他的调试工具还有Microsoft的 cv和最原始的debug,功能上和T d 各有千秋,但是要说易用性,还是Td最好四、实验内容与步骤1、实验内容编写程序,判断一个年份是否是闰年2、实验步骤(1)输入一个汇编程序源程序程序见本章实验一 2 ) 编译、运行一个汇编程序把刚才写的那个汇编程序编译、运行- •下,熟悉操作单击:运行- 生成目标文件,轻松汇编就会自动生成目标文件,另外,根据您的设定,还会生成其他的文件默认是生成交叉文件和映像文件,点击右上角的按钮就可以看到这两个文件如果有语法错误,编译会失败,错误信息会显示在下面的窗口中,点击错误信息,错误行就会突出显示出来单击:运行- 运行,轻松汇编就会自动完成编译、链接、运行当前程序在程序运行时是全屏方式,结束后变成窗口方式,不会退出单击:运行一调试,轻松汇编就会自动完成编译、链接、调试的工作,使用的是TD 作为调试工具 3 ) 练习对轻松汇编进行个人设置,让它更符合您的习惯在轻松汇编中根据初学者的特点,提供了很有特色的功能,如果您不喜欢的话,可以关掉它,对于运行的参数,同样也是通过设置来改变的。

在设置窗体中进行如下设置:格式设定:在这里的下拉框中有三个选项,全部大写、全部小写和不处理,选定后的结果分别是在进行格式处理时对格式化结果的处理自动整理格式:选定后在换行的时候会对原来行进行格式整理,如果没有选定就不整理格式采用调试模式:选定后在编译时包括参数/ z i , 在链接时包括参数/ v , 这样生成的可执行文件比较大,包含了用TD调试时所需要的信息,可以实现源代码调试;如不选定,不能实现源代码调试,在调试的时候不太方便推荐选定该选项编译生成Com文件:选定该选项后在链接时包括参数/ t , 如果你写的是一个com文件的汇编代码,那么就可以选定以生成一个com后缀的文件 在选定该选项后调试时不能实现源代码调试, 所以最好在编写、调试的时候不选定,最后调试通过后再选定该选项生成com文件如果不选定,即使是com文件的汇编代码也是可以编译通过,只不过生成的是一个exe文件推荐不选定 自定义参数:就是自己提供TASM和 TLink的参数了,如果你对TASM 了解比较多,可以实现其他的参数功能,但是对于一般的学习者,并不需要自定义参数,以免造成程序运行时出问题程序格式:在这里控制格式整理的方式,您可以自己设置后看看效果。

不过推荐用默认方式显示导航栏:选中后显示导航栏,否则不显示显示错误栏:选中后显示错误栏,否则不显示推荐选中,因为不选中的话,有错误它也不会自动显示的4) Turbo Debugger调试工具的使用轻松汇编集成开发环境下单击“ 运行”菜单选“ 调试”功能就进入TD另外通过下述程序段的输入和执行来学习T D 软件的使用,通过显示器屏幕观察程序的执行情况MOVBLJ5HMOV CL,BLMOV AX,0ABCDHMOV BX,AXMOV DS:[0025H].BX操作步骤如下:① 启 动 TD② 使 CPU窗口为当前窗口③输入程序段利 用 t 、I 方向键移动光条来确定输入位置,然后从光条所在的地址处开始输入,建议把光条移动到CS:0100H处开始输入程序在光条处直接键入程序段指令, 键入时屏幕上会弹出一个输入窗口, 这个窗口就是指令的临时编辑窗口每输入完一条指令,按 Enter键,输入的指令即可出现在光条处,同时光条自动下移一行,以便输入下一条指令窗口中前面曾经输入过的指令可以重复使用, 只要用方向键把光标定位到所需的指令处, 按回车键即可④执行程序段方法一:使用单步执行的方法执行程序段使 IP 指向程序段的开始处,方法是:把光条移动到程序段开始的第一条指令处,按 Alt+FlO键,弹出CPU窗口的局部菜单,选 择 “NEW CS: IP” 项,按 Enter键,这时C S和 IP 寄存器( 在CPU窗口中用符号表示,“ ▼”符号指向的指令就是当前要执行的指令) 就指向了当前光条所在的指令。

直接修改IP 的内容为程序段第一条指令的偏移地址:用 F 7或 者 F 8 单步执行程序段每按一次F7或者F8键,就执行一条指令按 F 7或 者 F8键直到程序段的所以指令都执行完为止,这时光条停在程序段最后一条指令F7或者F8键的区别是:如果执行的指令是CALL指令,F7会单步执行进入到子程序中,而 F 8则会把子程序执行完,然后停在CALL指令的下一条指令处方法二:用设置断点的方法执行程序段把光条移动到程序段最后一条指令的下一行,按 F2键设置断点使用方法一•中的方法使IP 寄存器指向程序段的开始处按 F4或者F9键运行程序段,CPU从 IP 指针开始执行到断点位置停止⑤检查各寄存器和存储单元的内容寄存器窗口显示在CPU 窗口的右边,寄存器窗口中直接显示了各寄存器的名字及其当前内容在单步执行程序时可以随时观察寄存器内容的变化存储器窗口显示在CPU窗口的下部,若要检查存储器单元的内容,可连续按下Tab键使存储器窗口为当前窗口,然后按Alt+FlO键,弹出局部菜单选 择 GOTO项,然后输入要查看的存储单元的地址,如DS:25H,存储器窗口就会从该地址处开始显示存储区域的内容每行显示8 个字节的内容。

五、实验要求与提示1、实验要求( 1 ) 掌握Windows环境下汇编语言程序设计上机过程;( 2 ) 回答思考问题;( 3 ) 记录实验结果2、实验提示在本实验教程中后面的程序例题中,选一些程序输入到轻松汇编集成开发环境中熟悉该软件的使用六、思考与练习以及测评标准( 1)小结Turbo Debugger的使用方法;(2 )在轻松汇编窗口集成开发环境中如何显示或者关闭导航栏和错误栏?( 3 ) 在轻松汇编窗口集成开发环境中交叉文件和映像文件的作用是什么?七、DEBUG应用举例1. 非物理o 磁道坏软盘的修复此种损坏从软盘盘面上来看并没有明显的划伤和霉变 一般可以恢复其数据, 也可是软盘重新在利用处理方法如下:I .进入 debugII .取一张引导区没有损坏的好磁盘, 插入软驱-L 100 0 0 1III . 插入损坏的磁盘到软驱-W 100 0 0 1-Q注意:好盘与坏盘容量必须相同2 .物理0 磁道坏软盘中的数据读取对于 磁道损坏的磁盘,一般来说是应该抛弃了,当你也不妨试一试已下方法:磁化处理 用较强的磁铁在靠近坏磁盘的表面处反复移动,切不可碰到磁盘介质,以免划伤表面,然后在试试格式化。

软盘换面 小心的将磁盘打开,坚磁片与金属芯片分开,方面后再按原来的方法粘在一起即可,在重新格式化Diskfix 对 于 d isk fix 想必大家都用的比较多了,里面的磁盘修复功能很好用的能修复大多数磁盘表面错误3 .硬盘启动失败处理在正常机上格式化一张软盘,无其它数据进入debug- L 0 2 0 1- W 0 0 0 1- Q用系统盘启动故障机后在进入debug - L 0 0 0 1- w 0 2 0 1- Q4 .软盘不能正确读取解决方法如果使用软盘时出现如下提示G e n e r a l f a i l u r e e r r o r r e a d i n g d r i v e A可以用以下方法解决:将一张好盘插入软驱进入d e b u g- A 1 0 0* * * * : * i o o M O V* * * * : * * * * M O V* * * * , * * * * M O V* * * * * * * * * M O V* * * * : * * * * iNTA L , 0C X , 1D X , 0B X , 1 0 0 02 5* * * * : * * * * i N T回车2 0- G = 0 1 0 0插入坏盘并进入D e b u g- A 2 0 0* * * * : * 1 0 0 M O V* * * * , * * * * M O V* * * * : * * * * M O V* * * * , * * * * M O V* * * * : * * * * I N TA L , 1C X , 1D X , 0B X , 1 0 0 02 6* * * * : * * * * INT回车2 0- G = 2 0 05 . C M O S数据的保存,恢复C M O S R A M的‘ 地址口’ 的口地址为7 0 H‘ 数据口’ 的口地址为7 1 H读取时只需将读的C M O S R A M的地址送到7 0 H ,随后就可以从7 1 H中得到所需数据。

读取C M O S数据 进入D e b u g- A 1 0 0* * * * : * 1 0 0 M O V B X , 1 0 0 0* * * * : * * * * M O V C X , 0 0 4 0* * * * : * * * * M O V A X , 0 0 0 0* * * * : 0 1 0 9 M O V D X , C X* * * * : ****M O V C X , 0 0 0 5* * * * : 0 1 0 E L O O P 0 1 0 E* * * * : * * * * O U T 7 0 , A L* * * * : * * * * M O V C X , 0 0 0 5* * * * : 0 1 1 5 L O O P 0 1 1 5* * * * : **** IN A L , 7 1* * * * : * * * * M O V [ B X ] , A L* * * * : * * * * C M P A H , 0 E * * * * : **** JB 0 1 2 3* * * * : * * * * A D D A H , 8 0* * * * : 0 1 2 3 I N C A H* * * * : * * * * I N C B X* * * * : * * * * M O V C X , D X* * * * : * * * * M O V A L , A H* * * * : * * * * L O O P 0 1 0 9* * * * : * * * * M O V A H , 3 C* * * * : * * * * M O V D X , 0 1 5 0* * * * : * * * * M O V C X , 0 0 2 0* * * * : * * * * [ N T 2 1* * * * : * * * * M O V B X , A X* * * * : * * * * M O V D X , 1 0 0 0* * * * : * * * * M O V C X , 0 0 4 0* * * * : * * * * M O V A H , 4 0* * * * : * * * * I N T 2 1* * * * : * * * * M O V A H , 4 C* * * * : * * * * i N T 2 1- A 1 5 0* * * * : 0 1 5 0 D B " C M O S . D A T , 0* * * * : 0 1 5 9- R C XC X 0 0 0 0:6 0- N S A V E C M O S . C O M-W- w 1 0 0 2 0 1_Q恢复C M O S数据 进入D e b u g- A 1 0 0* * * * : * 1 0 0 M O V C X , 0 1 5 0* * * * : * * * * M O V A l l , 3 D* * * * : * * * * M O V A L , 0 0* * * * : * * * * i N T 2 1* * * * : * * * * M O V D X , 1 0 0 0* * * * : * * * * M O V B X , A X* * * * : * * * * M O V C X , 0 0 4 0* * * * : * * * * M O V A H , 3 F* * * * : * * * * i N T 2 1* * * * : * * * * M O V A X , 0 0 0 0* * * * : * * * * M O V B X , D X* * * * : * * * * M O V D X , C X* * * * : * * * * M O V C X , 0 0 0 5* * * * : * * * * L O O P 0 1 1 F* * * * : * * * * M O V A L , A H * * * * : * * * * O U T 7 0 , A L* * * * : * * * * M O V C X , 0 0 0 5* * * * : * * * * L O O P 0 1 2 8* * * * : * * * * M O V A L , [ B X ]* * * * : * * * * O U T 7 1 , A L* * * * : * * * * J B 0 1 3 6A D D A H , 8 0****. ****I N C A H****. ****I N C B X****. ****M O V C X , D X****. ****L O O P 0 1 1 A***** * * * M O V A X , 0 0 4 0* * * * : * * * * M O V D S , A X****. ****M O V A X , 1 2 3 4***** * * * M O V [ 0 0 7 2 ] , A X* * * * : * * * * J M P F F F F : O O O O- A 1 5 0* * * * : 0 1 5 0 D B " C M O S . D A T , 0* * * * : 0 1 5 9- R C XC X 0 0 0 0:6 0- N W R I T E C M O S . C O M- W- Q6 . DOS引导扇区数据的保存与恢复D O S引导程序是被读到内存0 0 0 0 : 7 C 0 0初开始执行的获得正常的引导程序进入D e b u g- L 1 0 0 2 0 1- N A : D O S B O O T . C O M- R C X:2 0 0- W装入引导程序进入D e b u g- N A : D O S B O O T . C O M- L- R C X:2 0 0- w 1 0 0 2 0 1- Q7 .硬盘主引导扇区数据的保存与恢复硬盘工作正常时读取主引导扇区信息注意:当分区改变时不能用此数据恢复 保存主引导扇区数据进入D e b u g- A 1 0 0M O V A X , 0 2 0 1M O V B X , 0 1 1 0M O V C X , 0 0 0 1M O V D X , 0 0 8 0I N T 1 3I N T 3- G = 1 0 0- E 1 0 2 3- E 1 0 E C 3- R B XB X 0 1 1 0: 0- R C XC X 0 0 0 1: 2 1 0- N A : R B O O T . C O M- W- Q恢复主引导扇区数据:只需运行A盘的R B O O T . C O M8 . 硬盘非分配表备份与恢复计算机运行正常时分配表备份进入D e b u g- L 1 0 0 2 0 1- N A : D B R U P . D A T- R C X:2 0 0- W恢复进入D e b u g- N A : D B R U P . D A T- L- W 1 0 0 2 0 1_Q9 . 硬盘保护卡内幕对于经常在外边匕机的人来说,计算机维护人员一旦设置硬盘保护卡,自己作一些事来特别麻烦,想不想屏蔽掉硬盘保护卡,用以下方法或许可以借鉴:进入Deb ug- A 1 0 0MO V Al l , 0MO V DL , 0I NT 1 3- T一直按T知道 找 到 CS 二 F0 0 0 记下此时D S的 值 如 :1 2 3 4- E E0 : 4C 3 4 1 2 0 0 F0- Q10.用Deb uf作硬盘低级格式化硬盘低级格式化一般用D M ,但Deb ug也可以低级格式化硬盘进入Deb ug- A 1 0 0MO V AX, 50 0MO V BX, 1 80MO V CX, 0MO V DX, 80I NT 1 3I NT 3- E 1 80 0 0 0 2- Q1 1 .冷启动与热启动用Deb ug实现系统冷启动与热启动程序冷启动:- A 1 0 0J MP FFFF:OI NT 2 0- N A:R ES ET . CO M- R CX:0 0 0 7热启动:- A 1 0 0MO V AX, 0 0 40MO V DS , AXMO V AX, 1 2 3 4MO V S I , 0 0 72MO V ( S I ) , AXJ MP FFFF:O- N A:R S ET . CO M- R CX:0 0 1 4- W 第二章算术运算类操作实验知识提要:本章主要进行算术运算实验,涉及到的知识点包括:1 . 加减法处理指令主要有加法指令A D D ,带进位加法A D C ,减法指令S U B ,带进位减法指令SBB。

2 . BCD码的调整指令主要有压缩的BCD码加法调整指令DA A ,压缩的BCD码减法调整指令D A S,非压缩的BCD码加法调整指令A A A ,非压缩的BCD码减法调整指令AASo3 . 乘除法指令和符号位扩展指令主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令IDIV,以及符号位从字节扩展到字的指令CBW和从字扩展到双字的指令CWDo实验一 二进制加、减法编程实验( 设计性实验)一、实验要求和目的1 . 熟悉汇编语言二进制多字节加法基本指令的使用方法;2 . 熟悉汇编语言二进制多字节减法基本指令的使用方法;3 . 掌握汇编语言编程的一般结构二、软硬件环境1 . 硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG、LINK和 EDIT等应用程序三、实验涉及的主要知识单元1、二进制加法基本指令( 1) ADD指令格式:ADD DST, SRC该指令把源操作数( SRC)指向的数据与目的操作数( DST)相加后,将结果放到目的操作数( DST)中,所执行的操作:( DST) (( SRC) +( DST)SRC和 DST不能同时为存储器操作数和段寄存器,同时SRC和 DST的数据类型要匹配,要同是字节或字。

受影响的标志位有:OF, SF, Z F, AF, PF, CF (2) ADC指令格式:ADC DST, SRC所执行的操作:( DST)((SRC)+(DST)+CF 了解清楚进位是怎样加的该指令把两个操作数( SRC和 D S T )相加以后,再加上进位标志C F ,将结果放到目的操作数( DST)中受影响的标志位有:OF, SF, ZF, AF, PF, CF« ADC指令多用于多精度数据相加2、二进制减法基本指令(1) SUB指令格式:SUB DST, SRC所执行的操作:( DST)V (DST)-(SRC)该指令把源操作数(S R C )指向的数据与目的操作数( D S T )相减后,将结果放到目的操作数( DST)中,SRC和 DST不能同时为存储器操作数和段寄存器( ,同时SRC和 DST的数据类型要匹配,要同是字节或字受影响的标志位有:OF, SF, Z F, AF, PF, CF«(2) SBB指令格式:ADC DST, SRC(DST)«- (D ST)-(SRC)-C F 了解清楚进位是怎样减的该指令把两个操作数( SRC和 D S T )相减以后,再减去C F ,将结果放到目的操作数(D S T )中。

受影响的标志位有:OF, SF, Z F, AF, PF, CFSBB指令多用于多精度数据相加3、多精度数相加程序设计示例将两个双字长度的数分别相加并将结果存放在result中首先进行题目分析:(1)如何存放多精度数?多精度数的存放有两种方式, 高地址优先( 如1234H,5678H表示56781234H)和低地址优先( 如1234H,5678H表 示 12345678H),具体的存放方式由用户根据自己的习惯选择在这里虑我们使用了高地址优先的存储方式 2 ) 分析程序设计由于汇编语言的ADD, ADC, SUB, SBB指令都不支持两个操作数都是存储器操作数的情况,因此将■■个操作数的低字放到寄存器A X 中,高字放到寄存器D X 中分别完成高字部分的加法,高字部分的带进位加法 3 ) 具体程序设计DATA SEGMENTDATA1 DW 5311H,8A13H ;表示数据 8Al35311HDATA2 DW 4783H,9526H ;表示数据 95264783HRESULT DW 2 DUP(?) ; 存放多字节加法的结果DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AXMOV AX,DATA1MOV DX,DATAl+2ADD AX,DATA2 ;低字部分相加ADC DX,DATA2+2 ;高字部分带进位相加MOV RESULT 1,AX ;存放低字部分相加结果MOV RESULT 1+2,DX;存放高字部分相加结果CODE ENDSEND START四、实验内容与步骤1、实验内容( 1)编写程序,实现长度为2 字的两个多精度数相减。

2 ) 编写程序,实现一个长度为3 字的多精度数和一个长度为2 字的多精度数相加减2、实验步骤( 1 ) 预习多精度数加减法基本知识,根据实验内容,画出流程图;( 2 ) 利用EDIT或其他编辑软件,编写汇编源程序,取名为“ch2exl.ASM"、“ch2ex2.ASM” 3 ) 汇编、连接该源程序, 产生“ch2exl.EXE"、“ch2ex2.EXE” 文件;( 4 ) 对 “ch2exl.EXE"和 "ch2ex2.EXE” 文件进行调试运行:利用DEBUG的 T 命令或G 命令和D 命令查看数据区的加减法结果是否正确五、实验要求与提示1、 实验要求( 1 ) 画出各程序流程图;( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果六、思考与练习以及测评标准在例子中没有考虑最高位溢出的问题,若考虑到最高位可能发生溢出,该如何修改程序.实验二十进制数的BCD加、减法编程实验一、实验要求和目的 1 .熟悉B C D 码的基本知识2 .熟悉汇编语言BCD码多字节加减法基本指令的使用方法;3 .掌 握 B C D 码调整指令的使用方法二、软硬件环境1 .硬件环境:微机C P U 4 8 6 以上,5 0 0 M B 以上硬盘,3 2 M 以上内存;2 .软件环境:装有M A S M 5 . 0 、D EB UG . L I N K 和 ED I T等应用程序。

三、实验涉及的主要单元知识1 、B C D 码的介绍B C D 码是一种用二进制编码的十进制数,又称二一十进制数它是用4位二进制数表示一个十进制数码的,由于这4位二进制数的权为8 4 2 1 , 所以BCD码又称8 4 2 1 码在 I B M P C 机中,表示十进制的B C D码可以用压缩的B C D 码和非压缩的BCD码两种格式表示 1 ) 压缩的BCD码压缩的B C D 码用4 位二进制数表示一个十进制数位, 整个十进制数形式为一个顺序的以4 位为一组的数串 2 ) 非压缩的BCD码非压缩的BCD码则以8 位二进制数表示一个十进制数位,8 位中的低4 位表示8 4 2 1 的 BCD码,而高4 位则没有意义2 、B C D 码的调整指令( 1 ) 压缩的B C D 码调整指令DAA加法的十进制调整指令该指令把A L 中的和调整到压缩的B C D 格式,这条指令之前必须执行A D D 或 A D C 指令,加法指令必须把两个压缩的B C D 码相加,并把结果存放在A L 寄存器中功能:如果A L 寄存器中低4位大于9或辅助进位( A F ) = 1 , 则 ( A L ) = ( A L ) +6 且 ( A F ) = 1 ;如果( A L ) > = 0 A 0 H 或 ( C F ) = 1 , 则 ( A L ) = ( A L ) +6 0 H 且 ( C F ) = 1 。

同时,S F 、Z F 、P F 均有影响比如:M O V A L , 6 8H ; ( A L ) = 6 8H ,表示压缩 B C D 码 6 8M O V B L , 2 8H ; ( B L ) = 2 8H ,表示压缩 B C D 码 2 8A D D A L , B L ;二进制加法:( A L ) = 6 8H +2 8H = 9 0 HD A A ;十进制调整:( A L ) = 9 6 H;实现压缩B C D 码加法:6 8+2 8= 9 6DAS减法的十进制调整指令该指令把A L 中的差调整到压缩的B C D 格式,这条指令之前必须执行S U B 或 S B B 指令,减法指令必须把两个B C D 码相减,并把结果存放在A L 寄存器中功能: 如果( A F ) = 1 或 A L 寄存器中低4 位大于9 ,则 ( A 功 = ( A L ) - 6 且 ( A F ) = 1 ; " 瞟 ( A L ) > = O A O H或 ( C F ) = 1 , 则 ( A L ) = ( A L ) 一6 0 H 且 ( C F ) = 1 。

同时 S F 、Z F 、P F 均受影响比如:M O V A L , 6 8HM O V B L , 2 8HS U B A L , B LD A S;( A L ) = 6 8H ,表示压缩B C D 码 6 8;( B L ) = 2 8H ,表示压缩B C D 码 2 8;二进制减法:( A L ) = 6 8H - 2 8I I = 40 H;十进制调整: ( A L ) = 40 1 1 ;实现压缩B C D码减法:6 8—2 8= 40( 2 )非压缩的B C D码调整指令AAA加法的A S C I I调整指令执行的操作:( A L )一把A L中的和调整到非压缩的B C D格式( A H ) - ( A H ) +调整产生的进位值这条指令之前必须执行A D D或A D C指令,加法指令必须把两个非压缩的B C D码相加,并把结果存放在A L寄存器中.功能:如果A L的低4位大于9或( A F ) = 1 ,贝I J :( A L ) = ( A L ) +6( A H ) = ( A H ) +1( A F ) = ( C F ) = 1且A L高4位清零。

否则:( C F ) = ( A F ) = 0A L高4位清零A A S减法的A S C I I调整指令执行的操作:( A L )一把A L中的差调整到非压缩的B C D格式( A H ) - ( A H ) +调整产生的借位值这条指令之前必须执行S U B或S B B指令,减法指令必须把两个非压缩的B C D码相减,并把结果存放在A L寄存器中功能:如果A L的低4位大于9或( A F ) = 1 ,贝U :( A L ) = ( A L ) - 6( A H ) = ( A H ) - 1( A F ) = ( C F ) = 1A L高4位清零否则:( C F ) = ( A F ) = 0A L高4位清零其他标志位O F、P F、S F、Z F不确定A A M乘法的非压缩B C D码调整指令语句格式:A A M功能:被调整的乘积在A X中,对A L按1 0取模,则:( A L ) / O A H - A H ( 商) :A L ( 余数)其中A H为商,A L为余数,标志位A F、C F、O F、P F、S F、Z F受影响A A D除法的非压缩B C D码调整指令语句格式:A A D功能:除法运算前,先调整被除数A X内容,使:( A L ) = ( A L ) + ( A I D * O A H( A H ) = 0即把非压缩型十进制数变成二进制数。

3、多精度B C D码相加程序示例分别计算长度为2字节的压缩B C D码和非压缩的B C D码的相加首先分析程序: ( 1 ) 分析程序设计这里我们仍然采用高地址优先的方式来存放多精度数,高位相加的时候采用带进位相加只是由于B C D 码的加法是十进制数相加,所以每次相加之后都要进行调整压缩的B C D 码加法采用指令D A A 进行调整,非压缩的B C D 码采用指令A A A 进行调整 2 ) 具体程序设计D A T A S E G M E NTB C D 1 D B 3 4H , 1 8H ; 压缩的B C D 码表示十进制数1 83 4B C D 2 D B 89 1 1 ,2 7 1 1 ; 压缩的B C D 码表示十进制数2 7 89R E S U L T 1 D B 2 D U P ( ? ) ; 存放压缩的B C D 码相加的结果B C D 3 D B 0 5 H , 0 2 H ; 非压缩的B C D 码表示十进制数2 5B C D 4 D B 0 8H , 0 3 H ; 非压缩的B C D 码表示十进制数3 8R E S U L T 2 D B 2 D U P ( ? ) ; 存放非压缩的B C D 码相加的结果D A T A E ND SC O D E S E G M E NTA S S U M E C S : C O D E , D S : D A T AS T A R T :M O V A X , D A T AM O V D S , A X; 压缩的B C D 码相加计算M O V A L , B C D 1A D D A L , B C D 2D A AM O V R E S U L T 1 , A LM O V A L , B C D 1 +1A D C A L , B C D 2 +1D A AM O V R E S U L T +1 ,A L; 非压缩的B C D 码相加计算M O V A L , B C D 1A D D A L , B C D 2A A AM O V R E S U L T 2 , A LM O V A L , B C D 1 +1A D C A L , B C D 2 +1A A AM O V R E S U L T +1 ,A LC O D E E ND SE ND S T A R T四、实验内容和步骤1 、实验内容( 1 ) 编写程序,实现长度为2 字节的缩与非压缩的BCD码相减。

2 ) 编写程序,实现一个长度为3 字节2字节的压缩与非压缩的BCD码相减 2、实验步骤( 1 ) 预习BCD码相加减的基本知识,根据实验内容,画出流程图:( 2 ) 利用EDIT或其他编辑软件,编写汇编源程序,取名为“ch2ex3.ASM"、“ch2ex4.ASM” ;( 3 ) 汇编、连接该源程序,产 生 “ch2ex3.EXE"、“ch2ex4.EXE” 文件;( 4 ) 对 “ch2ex3.EXE” 和 “ch2ex4.EXE” 文件进行调试运行:利 用 DEBUG的 T 命令或G 命令和D命令查看数据区的相减结果是否正确五、实验要求( 1 ) 画出各程序流程图;( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果六、思考与练习以及测评标准在例子中没有考虑最高位溢出的问题,若考虑到最高位可能发生溢出,该如何修改程序实验三二进制乘、除法编程实验( 设计性实验)一、实验要求和目的1 . 熟悉数据的补码表示 2 .熟悉无符号数和有符号数乘法和除法指令的使用;3 .掌握符号位扩展指令的使用二、软硬件环境1 .硬件环境:微机CPU 4 8 6以 匕 5 0 0 M B 以上硬盘,3 2 M 以上内存;2 .软件环境:装有M A S M 5 . 0 、D E B U G 、L IN K 和 E D IT等应用程序。

三、实验涉及的主要单元知识1、数的补码表示MU L指令和I M U L 指令的使用条件是由数的格式决定的 很明显( 1111111 l b ) * ( l 1111111b ) 当把它看作无符号数时应为2 5 5 d X2 5 5 d = 65 02 5 d , 而把它看作带符号数时则为( T) X ( - 1) = 1因此必须根据所要相乘数的格式来决定选用哪一种指令乘法指令对除C F 和 0 F 以外的条件码位无定义( 注意无定义和不影响的区别,无定义是字指指令执行后这些条件码位的状态不稳定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变 )2 、乘法指令介绍( 1) MU L无符号数乘法指令格式:M U L SR C执行的操作:字节操作数:( AX) 一( AL ) * ( SR C)字操作数:( D X, AX) - ( AX) * ( SR C)( 两个8的数相乘得到16位的乘积存到AX 4 , )( 两个16数相乘得到3 2 乘积存高16位存放D X 中,低 16位存放在A X 中)( 2 ) I M U L 带符号乘法指令格式:IM UL SR C执行的操作:与 MU L相同,但必须是带符号数,而 MU L是无符号数。

3 、除法指令介绍( 1) D I V 无符号数除法指令格式:D IV SR C执行的操作:字节操作:16位被除数在A X 中,8 位除数位源操作数,结果的8 位商在A L中,8 位余数在A H 中表不为:( AL ) - ( AX) / ( SR C) 的商( AH) - ( AX) / ( SR C) 的余数字操作:3 2 位被除数在D X, A X 中,其 中 D X 为高位字;16位除数为源操作数,结果的16位商在AX中,16位余数在D X 中表示为:( AX) 一( D X, AX) / ( SR C) 的商( D X) - ( D X, AX) / ( SR C) 的余数商和余数均为无符号数 2 ) ID IV带符号数除法指令格式:ID IV SR C执行的操作:与 D 1 V 相同,但操作数必须是带符号数,商和余数叶均为带符号数,且余数的符号和被 除数的符号相同除法指令DIV和 IDIV虽然对标志的影响没有定义,但是却可能产生溢出 当被除数远大于除数时,所得的商就有可能超出它所能表达的范围如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0 的内部中断。

对 DIV指令,除数为0 , 或者在字节除时商超过8 位,或者在字除时商超过16位,则发生除法溢出对 1DIV指令,除数为0 , 或者在字节除时商不在T 2 8 1 2 7 范围内,或者在字除时商不在-32768— 32767范围内,则发生除法溢出4、符号扩展指令(1) CBW字节转换为字指令格式:CBW执行的操作:A L的内容符号扩展到AH2) CWD字转换为双字指令格式:CWD执行的操作:AX的内容符号扩展到DX5、无符号数除法程序设计示例被除数是一个3 字长的无符号数,除数是一个1字长的无符号数,求两数相除的商和余数 1 ) 分析程序被除数是多精度数,可以采用高地址优先的方法来存放,由于是无符号数, 将被除数最高字节放到AL后不需要符号位扩展,只要在AH中填0 就可以了最高字节所得的余数和后面的字节组合起来再除以除数,这个过程和我们手工计算除法是类似的 2 ) 具体程序设计DATA SEGMENTDIVIDEND DB 53H,11H,8AH;表示数据 8Ali53HDIVISOR DB 47HQUOTIENT DB 3 DUP(O);存放除法结果的商REMAINDERDB 0 ; 存放除法结果的余数DATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,DIVIDEND+2MOV AH,0DIV DIVISORMOV QUOTIENT+2,ALMOV AL,DIV1DEND+1DIV DIVISORMOVQUOTIENT+1,ALMOV AL,DIVIDENDDIV DIVISORMOV QUOTIENT,ALMOV REMAINDER.AHCODE ENDS END START四、实验内容和步骤1、实验的内容( 1 ) 被除数是一个3 字长的有符号数,除数是一个1字长的有符号数,求两个数相除的商和余数。

2 ) 求两个2 字长的无符号数相乘的结果,并将结果保存在存储空间中2、实验步骤(1)预习二进制乘、除法基本知识,根据实验内容,画出流程图;( 2 ) 利用EDIT或其他编辑软件,编写汇编源程序, 取名为“ch2ex5.ASM"、“ch2ex6.ASM” ;( 3 ) 汇编、连接该源程序, 产生“ch2ex5.EXE"、“ch2ex6.EXE” 文件;( 4 ) 对 “ch2ex5.EXE"和 "ch2ex6.EXE” 文件进行调试运行:利用DEBUG的 T 命令或G 命令和D 命令查看数据区的乘除法结果是否正确五、实验要求与提示1、实验要求( 1 ) 画出各程序流程图:( 2 ) 列出程序清单,加上适量注释;(3 ) 回答思考问题;(4 ) 记录实验结果2、实验提示( 1 ) 练 习 (1 ) 的有符号除法在最高字节需要用到符号位扩展2 ) 练 习 (2 ) 的乘法可仿造手工的乘法过程,可用存储器变量保存中间相乘的结果,并注意在高字节相加时要采用带进位相加六、思考与练习以及测评标准若 练 习 (2 ) 中是有符号数相乘,又该如何编写程序? 七、参考程序******ch2exl JY I* ****** *DATASEGMENTDATA1DW5311H,8A13HDATA2DW4783H,9526HRESULTDW2 D U P ( ? ) ; 存放多字减法的结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,DATAl+2MOVDX,DATA1SUBAX,DATA2+2SBBDX,DATA2MOVRESULT+2,AXMOVRESULT,DXCODEENDSENDSTARTDATASEGMENTDATA1DW 7123H,7311H,8Al 3H ; 表示数据 8al73117123hDATA2DW 9783H,9526H ; 表示数据 95269783hRESULT 1DW 3 D U P ( ? ) ; 存放多字节加法的结果RESULT2DW 3 D U P ( ? ) ; 存放多字节减法的结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,DATA1MOVDX,DATAl+2ADDAX,DATA2ADCDX,DATA2+2MOVRESUET1,AXMOVRESULT 1+2,DXMOVDX,DATAl+4ADCDX,0 MOVRESULT 1+4,DXMOVAX,DATA1MOVDX,DATAl+2SUBAX,DATA2SBBDX,DATA2+2MOVRESULT2,AXMOVRESULT2+2,DXMOVDX,DATAl+4SBBDX,0MOVRESULT2+4,DXCODE ENDSEND START*******ch2ex3 asrn********DATASEGMENTBCD1DB34H,18H; 压缩的BCD码表示十进制数1834BCD2DB89H,27H; 压缩的BCD码表示十进制数2789RESULT 1DB2 DUP(?); 存放压缩的BCD码相减的结果BCD3DB05H,02H; 非压缩的BCD码表示十进制数25BCD4DB08H,03H; 非压缩的BCD码表示十进制数38RESULT2DB2 DUP(?); 存放非压缩的BCD码相减的结果DATAENDSCODE SEGMENTASSUME CS :CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX; 压缩的BCD码相减计算MOVSUBDASMOVMOVSBBDASMOVAL,BCD 1AL,BCD2RESULT 1, ALAL.BCD1+1AL,BCD2+1RESULT+1,AL; 非压缩的BCD码相减计算MOVSUBAASMOVMOVSBBAASAL,BCD 1AL,BCD2RESULT2,ALAL,BCD 1+1AL,BCD 2+1 MOVRESULT+LALCODE ENDSENDSTART*******ch2ex4 asrn********DATASEGMENTBCD1DB34H,58H,27H ;压缩的BCD码表示十进制数275834BCD2DB89H,27H; 压缩的BCD码表示十进制数2789RESULT 1DB3 DUP(?); 存放压缩的BCD码相加的结果RESULT2DB3 DUP(?); 存放压缩的BCD码相减的结果BCD3DB05H,06H,08H ; 非压缩的BCD码表示十进制数65BCD4DB08H,03H; 非压缩的BCD码表示十进制数38RESULT3DB3 DUP(?); 存放非压缩的BCD码相加的结果RESUET4DB3 DUP(?); 存放非压缩的BCD码相减的结果DATAENDSCODE SEGMENTASSUMESTART:MOVMOV; 压缩的BCD码相加计算MOVADDDAAMOVMOVADCDAAMOVMOVADCDAAMOV; 压缩的BCD码相减计算MOVSUBDASMOVMOVSBBDASMOVMOVSBBCS:CODE,DS:DATAAX,DATADS,AXAL,BCD 1AL,BCD2RESULT1,ALAL,BCD 1 + 1AL,BCD2+1RESULT1+1,ALAL,BCDl+2AL,0RESULT1+2,ALAL,BCD 1AL.BCD2RESULT2,ALAL,BCD 1 + 1AL,BCD2+1RESUET2+LALAL,BCDl+2AL,0 DASMOV RESULT2+2,AL诽压缩的BCD码相加计算MOVAUBCD3ADDAL,BCD4AAAMOVRESULT3,ALMOVAL,BCD3+1ADCAL,BCD4+1AAAMOVRESULT3+1,ALMOVALBCD3+2ADCAL,0AAAMOVRESULT3+2,AL; 非压缩的BCD码相减计算MOVAUBCD3SUBAUBCD4AASMOVRESULT4,ALMOVAL,BCD3+1SBBAL,BCD4+1AASMOVRESULT4+LALMOVAL,BCD3+2SBBAL,0AASMOVRESULT4+2,ALCODE ENDSEND START*******ch2ex5 asrn********有符号数除法程序设计示例解释:被除数是一个3 字节长的有符号数,除数是一个1字节长的有符号数,例子:DATA ENDSDATASEGMENTIDIVIDENDDB53H,11H,8AH ; 表示数据 8A1153HIDIVISORDB47HQUOTIENTDB3DUP(0); 存放除法结果的商REMAINDERDB0; 存放除法结果的余数CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV ALJDIVIDEND+2CBWIDIV IDIVISORMOV QUOTIENT+2,ALMOV ALJDIVIDEND+lIDIV IDIVISORMOV QUOTIENT+1,ALMOV ALJDIVIDENDIDIV DIVISORMOV QUOTIENT,ALMOV REMAINDER,AHCODE ENDSEND START*******ch2ex6 asm****孝 * * 'DATA SEGMENTMULTIPLICAND DW 8567H,6214H ;表示数据 62148567hMULTIPLICATOR DW 5647H,8451H ; 表示数据 84515647hhPRODUCT DW4 D U P ( O ) ; 存放乘法结果的积DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,MULTIPLICANDMULMULTIPLICATORMOVPRODUCT,AXMOVPRODUCT+2,DXMOVAX,MULTIPLICANDMULMULTIPLICATOR+2ADDPRODUCT+2,AXADCPRODUCT+4,DXADCPRODUCT+6,0MOVAX,MULTIPLICAND+2MULMUETIPLICATORADDPRODUCT+2,AXADCPRODUCT+4,DXADCPRODUCT+6,0MOVAX,MULTIPLICAND+2MULMULTIPLICATOR+2 ADDADCCODE ENDSENDPRODUCT+4,AXPRODUCT+6,DXSTART 第三章逻辑运算、移位操作及数码转换编程实验知识提要:本章主要进行逻辑运算、移位操作及数码转换编程实验,涉及到的知识点包括:1 . 逻辑运算指令逻辑运算指令有:逻辑非指令N O T ,逻辑与指令A N D ,逻辑或指令O R ,逻辑异或指令X O R ,逻辑测试指令TEST。

2 . 移位操作指令移位操作指令主要有:算术左移指令SAL和算术右移指令S A R ,逻辑左移指令SHL和逻辑右移指令S H R ,循环移位指令其中,循环移位指令有四条:不带进位的循环左移指令R O L ,不带进位的循环右移指令R O R ,带进位的循环左移指令R C L ,带进位的循环右移指令RCR3 . ASCII码、二进制数和BCD码ASCII 是 American Standard Code for Information Interchange ( 美国标准信息交换码)的缩写,用来制订计算机中每个符号对应的代码,这也叫做计算机的内码( code) BCD码,Binary-Coded Decimalf,简称B C D ,称 BCD码或二- 十进制代码,亦称二进制码十进数实验一逻辑运算编程实验( 验证性实验)一、实验要求和目的1 . 了解汇编语言的逻辑运算指令;2 . 熟悉汇编语言中逻辑运算指令的使用方法;3 . 掌握利用汇编语言逻辑运算指令实现程序设计的方法二、软硬件环境1 . 硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG, LINK和 EDIT等应用程序。

三、实验涉及的主要知识单元1 . 逻辑非指令NOT 格式:N O T O P D操作形式:OPD-OPO描述:指令的功能是把操作数中的每位变反,即:1 - 0 , 0 - 1 将目的地址中的内容逐位取反后送入目的地址操作数不能用立即数,指令执行后对标志位无影响,也可用于求补举例:M O V A X , 1 2 3 4 H ; (A X ) =1 2 3 4 HN O T A X ; (A X ) =E D C B H2. 逻辑与指令A N D格式:AND目的操作数,源操作数操作形式:D O P D - D O P D A S O P D o描述:(1 )逻辑与运算法则为 1 A 1 =1 , 1 A O =O , 0 A l=0 , 0 A 0 =0 o( 2 ) 指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑乘运算操作,操作结果存入目的操作数中3 )受影响的标志位:C F、OF 为 0 , P F、S F 和 Z F 根据运算定, AF 无定义 4 )利用AND指令与0或 1 相与可对操作数的某些位进行屏蔽和保留操作举例:将 AL中第0 位和第7 位清零。

M O V A L , O FFHA N D A L , 7 E H3 . 逻辑或指令O R格式:OR目的操作数,源操作数操作形式:D O P D - D O P D V S O P D描述:(1 )逻辑或运算法则:1 V 1 =1 , 1 V O =1 , O V 1 =1 , 0 V 0 =0 o(2 )指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑加运算操作,操作结果存入目的操作数中3 )受影响的标志位:C F、OF 为 0 , P F、S F 利 Z F 根据运算定, AF 无定义4 )利用OR指令与1 或 0 相或,可对操作数置1 操作,和保留原位不变举例:将 AL中第0 位和第7 位 置 loM O V A L , 0O R A L , 8 1 H4 . 逻辑异或指令X O R格式:XOR目的操作数,源操作数操作形式:D O P D - D O P D ㊉S O P D描述:(1 )逻辑异或运算法则:1 ㊉ 1 =0 , 1 ㊉0 =1 , 0 © 1 =1 , 0 ㊉0 =0 (2 ) 指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“ 异或” 操作, 操作结果存入目的操作数中( 3 ) 受影响的标志位:CF、OF为 0, PF、SF和 ZF根据运算定, A F无定义。

4 ) 利用该指令与1 和 相异或,分别可以操作数对应位变反和保持不变5 ) 对操作数自身异或运算可对寄存器和CF、0F置 0举例:( 1 ) 将 A L中的0、7 位变反XOR AL, 81H( 2 ) 将 AX清零XOR AX, AX5 . 逻辑测试指令TEST格式:TEST目的操作数,源操作数操作形式:DOPDASOPDo描述:( 1 ) 该指令与指令AND的区别在于,两操作数相与后不保存结果2 )指令的功能是把源操作数的每位二进制与目的操作数中的相应二进制进行逻辑“ 与” 操作, 根据所得结果设置有关标志位,为随后的条件转移指令提供条件,由于不保存差值,所以不会改变指令中的操作数3 ) 受影响的标志位:CF、OF为 0, PF、SF和 ZF根据运算定, A F无定义举例:(1) TESTAX, 100B: B 表示二进制JNZ AA ;如果AX右数第三位为1, JNZ 将跳转到AA处 2 ) 测试寄存器是否为空TESTAX, AXJZ AA如果AX为零,则 Z F标志为1, JZ将跳转到AA处四、实验内容与步骤1、实验内容( 1 ) 用 A 命令编写程序片段,实现逻辑非,逻辑与,逻辑或,逻辑异或,逻辑测试运算;(2 ) 得到实际的结果,用 T 或 P 命令查看结果正确性。

3 ) 实验例子,逻辑非:NOT 14H逻辑与:32H AND 0FH逻辑或:32H OR 0FH逻辑异或:32H XOR 0FH( 4 ) 进行逻辑测试运算中,注意状态和标志位的变化,并记录2、实验步骤(1) 预习逻辑运算中的基本指令知识,根据实验内容,整理思路; ( 2 ) 利用在DEBUG调试中的A 命令输入对应程序片段;(3 ) 对写好的程序片段,利用DEBUG的 T、P命令或G 命令查看数据区,核对实验结果五、实验要求与提示1、实验要求(1 ) 写出实现每个逻辑运算的例子答案;(2 ) 记录具体实现逻辑运算例子的实验步骤;( 3 ) 回答思考问题:( 4 ) 记录实验结果2、实验提示(1) 进入DEBUG调试环境,用 A 命令输入程序片段如图3-1所示a1385:0100 nou ax,12341385:0103 not ax1385:0105图 3-1( 2 ) 图 3-1是实现的是逻辑非的运算验证然后,用 P 或 T 命令查看寄存器A X 内容的变化,如图3-2所示图 3-2-p=0100 2AX=1234 BX=0000CX=0000DX=0000SP=FFEEBP=000081=0000DI=0000DS=1385 ES=1385SS=1385CS=1385IP =0103NU UP EIPL HZ AC PO CV1385:0103 F7D0NOTAXAX=EDCB BX=0000CX=0000DX=0000SP=FFEEBP=000081=0000DI=0000DS=1385 ES=1385SS=1385CS=1385IP=0105NU UP EIPL NZ AC PO C¥1385:0105 0000ADEi [BX+SILALDS:0000=02-t= 0 1 0 0 2AX=1234 BX=0000CX=0000DX=0000SP=FFEEBP=0000S I =0000DI=0000DS=1385 ES=1385SS=1385CS=1385IP =0103NU UP EIPL NZ AC PO CV1385:0103 F7D0NOTAXAX=EDCB BX=0000CX=0000DX=0000SP=FFEEBP=0000S I =0000D I=0000DS=1385 ES=1385SS=1385CS=1385IP=0105NU UP EIPL NZ AC PO CV1385:0105 0000ADEi [BX+SILALDS:0000=02(3 ) 注意P或 T 命令的输入格式,(P=地 址 数 );其 中 “ 数”是指执行几条指令,如果不指定就只执行一条。

六、思考与练习以及测评标准1、对寄存器清0 , 有几种方式?怎样用逻辑运算命令来实现?2、逻辑测试命令前后,状态和标志有什么变化?为什么?3、检测•操作数与另一确定的操作数是否相等,用逻辑指令如何实现? 实验二 移位操作编程实验( 设计性实验)一、实验要求和目的1 . 了解汇编语言移位操作指令;2 . 熟悉汇编语言逻辑移位指令的使用方法;3 . 掌握利用汇编语言逻辑移位运算指令实现程序设计的方法二、软硬件环境1 . 硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG、LINK和 EDIT等应用程序三、实验涉及的主要知识单元移位指令主要包括算术移位、逻辑移位、循环移位,以下分三类介绍其中统一的语句格式为:操 作 符 OPD, 1操 作 符 OPD, CL功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数( 0~255) 渤,结果送入目的地址1、算术移位( 1)算术左移指令SAL格式:SAL OPD 1 或 CL描述:将 ( OPD)向左移动C L 指定的次数,最低位补入相应的0 , C F 的内容为最后移入位的值。

如图3-3所示,受影响的标志位:CF、OF, PF、SF和 Z F( AF无定义) 图 3-3 SAL( 2) 算术右移指令SAR格式:SAR OPD 1 或 CL描述:将 ( OPD)向右移动C L 指定的次数且最高位保持不变;C F的内容为最后移入位的值如 图 3 4 所示,受影响的标志位:CF、OF、PF、SF和 Z F( AF无定义) 70 图 34 SAR2、逻辑移位( 1 ) 逻辑左移格式:SHL OPD 1 或 CL描述:把目的操作数的低位向高位移CL规定的次数,空出的低位补0, C F 的内容为最后移入位的值与算术左移相同,如图3-3所示,受影响的标志位:CF、OF、PF、SF和 Z F(AF无定义) 2 ) 逻辑右移格式:SHR OPD 1 或 CL描述:把目的操作数的高位向低位移C L规定的次数, 空出的高位补0, C F 的内容为最后移入位的值 如图 3-5所示,受影响的标志位:CF、OF、PF、SF利 Z F(AF无定义) CFo-H | ― ► Q7 0图 3-5 SHR3、循环移位循环移位包括不带进位的循环移位指令ROL、ROR和带进位的循环移位指令RCL、RCR。

1 ) 不带进位循环左移指令ROL格式:ROL OPD 1 或 CL描述:把目的操作数的低位向高位移C L 规定的次数,移出的位不仅要进入C F ,而且还要填补空出的位,C F 的内容为最后移入位的值如图3-6所示,受影响的标志位:CF、OFCF图 3-6 ROL( 2 ) 不带进位循环右移指令ROR格式:ROR OPD 1 或 CL描述:把目的操作数的高位向低位移C L 规定的次数,移出的位不仅要进入C F ,而且还要填补空出的位,C F 的内容为最后移入位的值如图3-7所示,受影响的标志位:CF、OFoCF7 0图 3-7 ROR( 3 ) 带进位循环左移指令RCL 格式:R C L O P D 1 或 C L描述:把目的操作数的低位向高位移CL规定的次数,用 原 CF的值填补空出的位,移出的位进入C F 如图 3 - 8 所示,受影响的标志位:C F 、O F CF O OP PD D7 0图 3 - 8 R C L( 3 ) 带进位循环右移指令R C R格式:R C R O P D 1 或 C L描述:把目的操作数的高位向低位移CL规定的次数, ,移出的位不仅要进入C F , 而且还要填补空出的位,如图3 - 9 所示, 受影响的标志位: C F 、O F oOPD CF图 3 - 9 R C R四、实验内容与步骤1 、实验内容( 1 ) 用 A命令写程序片段,在寄存器A X 中存入一个数,要求对其用移位命令进行乘8 , 除 4的操作。

2 ) 编写程序片段,实现如下的计算A = 1 0 * B , 要求用到移位命令,不用乘法计算 3 ) 编写指令序列把由DX和 AX组成的3 2 位二进制数进行算术左移2 、实验步骤( 1 ) 预习移位命令的基本知识,熟悉这些命令的基本操作,根据实验内容,整理编程思路;( 2 ) 利用在D E B U G 调试中的A命令输入对应程序片段;( 3 ) 对写好的程序片段,利用D E B U G 的T 、P命令或G命令查看数据区,核对实验结果五、实验要求与提示1 、实验要求( 1 ) 根据实验内容,写出分析思路;( 2 ) 对写出的程序片段,加上适量注释;( 3 ) 回答思考问题:( 4 ) 记录实验结果 2、实验提示( 1 ) 移位运算中,左移一位相当于乘2 操作,右移一位相当于除2 操作;对寄存器AX赋值为4 , 然后先执行左移1 位操作,再执行右移1 位操作,用 P 命令观察寄存器AX的变化, 如图3-10所示a1385:01001385:01031385:01051385:0107-p=0100nou a x ,0004sh l a x ,lshr a x ,lAX=0004 BX=0000DS=1385 ES=13851385:0103 D1E0-PCX=0000 DX=0000 SP=FFEESS=1385 CS=1385 IP=0103SHL AX,1BP=0000 SI=0000 DI=0000N U UP EI PL NZ NA PO NCAX=0008 BX=0000DS=1385 ES=13851385:0105 DIESFPCX=0000 DX=0000 SP=FFEESS=1385 CS=1385 IP=0105SHR AX,1BP=0000 SI=0000 DI=0000NU UP EI PL NZ NA PO NCAX=0004回S=1385BX=0000ES=1385tL385:0107 00B101D1CX=0000SS=1385DX=0000CS=1385SP=FFEEIP=0107ADD [BX+DI+D101],DHBP=0000 SI=0000 DI=0000N U UP EI PL NZ NA PO NCDS:DI01=00图 3-10( 2 ) 算术移位适合于有符号数的运算,逻辑移位适用于无符号数的运算。

3) 32位的移位注意C F的变化六、思考与练习以及测评标准1 . 执行以下命令,观察AX是否有变化:(1) SAL AX, 1SAR AX, 1(2) SAR AX, 1SAL AX, 12 . 移位指令如何影响标志位CF、OF?实验三 A SC II码表示的十进制数、 二进制数和B C D 的互换编程实验一、实验要求和目的1. 了解汇编语言中的十进制、二进制、BCD码的表示形式;2. 了解BCD值和ASCII值的区别3. 了解如何查表进行数值转换及快速计算4 . 掌握利用汇编语言进行进制转换的方法 二、软硬件环境1 . 硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG、LINK和 EDIT等应用程序三、实验涉及的主要知识单元通常在计算机当中,从键盘输入的十进制数的每一位数码,是以它的ASCII码表示的;要 向 CRT输出的十进制数的每一位数也是用ASCH码表示的而在机器中的一个十进制数,或者是以相应的二进制数存放;或者是以BCD码的形式存放1、二进制二进制是计算机技术中广泛采用的一种数制二进制数是用0 和 1两个数码来表示的数。

它的基数为2 , 进位规则是“ 逢二进一” ,借位规则是“ 借一当二” 2、 ASCII 码ASCII码是用7位二进制编码,它可以表示27即 128个字符每 个 ASCII码 以 1 个字节(Byte)储存,从 0 到数字127代表不同的常用符号,例如大写A 的 ASCII码是6 5 ,小写a 则是97, 数字0 是 48 在对应的ASCII码表中可以查到早期的ASCII码采用7位二进制代码对字符进行编码它包括32个通用控制字符,10个阿拉伯数字,52 个英文大,小字母,34 个专用符号共128个7 位 ASCH代码在最高位添加一个“0”组 成 8 位代码,正好占一个字节,在存储利传输信息中,最高位常作为奇偶校验位使用扩展A S C II® ,即第八位不再视为校验位而是当作编码位使用扩 展 ASCH码有256个3、 BCD码BCD码,是一种二进制的数字编码形式,用二进制编码的十进制代码BCD码就是用4 位二进制数表 示 1位十进制整数 表示的方法有多种, 常用的是8421 BCD码 例如: 十进制0 用 BCD码表示为: 0000,十进制9 用 BCD码表示为:1001在计算机中,同一个数可以用两种BCD格式来表示:压缩的BCD码,非压缩的BCD码 。

1 ) 压缩的BCD码压缩的BCD码用4 位二进制数表示一个十进制数位,整个十进制数用一串BCD码来表示例如,十进制数43表示成压缩的BCD码为0100 0011,十进制数1998表示成压缩的BCD码为0001 1001 1001 1000=( 2 ) 非压缩的BCD码:非压缩的BCD码用8 位二进制数表示一个十进制数位,其中低4 位是BCD码,高 4 位是0例如,十进制数83表示成压缩的BCD码为0000 1000 0000 0011«四、实验内容与步骤1、实验内容( 1 ) 将 个用ASCH码表示的多位十进制转换为二进制,要求十进制不大于65535,且输入数码为无符号数 2 ) 将用ASCII码表示的数字串,转化为压缩的BCD码 2、实验步骤( 1 ) 预习A S C I I 码、BCD码的基本知识,以及进制转换的相关操作,根据实验内容,写出程序思路;( 2 ) 编写汇编源程序,取名为“ c h 3 3 - l . A S M " 、“ c h 3 3 - 2 . A S M ” :( 3 ) 汇编、连接该源程序,产 生 “ c h 3 3 - l . E X E " 、“ c h 3 3 - 2 . E X E ”文件;( 4 ) 对两个文件进行调试运行:利用D E B U G 的 T或 P命令或G命令和D命令查看数据区,观看运行结果。

五、实验要求与提示1 、实验要求( 1 ) 画出各程序流程图;( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果2 、实验提示( 1 ) 十进制数字串转二进制从最高位开始,重复进行“ 高位* 1 0 + 低位”的操作,用公式表示为£D i X 1 0 i = ( ( - ( D n X 1 0 + D n - l ) X 1 0 ) + D n - 2 ) X 1 0 + - + D 1 ) X 1 0 + D 0( 2 ) 将 A S C H 码转换为压缩B C D 码,将 A S C I I 码的高4 位置0 , 再将十位A S C I I 码的低4 位左移至高4 位,再与个位A S C I I 码相或采用约定寄存器法传递参数六、思考与练习以及测评标准1 . A S C H 码与BCD码的区别是什么?2 .二进制转换为十进制又该如何考虑? 七、参考程序;CH 3 3 - 1 . AS Md a t a se gm e n tp rl d b 〃I n p u t a n u m b e r st ri n g:$〃 ;输入数码串的提示p r2 d b O a h , O d h , 〃0 u t :$〃b u ff d b 6n u d b 0st ri n g d b 6 d u p (〃0 〃);输出提示d a t a e n d sc o d e se gm e n ta ssu m e c s:c o d e , d s:d a t ast a rt : m o v a x , d a t am o v d s, a xl e a d x ,p rlm o v a h , 0 9hi n t 2 1 hm o v a h , O a hm o v d x ,o ffse t b u ffi n t 2 1 hl e a b x , n uc a l l d t o b i nm o v b x , a xl e a d x , p r2m o v a h ,0 9hi n t 2 1 hm o v e x , 1 6I p : ro l b x , 1m o v d l , b la n d d l , O l ha d d d l ,3 0 hm o v a h ,0 2 hi n t 2 1 h;显示输入提示;输入数码;b x :数码缓冲区首地址;调用十进制码到二进制数值的转换; a x中的二进制数值存到b x; 显示输出提示;1 6表示二进制数的位数;b x的最高位循环移位到d 0位;保留d l中的d 0位;把d 0位的一位二进制数转换为AS CI I码;显示l o o p I pm o v a h , 4 c hi n t 2 1 h;循环显示下一位; 返回命令提示符;十进制数码转换为二进制数值的过程d t o b i n p ro cp u sh b xp u sh e xp u sh d xx o r a x , a xm o v c l , [ b x ]x o r c h , c h; 保护现场; a x 清 。

c x是位数 i n c b x;[ b x ]指向最高位数码j c x z d t o b i n 2d t o b i n l :m o v d x , 1 0; 若位数为0,不进入转换循环m u l d x;高位乘1 0m o v d l ,[ b x ]; 读取低位AS CI I码i n c b x; b x指向下一个字符a n d d l ,O fhx o r d h , d h; 取得的字符转换为数值a d d a x , d xl o o p d t o b i n l; 加低位d t o b i n 2 :p o p d xp o p e xp o p b x; 恢复现场re td t o b i n e n d pc o d e e n d se n d st a rt;返回调用程序;CH 3 3 - 2 . AS Md a t ase gm e n ta se b u fd b ' 1 3 5 789' ; 数字 AS CI I 码串l e nd b $- a sc b u f; A S C H 码串长度b e d b u fd b 3 d u p (?)st a c ke n d sc o d ese gm e n ta ssu m e c s:c o d e , d s:d a t ab e gi n :m o v a x ,d a t am o vd s, a xm o vc h , 0m o vc l , l e n ; 入口参数初始化l e a si ,a se b u fl e a d i ,b e d b u fc a l l a t b ; 调用子程序完成转换m o v a h ,4 c hi n t 2 1 h; 子程序名称:a t b; 子程序功能:A SC H码串转换成压缩B C D码;入口参数:si , AS CI I码串首地址e x , AS CI I码串长度;出口参数:d i ,压缩B C D码首地址a t b p ro cn e x t : l o d s b ;从AS CBU F中取一个字节字符送至a l中,并使s i加I 1a n d a l , O f h ;取其低4位 m o v b l , a ll o d sb ; 取下一个字节字符,并使si 指向下一字符a n d a l , O fhp u sh e xm o v c l , 0 4sa l a l , c l ;左移4 位,低 4 位为 0p o p e xo r a l , b l ; 组合成压缩BCD 码s t o sb ;将 a l 中的压缩BCD 码送b e d b u f, 并使d i 加 1d e c e xl o o p n e x t ; 全部转换完否re ta t b e n d pc o d e e n d se n d b e gi n;实验二- 题2; 根据:A=1 0 *B=B*2 *2 *2 +B*2M O V AX , BS AL AX , 1M O V BX , AXS AL AX , 1S AL AX , 1 ; 计算 8BAD D AX , BX ; 计算 1 0 *BM O V A, AX; 实验二- 题3;本实验主要弄清CF 位对移位的影响m o v a x , 92 3 4m o v d x , 4 3 2 1rc l a x , 1 ;将8 * 的最高位移入CFrc l d x , 1 ;将c f移入d x 的最低位 第四章程序设计的基本结构实验实验一循环程序设计知识提要:本节主要对循环结构的组成及其设计方法加以介绍,其知识要点有:1 、循环程序的基本结构通常由3 部分组成1) 初始化部分建立循环初始值,为循环做准备, 如设置地址指针, (BX / S I / D I / BP ),初始化循环控制变量或计数器(CX ),数据寄存器(AX / D X )初值等.2) 循环体循环体是循环程序的主体,是程序中重复执行的程序段. 它是由循环工作部分、 修改部分、 和循环控制部分。

①循环工作部分:完成程序功能的主要程序段,用于执行程序的实际任务;②修改部分:对循环参数进行修改,并为下一次循环做准备;③循环控制部分:判断循环结束条件是否满足通常判断循环结束方法:• 用计数控制循环;循环是否进行了预定的次数• 用条件控制循环循环终止条件是否满足3 ) 结束处理处理部分主要是对循环的结果进行处理也可没有此部分2、循环控制指令:指令格式执行操作循环结束条件L O O P 标号C X =C X - 1;若C X =O , 则循环c x=oL O O P N Z /L O O P N E 标号C X =C X - 1;若C X =O 且Z F=O , 则循环C X =O 或Z F=OL O O P Z /L O O P E 标号C X =C X - 1;若C X =O 且Z F=1, 则循环C X =O 或Z F=1J C X Z 标号仅测试( C X )=O , 若是, 则转移到目标地址,否则就顺序执行3 、循环控制可以分为:计数循环和条件循环作为计数循环,一般是指循环次数是已知的情况,在程序 设计的的循环时.,先应将循环次数送入计数器C X 中进行计数,在循环体中使用L O O P 等循环指令。

当然,也可以通过其他方式来进行,如 c x- c xT , j n z等结合实现一、实验要求和目的1 . 了解汇编语言循环程序设计的基本流程;2 . 熟悉汇编语言循环基本指令的使用方法;3 . 掌握利用汇编语言的循环指令完成循环程序设计方法二、软硬件环境1 . 硬件环境:微机C P U 4 86 以上,500M B以上硬盘,3 2M 以上内存;2 . 软件环境:装有M A S M 5.0、D E BU G . L I N K 和E D I T 等应用程序三、实验涉及的主要知识单元熟练使用循环指令和跳转等指令来实现循环,理解循环体结构中的初始化部分、循环体、结束部分能结合前面分支结构相关的知识点,完成对循环结构的理解和掌握同时对循环结构中地址指针的设置,( BX /S I /D I /BP ), 初始化循环控制变量或计数器( C X )和数据寄存器( A X /D X )初值的设置方法等循环程序设计示例:设V A R Y 中有一组8位的符号数,编程统计其中正数、负数、零的个数,分 别 存 V M 、V N 、V K 变量中分析:设定此数组的元素匀为字节数据,则数组V A R Y 中的数据个数用C N T E Q U $ - V A R Y 求出,则循环次数为C N T 次。

在程序中,要将C N T 的值送入C X 中将数组V A R Y 中元素挨个与0比较,利用状态标志寄存器中的Z F位求出零的个数,利用S F位求出正、负数的个数具体程序设计:s t a c k s e g m e n t p a r a ' s t a c k 'd w 20H d u p ( 0)s t a c k e n d sd a t a s e g m e n tv a r y d b 23 h , 78h , 56 h , O a bh , O O h , O c d h , 59h , 14 h , 98h , O e f h , O O h , O c O he n t e q u $ - v a r yv m d b ?v n d b ?v k d b ? d a t a e n d sc o d e s e g m e n ta s s u m e c s :c o d e , d s :d a t a , s s :s t a c ks t a r t : m o v a x, d a t am o v d s , a xm o v bx, 0m o v d l , 0l e a s i , v a r ym o v e x, e n tl o p l :c m p byt e p t r [ s i ] , 0j e ze r oj s l o p 2i n c bhj m p n e xtl o p 2:i n c blj m p n e xtze r o :i n c d ln e xt :i n c s il o o p l o p lm o v v m , bhm o v v n , blm o v v k , d lm o v a h , 4 c hi n t 21hc o d e e n d se n d s t a r t四、实验内容与步骤1、实验内容( 1)编写程序, 将带有符号的字节数组A R R A Y 中最大数找出来, 送到M A X 单元中;( 用计数控制循环程序)( 2 ) 编写程序,在字符串变量S T R I N G中存有一个以$为结尾的A S C I I 码字符串,要求计算字符串的长度, 并把它存入L E N GT H 单元中。

条件控制循环)2 、实验步骤( 1 ) 预习循环程序设计的方法,根据实验内容,画出流程图;( 2 ) 利用E D I T 或其他编辑软件, 编写汇编源程序, 取名为“ ch 4 exl . A S M ”和 “ ch 4 ex2 . A S M ” ;( 3 ) 汇编、连接该源程序,产 生 “ ch 4 exl . E X E ”和 “ ch 4 ex2 . E X E ”文件;( 4 ) 对 “ ch 4 exl . E X E ”和 “ ch 4 ex2 . E X E ”文件进行调试运行: 利用D E B UG的 T命令或G 命令和D命令查看数据区,看结果是否正确五、实验要求与提示1 、实验要求( 1 ) 画出各程序流程图;( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果2 、实验提示( 1 ) 计算字符串长度中字符串应以$结尾;( 2 ) 要用计数控制,则应知道循环次数,用 C N T E Q U $- A R R A Y 来进行:若数据类型是字,则循环次数还应除以2 六、思考与练习以及测评标准1 、在上述第一题的基础上,要求修改程序,增加在此数组中找出最大值放入M A X 中的同时,找出最小值放入M I N 中;2 、$符号在字符串里的作用是什么? 实验二分支程序设计知识提要:本章主要对分支程序加以介绍,其知识要点:1 .无条件转移指令川P无条件转移指令J M P 是使程序无条件转移至目标处,又分为段内转移、段间转移o2 .条件转移指令J X X条件转移指令可分为三大类:1 . 简单条件转移指令指令。

根据单个标志位的状态判断转移条件标志位指令转移条件意义C FJ CC F =1有进位/ 借位J N CC F =O无进位/ 借位Z FJ E / J ZZ F =1相等/ 等于0J N E / J N ZZ F =O不相等/ 不等于0S FJ SS F =1是负数J N SS F =O是正数O FJ OO F =1有溢出J N O0F =0无溢出P FJ P / J P EP F =1有偶数个1J N P / J P OP F =O有奇数个12 .无符号数条件转移指令假设在条件转移指令前使用比较指令,比较两个无符号数A , B , 指令进行的的操作是A - B , 其转移指令如下:指令转移条件意义J A / J N B EC F =O A N D Z F =OA >BJ A E / J N BC F =O O R Z F =1A >=BJ B / J N A EC F =1 A N D Z F =OA BJ GE / J N LS F =O F O R Z F =1A >=BJ L / J N GES F O F A N D Z F =OA

二、软硬件环境1 .硬件环境:微机C P U 4 86 以 匕 5 00M B 以上硬盘,3 2 M 以上内存;2 .软件环境:装有M AS M 5 . 0、D E B U G . L I N K 和 E D I T 等应用程序三、实验涉及的主要知识单元在实际应用中,经常根据一些条件来选择一条分支执行汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号和相减而导致的结果来进行下面就有符号数转移指令来了解在汇编语言程序设计方法如:判断方程AX 2 +B X +C =0是否有实根若有实根,则将字节变量T AG 置 1 , 否则置0假设A、B 、C均为字节变量,数据范围为T 2 8 1 2 7 分析:二元一次方程有根的条件是B 2 - 4 *A*C >=0依据题意,先计算出B q 1 4 *A*C , 然后比较两者大小,根据比较结果给T AG 赋不同的值D a t a s e g m e n tA d b 7B d b 8C d b 6 T a g d b ?D a t a e n d sC o d e s e g m e n tAs s u m e d s :d a t a , c s :c c o d eS t a r t :M o v a x, d a t aM o v d s , a xM o v a l , bI m u l a l ;乘法指令,求出度的值并放入A X 中M o v b x, a xM o v a l , aI m u l cM o v e x, 4I m u l e xC m p b x, a xJ g e y e sM o v t a g , 0J m p d o n eY e s : m o v t a g , 1D o n e : m o v a h , 4 c hI n t 2 1 hC o d e E n d s tE n d s t a r t四、实验内容与步骤1 、实验内容(1 )以 AR R AY 为首地址的内存单元中,存放若干个8 位的带符号数,统计数组中大于等于0 的数的个数,并将结果存入R E S U L T 字节单元中。

实验三子程序设计知识提要:1 、 掌握子程序的定义语句;过程名 P R O C [ n e a r /f a r ]过程体R E T过程名 E N D P其中过程名的命名方法与变量名相同, 同一源程序中不能有相同的过程名. P R O C 为过程定义开始的伪指令,E N D P 为过程定义结束伪指令,且 P R O C - E N D P 必须配对使用配 对 的 P R O C - E N D P 前面的过程名应相同N E AR /F AR 定义了过程的属性,前者表示所定义的过程只能被相同代码段的程序调用,称为段内调用;而后者所表示的过程只能被不同代码段的程序调用,称为段间远调用2 . 子程序结构形式一个完整的子程序一般应包含下列内容:1 . )子程序的说明部分在设计了程序时, 要建立子程序的文档说明, 使用户能清楚此子程序的功能和调用方法. 说明时, 应含如下内容:. 子程序名: 命名时要见名中意.. 子程序的功能: 说明子程序完成的任务;. 子程序入口参数: 说明子程序运行所需参数及存放位置;•子程序出口参数: 说明子程序运行结果的参数及存放位置;. 子程序所占用的寄存器和工作单元;. 子程序调用示例:2 、 )掌握子程序的调用与返回在汇编语言中,子程序的调用用C A L L , 返回用R E T 指令来完成。

当发生C A L L 过程调用时,返回地址入栈;而运行R E T 指令时,则由栈顶取出返回地址C A L L 指令执行分两步走;第一步,保护返回地址,利用堆栈实现,即将返回的地址压入堆栈;第二步,转向子程序,即把子程序的首地址送入I P 或 C S : I P R E T 指令功能是返回主程序,即把子程序的返回地址送入I P 或 C S : I P 段内调用与返回:调用子程序指令与子程序同在一个段内因此只修改I P ; . 段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时. ,需同时修改C S : I P 3 . )子程序的现场保护与恢复保护现场:在子程序设计时,C P U 内部寄存器内容的保护和恢复,在运行主程序时已经占用了一定数量的寄存器, 子程序执行时也要使用寄存器 子程序执行完返回主程序后, 要保证主程序按原来状态执行,这就需要对那些在主程序和子程序中都要使用的寄存器的内容在子程序体执行之前加以保护,这就是保护现场恢复现场:子程序执行完后再恢复这些主程序中寄存器的内容,称为恢复现场一般利用堆栈实现现场保护和恢复的格式:P O P D Xf 恢复现场P O P A XR E T过 程 名 E N D P4 . 子程序的参数传递方法1,寄存器传递参数这种方式是最基本的参数传递方式。

即主程序调用子程序前,将入口参数送到约定的寄存器中子程序可以直接从这些寄存器中取出参数进行加工处理, 并将结果也放在约定的寄存器中, 然后返回主程序,主程序再从寄存器中取出结果2.存储器单元传( 变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中:子程序运行时到约定存储 位置读取参数;子程序执行结束后将结果也放在约定存储单元中3.用堆栈传递参数利用共享堆栈区,来传递参数是重要的的方法之一主程序将子程序的入口参数压入堆栈,子程序从堆栈中依次取出这些参数;经过子程序处理后,子程序将出口参数压入堆栈,返回主程序后再通过出栈获取它们一、实验要求和目的1 .熟悉汇编语言程序设计结构;2 .熟悉汇编语言子程序设计方法;3 .熟悉利用汇编语言子程序参数传递方法;二、软硬件环境1 .硬件环境:微机C P U 4 86 以上,5 0 0 M B 以上硬盘,3 2 M 以上内存;2 .软件环境: 装有M A S M 5 . 0 、D E B U G > L I N K 和 E D I T 等应用程序三、实验涉及的主要知识单元在实际应用中,经常根据遇到使用汇编语言子程序来实现,其中还发涉及到参数传递方法。

可以应用寄存器、堆栈、变量来进行,调用子程序的入口参数和调用子程序后的出口参数如:编写一程序,将 3 个 8 位有符号数中的最大值存入M A X单元中分析:编制- - 个求两个数中最大值的过程,然后对其进行调用;由于程序中的数是符号数,所以,比较后的转移指令应该采用J L 或 J G »D ata segmentA db O flhB db 1 2 hC db 7 fhM ax db ?D ata endsStack segment para ' stack'Stapn dw 2 0 dup( ? )Top E QU length stapn Stack endsC ode segmentA ssume cs: code , ds: data, ss: stackM ain proc farStart: push dsM ov ax, 0Push axM ov ax, dataM ov ds, axM ov ax, stackM ov ss, axM ov sp, topM ov ah, aM ov al, bC all maxfM ov al, cC all maxfM ov max, ahR etM ain endp;子程序名为M A XF 。

功能:求两个数中较大者;入口参数:A H , A L = 2 个有符号数;出口参数:较大者在A H 中,较小者在A L 中M axf proc nearC mp ah, alJ g nextXchg ah, alN ext: retM axf endpC ode endsE nd start 四、实验内容与步骤1、实验内容编制一个程序,显示任意两个1 6进制数的加法或减法表达式及其运算结果在减法运算中,如果被减数小于减数,显 示“ D ivide O verflow"的提示信息D A TA SE G M E N TC C D B ' +'ww dbG G D B ' = 'I I D B O D H , O A H , ' $ 'A A D B 5 D UP( ? )www dw 0ghh db ' O ' , O dh, O ah, ' $ 'bnm dw 0D A TA E N D SSTA C K SE G M E N TD B 2 0 0 D UP( 0 )STA C K E N D SC O D E SE G M E N TA SSUM E C S: C O D E , D S: D A TA , SS: STA C KSTA R T: M O V A X, D A TAC M P www, 0M O V D S, A XM O V 'C X, 2 0C A L L R A N D; 产生一随机数C A L L M C A T; 将随机数转换为1 6进制表示的A SC I I码字符M O VA X, B XPUSH A X; www= o? J E A l; 执行' +'C M P www, 1; www= l?J E A 2; 执行A l: M O V D L , C C; 显示' +'M O V A ll, 2I N T 2 1 1 1C A L L R A N D; 产生另一随机数add bx, O fhC A L L M C A T; 将 随 机 数 转 换 为1 6进 制 表 示 的A SC I I码字符M O V D L , G G;显示' = 'M O V A H , 2I N T 2 1 HPO P A XA D D A X, B Xcmp ax, 0jne yjwllea dx, ghhmov ah, 9int 2 1 hjmp lyjwl: J M P B lA 2 : M O V D L , W; 显示'M O V A H , 2I N T 2 1 Hmov ex, 6553 5mai1 : loop mailC A L L R A N D IC A L L M C A TM O V D L , G GM O V A H , 2I N T 2 1 H PO P A XSbb A X, B Xemp ax, 0jneyjw2lea dx, ghhmov ah, 9int 2 1 hjmp lyjw2 : J M P B lB l: M O VB X, A XC A L L M C A TleaD X, I IM O VA H , 9I N T2 1 H1 :M O VA ll, 4C HI N T2 1 HM C A T PR O C ; 将随机数转换为1 6进制表示的A SC I I码字符子程序PUSH A Xpush bxPUSH C XPUSH D XC M P B X, 9J A SIPUSH A XPUSH B XPUSH C XPUSH D Xmov ax, bxmov bl, 5div bl cmp ah, 3ja e vblmov www, 1jmp vnlvbl:mov www, 0vnl:pop dxpop expop bxpop axADD BL, 30HMOV AA, BLMOV AA+1,' $'LEA DX, AAMOV AH, 9INT 2111JMP s3sl:M0V C L ,4MOV A L ,0PUSH BXSHL BX, CLCMP BH, 9JBE VISUB BH, 9ADD BH, 40HJMP MM1V1:ADD BH, 30HMM1:MOV AA, BHPOP BXAND BL, OFHPUSH AXPUSH BX PUSH CXPUSH DXmov ax, bxmov b l, 5divblemp ah, 3jaevb2movWWW, 1jmp vn2vb2:mov www, 0vn2:popdxPOPexpop bxPOPaxCMP BL, 9JBETT1SUB BL, 9ADD BL, 4011JMPRR1TT1: ADD BL,30HRR1: MOV AA+1,BLMOV AA+2,' $'LEA DX, AAMOV AH, 9INT 21Hs3:POPDXPOP CXPOP BXPOP AXRETMCAT ENDP R A N D PR O CPUSH C XPUSH D XPUSH A XSTIM O V A H , 0; 读时钟计数器值I N T 1 A I IM O V A X, D X; 清高6位A N DA H , 3M O V D L , 1 0 1; 除1 0 1 ,产生0 ~1 0 0余数D I V D LM O V B L , A H; 余数存B X ,作随机数PO P A XPO P D XPO P C XR E TR A N D E N D PR A N D I PR O CPUSH C XPUSH D XPUSH A XSTIM O V A H , 0I N T 1 A HM O V ax, exA N D A H , 3M O V D L , 1 0 1D I V D LM O V B L , A H PO P A XPO P D XPO P C XR E TR A N D I E N D PC O D E E N D SE N D STA R T五、参考程序;CH4EX1.ASMDATA SEGMENTARRAY DB55,15,10,36,-6,72,125,-64COUNT EQU$-ARRAYMAX DB?DATA ENDSCODE SEGMENTASSUMECS:CODE,DA:DATAMAIN PROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXSTART:MOVCX,COUNT-1MOVBX,OFFSET ARRAYMOVALJBX]LOP:INCBXCMPAL,[BX]JGENEXTMOVALJBX]NEXT:LOOPLOPMOVRETMAX,ALMAIN ENDPCODE ENDSENDSTART ;CH4EX2.ASMDATA SEGMENTSTRING DB 'I AM A STUDENTS,LENGTHSTR DW ?DATA ENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXSTART:LEASI STRINGMOVCX,0MOVAL,$LOP:CMPAL, [SI]JZQUITINCCXINCSIJMPLOPQUIT:MOVLENGTHSTR ,CXRETMAINENDPCODEENDSENDSTART;CH4EX3.ASMDATA SEGMENTARRAY DB l,-4,90,l 15,78,0,-98,-37,-68,0COUNT EQU S-ARRAYRESULT DB ?DATA ENDSSTACK SEGMENT PARA STACKDB 100 DUP(O)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA MOVLEAMOVMOVLOP1:MOVCMPJLINCLOP2:INCDECJNZMOVMOVINTCODE ENDSENDDS,AXSI,ARRAYDL,0CL,COUNTAL,[SI]AL,0LOP2DLSICLLOP1RESULT,DLAH,4CH21HSTART;CH4EX4.ASM; 说明:该程序模块如下;( 1) 主模块:总控模块; 输入:从键盘输入一个班的学生成绩; 输出:显示一个班的学生名次; 功能:根据输入的学生成绩,计算并显示学生名次。

算法:一个学生的名次等于成绩高于; 该生的学生人数加1 ( 2 ) 模块:input; 输入:以学号为序从键盘输入一个班的学生成绩各个成绩之间用逗号隔开,最后以回车; 符结束 输出:把一个班的学生成绩存入grade数组.; 功能:接收一个班的学生成绩调用子模块decibin把从键盘输入的 个十进制转换为二; 进制数调用子模块crlf完成回车、换行功能 (3)模块:rankp; 输入:从 grade数组取得一个班的学生成绩 输出:以学号为序计算出该班每个学生的名次存入rank数组 功能:计算一个班的学生名次. 算法为: 一个学生的名次等于成绩高于该生的学生人数加; ( 4 ) 模块:output; 输入:从 rank数组取得一个班的学生名次 输出:把一个班的学生名次以学号为序在终端上显示出来; 功能:显示一个班的学生名次调用子模块binidec,以便把rank数组中的二进制数转; 换成十进制数并在终端上显示出来调用子模块crlf完成回车、换行功能 ( 5 ) 模块:decibin; 输入:从键盘取得一个十进制数 输出:把该数转换为二进制数并存入b x 寄存器中 功能:把从键盘取得的一个十进制数转换成为二进制数,并将该数存入b x 寄存器。

; ( 6 ) 模 块 : crlf; 输出:向终端输出回车换行符; 功能:完成一次回车换行操作; ( 7 ) 模块:binidec; 输入:从 b x 寄存器取得一个二进制数 输出:在终端屏幕上显示一个十进制数 功能:把 b x 寄存器中二进制数转换为十进制数,并在终端屏幕上显示出来调用子模块;dec_div用来做除法运算并显示字符 ( 8 ) 模块:dec_div; 输入:从 b x 寄存器中取得需要转换为十进制的数; 输出:在屏幕上显示一位十进制数; 功能:把 b x 寄存器中的二进制数除以相应的十的暴,并在屏幕上显示一位商余数保存和 bx 中 程序清单如下:DATASEGMENTGRADEDW50 DUP(?)RANKDW50 DUP(?)COUNTDW9MESSIDB,GRADE?$,MESS2DB13,10,INPUT ERROR!', 13,10,$'MESS3DBRANK$DATAENDSSTACKSEGMENTSTACKDB 400 DUP(O)STACK ENDSCODE SEGMENT 'CODE'ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXCALLINPUTCALLRANKPCALLOUTPUTMOVAH,4CHINT21HINPUTPROCNEARLEADX,MESSIMOVAH,9INT21HMOVSI,0MOVCOUNT,0ENTER:CALLDECIBININCCOUNTCMPDL; /JESTORECMPDL,13JEEXIT2 JNEERRORSTORE: MOVGRADE[SI],BXADDSI,2JMPENTERERROR: LEADX,MESS2MOVAH,9INT21HEXIT2: MOVGRADE[SI],BXCALLCRLFRETINPUT ENDPRANKP PROCNEARMOVDI,COUNTMOVBX,0LOOP1: MOVAX,GRADE[BX]MOVWORD PTR RANK[BX],0MOVCX,COUNTLEASI,GRADENEXT: CMPAX,[SI]JGNO.COUNTINCWORD PTR RANK[BX]NO.COUNT: ADDSI,2LOOPNEXTADDBX,2DECDIJNELOOP1RETRANKP ENDPOUTPUT PROCNEARLEADX,MESS3MOVAH,9INT21HMOVSI,0MOVDI,COUNTNEXT1: MOVBX,RANK[SI]CALLBINIDECMOVDL; ;MOVAH,2INT21HADDSI,2DECDIJNZNEXT1CALLCRLFRETOUTPUT ENDPDECIBIN PROC NEAR MOVBX,0NEWCHAR: MOVAH,1INT21HMOVDUALSUBAL,30HJLEXIT1CMPAL,9DJGEXIT1CBWXCHGAX,BXMOVCX,10MULe xXCHGAX,BXADDBX,AXJMPNEWCHAREXIT1: RETDECIBINENDPBINIDECPROCNEARPUSHBXPUSHe xPUSHSIPUSHDIMOVCXJ00CALLDEC_DIVMOVex , 10CALLDEC_DIVMOVCX,1CALLDEC_DIVPOPDIPOPSIPOPe xPOPBXRETBINIDECENDPDEC_DIVPROCNEARMOVAX,BXMOVDX,0DIVe xMOVBX,DXMOVDUALADDDL,30HMOVAH,2INT21HRETDEC_DIVENDPCRLFPROCNEAR MOVDL,0AHMOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HRETCRLF ENDPCODE ENDSENDSTART 第五章 字符串操作及输入/ 输出实验知识提要:本章主要进行字符串处理和输入输出实验,涉及到的知识点包括:1 .字符串处理指令常用的字符串处理指令有:传送指令MOVS、比较指令CMPS、扫描指令SCAS、装入指令LODS、存储指令STOS等、串输入指令INS和串输出指令OUTSo2 .与串处理基本指令配合的前缀主要有重复指令REP、 椭/ 为零则重复指令REPE/REPZ和不相等/ 不为零则重复指令REPNE/REPNZ。

3 .字符/ 字符串输入输出主要利用DOS的INT 21H中断功能调用来实现字符或字符串的输入/ 输出操作,其 中1号功能表示输入字符;2号功能表示输出字符;0A号功能表示输入字符串:09号功能表示输出字符串4 . CPU与输入/ 输出设备外部设备是实现人机交互和通信的设备,计算机通过硬件接口及I/O控制程序对外部设备进行控制每种输入输出设备都通过一个硬件接口或控制器与CPU相连,这些接口和控制器都支持输入输出指令IN和OUT与外部设备交换信息这些信息包括控制、状态和数据5 .输入/ 输出控制方式主要有程序直接控制I/O方式、中断传送方式和直接存储器存取(DMA)方式实验一字符串操作编程实验( 设计性实验)一、实验要求和目的1 . 了解汇编语言字符串处理基本流程;2 .熟悉汇编语言字符串处理基本指令的使用方法;3 .掌握利用汇编语言实现字符串处理的程序设计方法二、软硬件环境1 .硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 .软件环境:装有MASM5.0、DEBUG、LIN K和EDIT等应用程序 三、实验涉及的主要知识单元1、字符串处理基本操作流程( 1)利用S I寄存器保存源串首地址;( 2)利用D I寄存器保存目的串首地址;( 3)利用CX 寄存器保存字符串长度;( 4)利用CLD或 STD指令设置字符串处理方向;( 5)利用字符串处理指令实现相关处理。

其中,CLD指令使DF=O,在执行串处理指令时可使地址自动增量;STD使 D F =1,在执行串处理指令时可使地址自动减量提示:字符串处理一般都涉及到源串和目的串,汇编语言规定源串在数据段中定义,目的串在附加段中定义2、重复前缀指令REP重复串操作直到计数寄存器的内容为0 为止可以与REP配合工作的字符串处理指令有MOVS、STOSs LODS、INS 和 OUTSREPE/REPZ 判断计数寄存器的内容是否为0 或 Z F=0 ( 即比较的两个操作数不等) ,是的话退出,否则继续执行可以与REPE/REPZ 配合工作的串指令有CMPS和 SCASREPNE/REPNZ 判断计数寄存器的内容是否为0 或 Z F=1 ( 即比较的两个操作数相等) ,是的话退出,否则继续执行可以与REPE/REPZ 配合工作的串指令有CMPS和 SCAS3、字符串处理基本指令( 1) MOVS传送指令格式:MOVS DST, SRC或 MOVSB ( 传送字节)或 MOVSW ( 传送字)或 MOVSD ( 传送双字) 后面三种形式需要与REP指令结合使用该指令把由源变址寄存器( SRC)指向的数据段中的一个字( 或双字,或字节)数据传送到由目的变址寄存器( DST) 指向的附加段中的一个字( 或双字, 或字节)中去,同时, 根据方向标志及数据格式( 字、双字或字节)对源变址寄存器和目的变址寄存器进行修改。

2) STOS存入串指令格式:STOS DST或 STOSB ( 存入字节)或 STOSW ( 存入字)或 STOSD ( 存入双字) 该指令把AL或 AX或 EAX的内容存入由目的变址寄存器指向的附加段的某单元中, 并根据方向标志( DF)和数据类型修改目的变址寄存器的内容 3) LODS从串取指令格式:LODS SRC或 LODSB ( 取字节)或 LODSW ( 取字)或 LODSD ( 取双字) 该指令把由源变址寄存器指向的数据段中某单元的内容传送到AL、AX或 EAX中,并根据方向标志和数据类型修改源变址寄存器的内容 4) INS串输入指令格式:INS DST, DX 或 INSB 或 INSW 或 INSD该指令把端口号在D X 寄存器中的I/O 空间的字节、字或双字传送到附加段中的由目的变址寄存器所指向的存储单元中,并根据D F的值和数据类型修改目的变址寄存器的内容 5) OUTS串输出指令 格式:OUTS DX, SRC 或 OUTSB 或 OUTSW 或 OUTSD该指令把由源变址寄存器所指向的存储器中的字节、字或双字传送到端口号在D X寄存器中的I/O端口中去,并根据DF及数据类型修改源变址寄存器的内容。

6) CMPS串比较指令格式:CMPS SRC, DST 或 CMPSB 或 CMPSW 或 CMPSD该指令把由源变址寄存器指向的数据段中的一个字节、字或双字与由目的变址寄存器所指向的附加段中的一个字节、字或双字相减,但不保存结果,只根据结果设置条件标志该指令“REPE/REPZ或REPNE/REPNZ结合,可以比较两个数据串7) SCAS串扫描指令格式:SCASDST 或 SCASB 或 SCASW 或 SCASD该指令把AL、AX或EAX的内容与由目的变址寄存器所指向的附加段中的一个字节、字或双字进行比较,并不保存结果,只根据结果设置条件码该指令与REPE/REPZ或REPNE/REPNZ结合,可以从一个字符串中查找一个指定的字符4、字符串处理程序设计示例比较两串字符串是否相同,相同则显示字符串内容,不同则显示“NOMATCH!”首先进行题目分析:( 1 )如何判断两串字符串不同?如果两串字符串长度不等,那它们肯定不相同,故首先要判断它们的长度是否相同如果两串字符串长度相等,那么就逐个判断对应的字符是否相同 2 )分析数据定义按题目要求,至少要定义两串字符串,还有就是不同时的“NO MATCH!”提示信息的显示。

为了使程序的通用性比较好, 字符串长度最好能自动获取 需要注意的就是该题目如果利用字符串处理指令进行,则源串和目的串应该分别定义在数据段与附加段 3 )分析程序设计按 照( 1 )的分析,首先要比较字符串长度是否相同,此时需要获取字符串长度,并比较,可以用CMP指令进行;如果字符串长度相等,则利用字符串处理指令进行逐个字符比较,可以利用CMPS进行,在用CMPS之前需要按照1 ( 字符串处理基本流程) 进行前期准备 4 )具体程序设计DATA SEGMENTSTR1 DB 'NHALLO$'NEQU$-STR1MESS DB 'NO MATCH*DATAENDSDATA1 SEGMENTSTR2 DB 'HELLOA$'M EQU $-STR2DATA1 ENDSCODE SEGMENT; 源串出动获取字符串长度; 提示信息; 目的串; 自动获取字符串长度 ASSUME CS:CODE,DS:DATA,ES:DATA1START:MOV AX,DATAMOV DS,AXMOV AX,DATA 1; 数据段段寄存器赋值MOV ES,AXMOV AL,N; 附加段段寄存器赋值CMPAUM; 比较两串字符串的长度JNZ EXIT; 不相等转到E X IT ,显示NO MATCH!LEA SI,STR 1LEADLSTR2MOV CL,NMOV CH,0CLD; 相等则利用字符串处理指令进行比较REPE CMPSB; 利用CMPSB比较两串字符串的每个字符JNZ EXIT; 跳出上述循环操作时.,如果CX不为0 表示两串字符; 串有不相等字符出现,转 EXIT显示NO MATCH!LEADX,STR1JMPL1EXIT:LEA DX,MESS; 否则,两串字符串完全相等,显示字符串信息LI: MOV AH,9INT21H; 9 号功能调用显示字符串信息MOV AH,4CHINT21H; 程序结束CODE ENDSEND START四、实验内容与步骤1、实验内容( 1 ) 编写程序,将内存中某一区域的数据传送到另一 区 域 ( 要求用字符串处理方法) :( 2 ) 编写程序,在已知字符串中搜索特定字符, * , ,若找到则显示该字符,找不到则显示“NOFOUND”;( 3 ) 编写程序,统计一串字符串中某字符出现的次数。

2、实验步骤( 1)预习字符串处理基本知识,根据实验内容,画出流程图; (2)利I] EDIT或其他编辑软件, 编写汇编源程序, 取名为“ch5exl.ASM"、 “ ch5ex2.ASM»[l“ch5ex3.ASM”;( 3 ) 汇编、连接该源程序,产生 “ ch5exl.EXE"、“ch5ex2.EXE” 和 “ch5ex3.EXE” 文件;( 4 ) 对 “ch5exl.EXE” 和 “ ch5ex3.EXE” 文件进行调试运行: 利用DEBUG的 T 命令或G 命令和D 命令查看数据区,字符串是否传送成功以及字符出现次数五、实验要求与提示1、实验要求( 1 ) 画出各程序流程图;( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果2、实验提示( 1 ) 数据区中的字符串应以$ 结尾:( 2 ) 显示单个字符可以用DOS的 INT 21H的 2 号功能,将字符放在AL寄存器中,2 号放在AH寄存器中MOV AL,*MOV AH,2INT21H( 3 ) 显示字符串可以用如下指令,但要提前定义需要显示的字符串LEADX,STRMOV AH,9INT21H六、思考与练习以及测评标准1、不用字符串处理方法,而用其他方法如何实现题目1 的程序设计?2、要求从键盘输入字符串数据,如何修改题目1?3、$ 符号在字符串里的作用是什么?实验二字符及字符串的输入/ 输出编程实验( 设计性实验) 一、实验要求和目的1 . 熟悉汇编语言程序设计结构;2 . 熟悉汇编语言字符串处理基本指令的使用方法;3 . 掌握利用汇编语言实现字符的输入输出程序设计方法;4 . 掌握利用汇编语言实现字符串的输入输出程序设计方法。

二、软硬件环境1 . 硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG. LINK和 EDIT等应用程序三、实验涉及的主要知识单元在实际应用中,经常需要从健盘输入数据并将结果等内容显示到屏幕上,方便程序控制及查看结果汇编语言的数据输入和输出分成两类,一是单个字符数据的输入输出,一是字符串数据的输入输出都可以通过DOS功能调用来实现,下面就分别介绍下用来实现数据输入输出的功能调用的使用方法1、单个字符输入单个字符输入可以利用DOS的 1 号功能调用来完成,使用方法为:MOVAH.1INT21H这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCH码形式存储在A L寄存器中下面简单举例说明单个字符输入的使用, 从键盘输入一个数据并将其存储到存储器中, 程序如下所示,输入数据查看如图2-1所示DATA SEGMENTADB? ; 保存键盘输入的数据DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AH,1 QOS 1号功能调用INT21HMOV A,AL ; 将输入数据保存到A 中MOV AH,4CHINT21H CODE ENDSEND START” 命令提示符-DEBUG MMM.EXEE:\MfiSM5>DEBUG MMM.EXE-U 0 101431:00001431:00031431:00051431:00071431:00091431:000C1431:000E1431:00101431:0011B830148 EDSB401CD21A20000B44CCD213E8B4608M O UM O UM O UI NTM O UM O UI NTDS:M O U3 命人出提Program term inated norm ally~D 1430:0 戊盘翕入聒出我1430:0000 33 00 00 00 00 00 001430:0010 BU 30 14 8E D8 B4 011430:0020 3E 8B 46 08 8B 56 0A1430:0030 26 8A 47 0C 2A E4 401430:0040 EE 43 83 C4 04 50 8D1430:0050 06 FF 76 06 FF 76 041430:0060 E5 5D C3 90 55 8B EC1430:0070 06 89 46 FC 89 56 FEAX,1430 裁优段段地址DS, AXAH,0121[0 0 0 0 ],AL 傅戊麦偷人出11数副存僦者中AH,4C对左执川段的第一A章丸AX/BP+08]00-0000 00 00 00CD-21A2 00 00B489-46FC 8956FE50-8BC3 050C 0086-7CFF 50E8 448D-867C FF 50E8Bl-EC 8C 00 8B 46C4-5E FC 2680 7F0C42EB4404C5640000 003 .....................CD 21.0 .............? .— —5E FC> .F ..U ..F . .U ..人50 E88t.G .*.ep .. … RP83C4.C .. .P ..;. P.Dn.FE 8B-B_K-8B 56..U.......... . .F . J00 74&….1图 2 -1 键盘输入数据示例2、单个字符输出单个字符输出可利用DOS2号功能调用来完成,使用方法为:MOVDL,'?’MOV AH,21NT21H单个字符输出需要把要输出字符的ASCII码放在D L寄存器中。

3、字符串输入从键盘输入一串字符串可以利用DOS的 10号功能调用来完成,使用方法为:BUF DB 50 ; 预定义可以输入的最大字符个数DB? ; 实际输入字符个数,根据输入自动统计DB 5 0 D U P ( ? ) ; 存放输入字符串数据缓冲区LEADX,BUFMOV AH, 10INT21H利 用 10号功能实现字符串输入,需要在数据段中预定义缓冲区,如上所述,图 2-2给出了利用10号功能调用实现字符串输入的示例 氏 ] 命令提示符 DEBUG MMM.EXEE:XMRSM5>DEBUG MMM.EXE-U 0 F1 4 3 4 :0 0 0 01 4 3 4 :0 0 0 31 4 3 4 :0 0 0 51 4 3 4 :0 0 0 91 4 3 4:000B1 4 3 4:000D1 4 3 4:000F-GB 830148 EDS8D 160000B40ACD21B44CCD21MOUMOULEAMOUI NTMOUI NTAX,1430DS, AXD X ,[0 0 0 0 ]AH, 0A21A H ,4c21W号 加 饶 稿 用 实 说 名 若 * 信 人输■人处名符数% 点d a jia h a o n a ?窿”(i中的后僦情观偷 入3符 * 的 的 夕 夕 居Program te r m in a te d n o r m a lly-d 1 4 3 0 :0M戊 盘 信 入 一 ・ 名 符 *1 4 3 0 :0 0 0 0320B 64 616A69 61 6 5 -6 16F 6D 61210D 00 001 4 3 0 :0 0 1 00000 00 000000 00 0 0 -0 000 00 000000 00 001 4 3 0 :0 0 2 00000 00 000000 00 0 0 -0 000 00 000000 00 001 4 3 0 :0 0 3 00000 00 000000 00 0 0 -0 000 00 000000 00 001 4 3 0 :0 0 4 0B830 14 8ED88D 16 0 0 -0 0B4 0A CD 21B4 4C CD1 4 3 0 :0 0 5 021FF 76 06FF76 04 8D -867C FF 50E84B FE 8B1 4 3 0 :0 0 6 0E55D C3 90558B EC 81-EC8C 00 8B4604 8B 561 4 3 0 :0 0 7 00689 46 FC 8956 FE C 4-5EFC 26 807F04 00 74.0X定次 可 应 信 人 的 长 大3符个以2 .d a jia h a o n a ? ___u . .uI ..U .F ..U.:.P .K ... . . . F . . U人…・t图 2・ 2 字符串输入示例4、字符串输出字符串输出可由DOS 9 号功能调用来完成,使用方法为:STRING DB 'HELLO$'LEA DX,STRINGMOV AH,9INT21H显示字符串需要先在数据段中定义,例如STRING,然后调用9 号功能来进行显示输出。

需要注意的是,字符串要求以$ 作 为结束标志,如果不加$ 则会出现乱码显示效果四、实验内容与步骤1、实验内容修改实验一的题目1和 2 为:(1 )从键盘输入一串字符串( 要求输入时给出信息提示) ,存入内存中的数据段的某一区域,然后编写程序,将其传送到附加段中的另一区域( 要求用字符串处理方法) 2 ) 从键盘输入一串字符串( 要求输入时给出信息提示) ,存入内存中某一区域,然后输入一个字符* ( 要求输入时给出信息提示) ,编写程序在输入的字符串中搜索特定字符若找到则显示该字符,找不至 U 则显示“NOFOUND” 3 ) 从键盘输入一串字符串( 显示提示) 到内存中,在该字符串的某一个位置,插入某一字符或删除某一字符,并显示操作后的字符串2、实验步骤( 1 ) 预习字符串处理基本知识,以及字符/ 字符串输入/ 输出基本操作,根据实验内容,画出流程图;( 2 ) 利 用 ED IT或其他编辑软件, 编写汇编源程序, 取名为“ ch5ex4.ASM"、“ch5ex5.ASM” 和"ch5ex6.ASM";( 3 ) 汇编、连接该源程序,产生 “ch5ex4.EXE"、“ch5ex5.EXE” 和 “ch5ex6.EXE” 文件; ( 4 )对“ c h 5 e x4 .E X E ”文件进行调试运行:利用D E B U G的T命令或G命令和D命令查看数据区,字符串是否正确保存到数据区、字符串是否传送成功、字符插入和删除操作是否成功。

五、实验要求与提示1、实验要求( 1 )画出各程序流程图;( 2 )列出程序清单,加上适量注释;( 3 )回答思考问题;( 4 )记录实验结果2、实验提示( 1 )提示信息实际上也是一串字符串,可以利用9号功能显示;( 2 )如果字符串结尾没有$ , 显示时会出现乱码六、思考与练习以及测评标准1 .字符串在内存中是如何存储的?2 .屏幕有多个字符串显示时,如何换行?3 .如果想在一串字符串中同时查找多个字符,如何修改题目2的程序? 实验三 发声系统程序编程设计( 综合性实验)一、实验要求和目的1 . 了解汇编语言输入输出控制的基本方法;2 . 熟悉汇编语言输入输出指令的使用方法;3 . 掌握利用汇编语言实现输入输出程序设计的基本方法二、环境和设备1 . 硬件环境:微机CPU 486以 匕 500MB以上硬盘,32M以上内存;2 . 软件环境:装有MASM5.0、DEBUG. LINK和 EDIT等应用程序三、实验涉及的主要知识单元1、I/O 设备计算机的五大组成部件分别是运算器、控制器、存储器、输入设备和输出设备,每种输入输出设备都通过一个硬件接口或捽制器与CPU连接,例如,软盘通过软盘控制器与CPU连接,显示器通过数据接口与 CPU连接。

这些接口或控制器都支持输入输出指令IN、OUT与外部设备交换信息,其交换的信息包括控制信息、状态信息和数据信息三种,它们必须按不同的端口地址分别传送1)控制信息控制信息由CPU输出到I/O 接口,通知接口或设备要做什么动作,如 CPU向 I/O 接口发送启动信号或停止信号以控制外设的启停 2)状态信息状态信息从I/O 接口发送到C P U ,表示I/O 设备当前所处的状态,如输入设备的准备好(READY) ,表示外设已经准备好输入数据,输出设备的忙(BUSY)表示该设备是否处于空闲状态,空闲则可以接收CPU送来的信息,忙则CPU要等待3)数据信息数据信息是CPU与 I/O 设备要进行交换的数据,其数据类型视具体I/O 设备需求而定,如向显示器传送的信息必须是ASCII码2 , I/O 端口I/O 端口一般有三种寄存器: •是作为数据缓冲的数据寄存器,二是作为保存设备和接口状态的状态寄存器,三中保存CPU发送的命令以控制接口的命令寄存器这些寄存器有各自的端口号,I/O端口是独立编址的,允许设置64K个 8位端口或32K个 16位端口,表 3-1列出了部分端口地址 表 3-1 1/0端口地址分配I/O地址功能I/O地址功能00-0FDMA控制器8237A2F8-2FE2 号串行口20-3F可编程中断控制器8259A3F8-3FE1号串行口40-5F可编程中断计时器320-324硬盘适配器60-638255A PPI372-377软盘适配器70-71CMOS RAM378-37A2 号并行口170-1F7硬盘控制器3BC-3BE1 号并行口200-20F游戏控制端口3D0-3D7CGA视频寄存器3、扬声器控制图 3 -1 设备控制寄存器61H端口控制寄存器的第0 位和一个振荡器相连,第 1位与扬声器的脉冲门相连,如图3-1所示,当第 1位由0 变 为 1 , 延迟一会又由1 变为0 时 . ,脉冲门就先打开后关闭,产生一个脉冲电流,这个脉冲电流经放大器放大后送到扬声器使之发出声音。

下面是利用上述方法实现发声的程序示例:code segmentassume cs:codestart:mov di,200; 发生的频率mov ax,2800; 计 算 1秒时间mov bx,50mul bxdiv dimov dx,ax; 得到脉冲周期时间mov ax,20mul bxmov bx,axin al,61hmov ah,aland al,Ofch; 关定时器通道2 的门控10: xor al,2out 61h,al mov cx,dx ; 控制脉冲宽度的计数值wait 1: loop waitldec bxjnz 10 ; 控制音长mov al,ahout 61h,al ; 关闭扬声器mov ah,4ch 濯序结束int2lhcode endsend start4、8253基本知识8253为可编程定时器,其内部有3 个独立工作的计数器:Counter 、Counterl和 Counter2,每个计数器都分配有一个端口地址,分别为40H、41H 和 42Ho 8253内部还有一个公用的控制寄存器,其地址为43H o端口地址输入到8253的 CS、A l、A0端 , 分 别 对 3 个计数器和控制器寻址。

1) 8253基本结构8253编程结构如图3-2所示,每个计数器由三个引脚与外部联系,其中CLK为时钟输入端,OUT为计数/ 定时信号输出端,GATE为门控信号输入端每个计数器内部都包含一个16位计数寄存器,以倒计数方式计数8253图 3-2 8253编程结构( 2 ) 控制字设计对 8253编程时,先要设定控制字,以选择计数器、确定工作模式和计数值格式其控制字格式如图11-3所示, 其中:D0—为选择计数值的格式D 0=0,计数值格式是二进制;D 0 = l,计数值格式是BCD码该计数值在编程时作为与CLK输入频率相除的除数,最小为0 0 1 ,最大为216 D3, D2和 D1——为选择操作模式D3 D2 Dl=000~010,分别表示模式0~模式5 , 这 6 种模式决定了输出脉冲的形状D5和 D4——为读写指示有四种选择,如图3-3所示D7和 D6——为选择计数器确定控制字是对哪个计数器进行初始化例如,将计数器设定为模式3 , 计数值为4282 (B C D ),则程序设计如下:MOV AL,00110111BOUT 43H,ALMOV AX,4282HOUT 40H,ALMOV AL,AHOUT 40H,AL; 控制字浒数值; 计数值低位; 计数值高位D7 D6 D5 D4 D3 D2 DI DOSCI SCO RL1 RLO M2 Ml MO BCD |r「00计数器锁存操作I 01只读/ 写LSB| 10只读/ 写MSBI 11 读/ 写 LSB, MSBrO O 选择计数器0_ 0 1 选择计数器1―1 1 0 选择计数器23 1 无效| r o二进制数LI BCD「 000模式0001模 式 1X10模式2' x ll模式3100模式4M 01模式5图 3-3 8253控制字格式5、利用8253-5演奏乐曲乐曲是按照一定的高低、长短和强弱关系组成的音调。

在一首乐曲中,每个音符的音高和音长与频率和节拍有关组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据音符的频率根据不同的音乐是不同的,可以预先查知, 但实际送入计数器的是输入频率1.193MHz与音符频率相除的值音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的在 4 /4 (四四拍) 中,四分音符为1拍,每小节4 拍,全音符持续4 拍,二分持续2 拍,四分音符持续1拍,八分音符持续半拍如果给全音符分配1s ( 100* 10m s)的时间, 则二分音符的持续时间为0.5s (50* 10m s),其他的类推 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,DATA SEGMENTFTABLE DW 262,190,220,190,220,262,220,262,294,0 ; 频率表TTABLE DW 40,40,40。

10,40,20,80 ; 时间表DATA ENDSSTACK SEGMENTDW 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSING PROC FARMOV AX,DATAMOV DS,AXMOV SI,OFFSET FTABLE LEABRTTABLECALLPLAYMOVAX,4COOHINT 21HRETSING ENDP, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,PLAY PROCPUSH BXPUSH DIPUSH SIPUSH BPAGAIN: MOV DI,[SI]CMP DI,0JE ENDPLAYMOV BX,DS:[BP]CALL NEWBEEPADD SI,2ADD BP,2JMP AGAINENDPLAY:POP BPPOP SIPOP DIPOP BXRETPLAY ENDP; 取音调频率; 是否演奏完; 取持续时间; 演奏一个音符; 修改指针, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,NEWBEEP PROC NEARPUSH AXPUSH CXPUSH DXPUSH DIMOV AL,OB6HOUT 43H,ALMOV DX,12HMOVAX,34DAHDIV DIOUT 42H, ALMOV AL,AHOUT 42H, ALMOVAL,03HOUT 61 KALDELAY2:MOV CX, 12500DELAY 1: LOOP DELAY 1DEC BXJNZ DELAY2; 控制字;8253-5通 道2设 置 方 式3; 16位, 二进制计数; 计算时间常数; 送时间常数; 使与门打开,GETE2有效, 扬声器响; 延 时10ms,使声音维持; 根 据BX的内容延迟 MOV AL,OOHOUT 61H, AL ; 关闭扬声器POP DIPOP DXPOP CXPOP AXRETNEWBEEP ENDPCODE ENDSEND SING, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,四、实验内容与步骤1、实验内容(1)利 用82 5 3 ,编程实现使扬声器发出“ 12 3 - i ”曲谱音符声的I/O程序;( 2 )编写可以演奏“ 两只老虎”乐曲的程序。

曲谱主要段对应的频率如下:音符 1 2 3 1; 3 4 5;频率 262, 294, 330, 262, 330, 394, 392音符 5 6 5 4 3 1; 2 5 I频率 392, 440, 392, 349, 330, 261; 294, 192 , 2622、实验步骤( 1 )预习输入输出处理基本知识,根据实验内容,画出流程图:( 2 )利 用EDIT或其他编辑软件, 编写汇编源程序, 取名为“ch5ex7.ASM”和“ch5ex8.ASM” ;( 3 )汇编、连接该源程序,产 生“ch5ex7.EXE”和“ch5ex8.EXE”文件;( 4 )对“ch5ex7.EXE”文件进行调试运行:利 用DEBUG的T命令或G命令,观察程序运行效果五、实验要求与提示1、实验要求( 1 )画出各程序流程图;( 2 )列出程序清单,加上适量注释;( 3 )回答思考问题;( 4 )记录实验结果2、实验提示( 1)题 目1可通过发送0和1脉冲方式控制扬声器发声;( 2 )题 目2要通过设置频率表和时间表方式,通过子程序调用来实现音乐演奏六、思考与练习以及测评标准 1 . 16位计数值如何传送给定时器?2 . 计数值是如何计算的?七、参考程序;CH5EX1.ASMDATA SEGMENTSTR1 DBN EQUDATA ENDS,hello everybody*,$-STRlDATA1 SEGMENTSTR2 DBDATA1 ENDS30 DUP(?)CODE SEGMENTASSUMECS:CODE,DS:DATA,ES:DATA1START:MOVMOVAX,DATADS,AXMOVMOVLEALEAMOVMOVCLDREPMOVAX,DATA1ES,AXSI,STR 1DI,STR2CL,NCH,0MOVSBAH,4CHINTCODE ENDSEND21HSTART;CH5EX2.ASMDATA SEGMENTMESS DBCHAR DBDATA ENDS'no found$f'o'DATA1 SEGMENTSTR1 DBN EQUDATA1 ENDS'i love you$r$-STRl CODE SEGMENTASSUMECS:CODE,DS:DATA,ES:DATA1START:MOVAX,DATAMOVDS,AXMOVAX,DATA1MOVES,AXLEADI,STR 1MOVAL,CHARMOVCL,NMOVCH,0CLDREPNESCASBCMPCX,0JZLOMOVDL,CHARMOVAH,2INT21HJMPEXITLO: LEADX,MESSMOVAH,9INT21HEXIT: MOVAH,4CHINT21HCODE ENDSENDSTART;CH5EX3.ASM; 实验二字符串统计STACK SEGMENT PARA STACK 'STACK'DB100HDUP(?)STACK ENDSDATA SEGMENTBUFFER DB SABDFABKAGBFS'N EQU S-BUFFERDATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORBX,BXMOVSI,OFFSET BUFFERMOVCX,N LI:MOVAL,[SI]CMPAL,A'JNEL2INCSIDECCXJEL4MOVAL,[SI]CMPAL,BJNEL3INCBLL2:INCSIL3:JMPLIL4:MOVDL,BLORDL,30HMOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART;CH5EX4.ASMDATA SEGMENTSTR1DB50,?,50 DUP(?)MESSIDB*please input string 1$MESS2DB0AH,0DH,$DATAENDSDATA1SEGMENTSTR2DB50 DUP(?)DATA1ENDSCODE SEGMENTASSUME CS :CODE,DS :D ATA,ES:D ATA 1START:MOV AX,DATAMOV DS,AXMOV AX,DATA1MOV ES,AXLEA DX,MESSIMOV AH,9INT 21HLEA DX,MESS2MOV AH,9INT 21H LEADX,STR1MOVAH,0AHINT21HLEASI,STR 1LEADLSTR2MOVCLJSI+1]MOVCH,0ADDSI,2CLDREPMOVSBMOVAH,4CHINT21HCODE ENDSEND START;CH5EX5.ASMDATA SEGMENTSTR1DB50,?,50DUP(?)MESSIDB'please input string 1:$*MESS2DB,please input a char:$*MESS3DB0AH,0DH; $'MESS4DB,no foundS1CHARDB?DATAENDSDATA1SEGMENTDATA1ENDSCODESEGMENTSTART:ASSUMECS:CODE,DS:DATA,ES:DATA1MOVAX,DATAMOVDS,AXMOVAX,DATA1MOVES,AXLEADX,MESSIMOVAH,9INT21HLEADX,MESS3MOVAH,9INT21HLEADX,STR1MOVAH,0AHINT21HLEADX,MESS3 MOVAH,9INT21HLEADX,MESS2MOVAH,9INT21HLEADX,MESS3MOVAH,9INT21HMOVAH,1INT21HMOVCHAR,ALLEADX,MESS3MOVAH,9INT21HMOVAL,CHARLEASI,STR 1MOVCL,[SI+1]MOVCH,0LOOP: CMPALJSI+2]JZLOINCSIDECCXJNZLOOPLEADX,MESS4MOVAH,9INT21HJMPEXITLO: MOVDL,CHARMOVAH,2INT21HEXIT: MOVAH,4CHINT21HCODE ENDSENDSTART;CH5EX6-1.ASM; 实验二删除字符NAMENAME2; 上机题2DATA SEGMENTDA DB0DH,0AHSTRIN DBThis is a very book$*COUNT DBS-STRINMESG DBODHQAH,删除字符的位置: $ ,N DB?DATA ENDS STACK SEGMENT PARA STACK 'STACK1DB100HDUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVDX,OFFSET STRINMOVAH,9INT21HMOVDX,OFFSET MESGMOVAH,9INT21HMOVAH,1INT21HANDAL,0FHMOVDI,OFFSET STRINMOVN,ALMOVCX,COUNT-NMOVAH,0ADDDI,AXMOVSI,DIINCSICLDREPMOVSBMOVDX,OFFSET DAMOVAH,9INT21HMOVDX,OFFSET STRINMOVAH,9INT21HNEXT:MOVAH,4CHINT21HCODEENDSENDSTART;CH5EX6-2.ASM; 实验二在给定的字符串中插入任意字符STACK SEGMENT PARA STACK 'STACK,DB 100HDUP(?)STACK ENDSDATA SEGMENTBUFFER DB SABDFABKGFS'N EQU $-BUFFERDB ?; $* MSSG1MSSG2DATADBDBENDSODH,OAH/Please input the insert position: $'0DH,0AH,'Please input the insert character: $'CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSET MSSG1MOVAH,9INT21HMOVAH,1INT21HANDAL,0FHMOVBX,OFFSET BUFFER+(N-1)LI:MOVAH,[BX]MOV[BX+1],AHCMPBL,ALJEL2DECBXJMPLIL2:MOVDX,OFFSET MSSG2MOVAH,9INT21HMOVAH,1INT21HMOV[BX],ALMOVDX,OFFSET BUFFERMOVAH,9INT21HMOVAH,4CHINT21HCODE ENDSEND START 第六章综合程序设计实验知识提要:本章主要进行综合性实验,包括两个实验,一是中断实验,二是学生成绩管理系统实验,涉及到的知识点包括:1 . 文件操作的功能调用( 1)建立并打开文件一3CH号功能>格式:MOV A X ,文件名及路径字符串所在单元段基址( 字符串以“0” 结尾)MOV DS, AXMOV D X ,文件名及路径字符串所在单元偏移量M O V C X ,文件属性( 与 FDT规定相同)MOV AH, 3CHINT21H>功能:按要求在指定位置建立一个文件并打开它,如果该文件已存在就将其长度变为“0 ”;如果该文件不存在就建立它。

返回参数:C F = 0,文件建立成功,A X 中返回文件号( 文件句柄) ;C F = 1 ,文件建立失败,AX中返回错误代码,3—路径未找到、4—打开文件太多、5—拒绝存取 2)打开文件一3DH号功能> 格式:M O V A X ,文件名及路径字符串所在单元段基址MOV DS, AXMOV D X ,文件名及路径字符串所在单元偏移量M O V A L,文件操作代码( 0:为读打开、1:为写打开、2:为读/ 写打开)MOV AH, 3DHINT21H>功能:打开指定位置上的文件,并使文件的读写指针位于文件的第一个字节上返回参数:C F=0,打开成功,A X 中返回文件号;C F=1,打开失败,AX 中返回错误代码,2—文件未找到、「 打开文件太多、5—拒绝存取、C—无效的文件操作代码 3)关闭文件一3EH号功能> 格式:MOV B X ,要关闭文件的文件号MOVAH, 3EHINT21H>功能:关闭指定位置上的文件返回参数:C F =0,关闭成功;C F =1,关闭失败,AX中返回错误代码,6—非法的文件号 4)读文件一3FH号功能>格式:M O V A X ,内存缓冲区段基址MOV DS, AXMOV D X ,内存缓冲区偏移量MOV C X ,字节数MOV B X ,已打开文件的文件号MOV AH, 3FH1NT21H>功能:将指定的文件读入DS: DX开始的内存缓冲区中。

返回参数:CF=O,读取成功,AX 中返回实际读入的字节数;C F = L 读取失败,AX 中返回错误代码, 5—拒绝存取、6—非法的文件号 5)写文件一40H号功能>格式:MOV A X ,内存缓冲区段基址MOV DS, AXMOV D X ,内存缓冲区偏移量MOV C X ,字节数MOV B X ,已打开文件的文件号MOV AH, 40HINT2IH>功 能:将DS: DX开始的内存缓冲区的内容定入指定的文件中返回参数:C F = 0,写成功,A X 中返回实际写入的字节数;C F = 1,写失败,AX中返回错误代码, 5- 拒 绝 存 取 、6—非法的文件号如果磁盘满,将认为是一个错误,但不返回错误代码 6)移动文件读/ 写指针一42H号功能> 格式:MOV C X ,文件指针相对位移量高位MOV D X ,文件指针相对位移量低位MOV B X ,已打开文件的文件号M OV AL,文件指针移动位置( 0—文件头加相对位移量、1—当前位置加相对位移量、2—文件尾加相对位移量)MOVAH, 42HINT21H>功 能:将文件的读写指针移到指定位置匕可用此功能求出文件的长度返回参数:C F =0,移动成功,DX、A X 中返回文件指针的新位置;C F =1,移动失败,AX中返回错误代码, 1—无效的功能号、6—非法的文件号。

2 . 中断的功能调用( 1)设置中断向量一25H号功能> 格式:M O V D S,中断服务程序入口地址段基址MOV D X ,中断服务程序入口地址偏移量MOV A L ,中断类型码MOVAH, 25HINT21H> 功能: 将DS: DX中的中断服务程序入口地址存入中断向量表中与中断类型码相对应的双字单元 2)中断向量一35H号功能> 格式:MOV A L ,中断类型码MOV AH, 35H1NT21H>功能:将中断向量表中与指定中断类型码相对应的双字单元中的中断服务程序入口地址的偏移量读入BX中,段基址读入ES中 3)程序结束并驻留一31H号功能> 格式:MOV D X ,驻留程序的长度( PSP与整个程序长度之和)MOV AL, 3 ( 出口代码)MOV AH, 31HINT21HA功能:终止程序执行并使之驻留内存DX中是驻留程序的长度( 以节为单位,程序各段节长度之和再加上PSP节长度20H) ; AL中为设置的退出该程序的出口代码,以供其它程序查阅退出该 程序的原因( 0— 正常终止、1—Ctrl+Break终止、2—关键设备错误终止、3—31H功能调用终止,其它程序可以用4DH功能调用进行查阅) 。

3 . 显示中断调用INT 10H有十七个子功能( 1) 0号子功能:设置显示方式> 格式:MOV AH, 0MOV A L ,显示方式号INT 10H>功能:将显示器设置成指定的显示方式 2) 1号子功能:设置光标大小> 格式:MOV AH, 1MOV C H ,光标起始线( bit4-bit0, bit6 = bit5 = 0 )MOV C L ,光标结束: 线( bit4-bitO)INT 10H>功能:设置显示器光标的大小该子功能适用于字符显示方式( 图形方式无光标) ,对于字符显示方式0 -3 ,起始线取值0 - 7 ,结束线取值0-7 3) 2号子功能:设置光标位置> 格式:MOV AH, 2M O V B H ,页 号 ( 在当前屏幕时BH = 0)MOV D H ,行 号 ( Y 坐标)MOV D L ,列 号 ( X 坐标)INT 10HA功能:设置显示器光标的位置该子功能适用于字符显示方式( 图形方式无光标) ,对于字符显示方式2、3, X取值0-79, Y取值0-24 4) 3号子功能:读光标位置> 格式:MOV AH, 3MOVBH, 0INT I OH> 功能:读显示器光标的位置。

该子功能适用于字符显示方式( 图形方式无光标) D H -光标当前行号D L -光标当前列号C H -光标起始线( 0-7)C L -光标结束线( 0-7)( 5) 4号子功能:读光笔位置> 格式:MOV AH, 4INT I OH> 功能:读显示器光笔的位置AH=0表示光笔未触发;AH=1表示光笔已触发DH一字符行号DL一字符列号C H -象素行号C L -象素列号( 6) 5号子功能:选择当前显示页> 格式:MOV AH, 5MOV A L ,当前显示页号INT I OH 功能:选择指定页号的页为当前显示页显示器每一屏( 也称为“ 页” )的显示信息都是存放在显示适配器的存储器( 称为显示缓冲区)中,显示缓冲区可以同时存储若干页显示信息,用户显示时可用该功能调用选取显示方式与可用的显示页号的关系是:显示方式可用页号0、10-7 (CGA)2、30-3 (CGA)2、3、0DH0-7 (EGA)0EH 0-3OFH、10H(EGA)0-1 (EGA)( 7) 6号子功能:屏幕上滚格式:MOV AH, 6MOV A L ,滚动行数( A L =0,则指定屏幕上为空白)M O V B H ,新插入行的字符属性M O V C H ,滚动的左上角行号MOV C L ,滚动的左上角列号M O V D H ,滚动的右下角行号MOV D L ,滚动的右下角列号INT 10H功能:屏幕上指定范围的内容向上滚动,底端插入空白行。

8) 7号子功能:屏幕下滚格式:MOV AH, 7MOV A L ,滚动行数( A L O ,则指定屏幕上为空白)M O V B H ,新插入行的字符属性MOV C H ,滚动的左上角行号MOV C L ,滚动的左上角列号MOV D H ,滚动的右下角行号MOV D L ,滚动的右下角列号INT 10H功能:屏幕上指定范围的内容向下滚动,顶端插入空白行 9) 8号子功能:读当前光标位置的字符及属性格式:MOV AH, 8M O V B H ,页号INT 10H功能: 将指定页当前光标位置字符( ASCII码) 读至UAL中;该字符属性读到AH中 属性格式如下:• 说明:闪 烁 ( BL=1闪烁)和 辉 度 ( 1=1高亮度)只用于前景色• 8种背景色的组合闪烁背景颜色前 景 颜 色Bit7Bit6Bit5Bit4Bit3Bit2BitlBitOBL红 ( R)绿 ( G)蓝 ( B)辉 度 ( I)红 ( R)绿 ( G)蓝 (B)R、G、B 的组合背景色0 0 0黑0、0、1蓝0、1、0绿0、1、1青1、0、0红 1 、0 、1紫1 、1 、0褐1 、1 、1白• 1 6 种前景色( 1 0 ) 9 号子功能:在当前光标位置上按指定属性写字符格式:M O V A H , 9I 、R 、G、B的组合背景色I 、R 、G、B的组合背景色0 、0 0 0黑0 0 0灰0 、 0 、 0 、 1蓝1 、 0 、 0 、 1浅蓝0 、 0 、 1 、 0绿1 、 0 、 1 、 0浅绿0 、 0 、 1 、 1事目 1 、 0 、 1 、 1浅青0 、 1 、 0 、 0红1 、 1 、 0 、 0浅红0 、 1 、 0 、 1品红1 、 1 、 0 、 1浅品红0 、 1 、 1 、 0棕1 、 1 、 1 、 0黄0 、 1 、 1 、 1灰白1 、 1 、 1 、 1白M O V AL,字符 A SC I I 码M O V BH,页号M O V B L , 字符属性M O V CX,写字符个数I N T 1 0 H功能:在指定页当前光标位置按指定属性写若干个( C X)字符。

I D 0 A H 号子功能:在当前光标位置上写字符格式:M O V A H , O A HM O V AL,字符 A SC I I 码MOVBH,页号M O V CX,写字符个数I N TI O H功能:在指定页当前光标位置按原来属性写若干个( C X)字符 1 2 ) 0 B H 号子功能:设置彩色调色板格式:M O V A H , O B HMOVBH,选择设置背景色/ 调色板( 0 / 1 )MOVBL,选择背景色号/ 调色板号( 0 - F / 0 - 1 )I N T 1 0 H功能:设置彩色调色板在字符方式下只能设置背景色,此时的背景色实际上是屏幕四周的边沿颜色( 非显示区) ,显示区字符颜色由字符属性决定在图形方式下既可设置作图的背景色,也可以设置作图的颜色( 即调色板颜色)•背景色编号0 - - 黑1 —蓝 2 - - 绿 3 —…青 4 一—红 5 — 粉红6 -- 棕 7 一 白 8 -- 灰 9 -- 浅蓝1 0 —浅绿 1 1 —浅青1 2 一粉 1 3 —浅粉红 1 4 —黄 1 5 一亮白• 调色板及颜色选择调色板号供 选 择 的 颜 色00 一与背景色同1 —绿2 —红3 —棕10 一与背景色同1 —青2 —粉红3 - 白 ( 13) OCH号子功能:写一个象素点> 格式:MOV AH, OCHMOV A L ,象素点颜色值( 见调色板及颜色选择)M O V B H ,页号MOV C X ,象素列号( 0-319 或 0-639 即 EGA/VGA)MOV D X ,象素行号( 0-199或 0-479即 £ 6 4 丫 6 人)INT 10H>功能:图形方式下在指定页指定坐标位置以指定颜色写一个象素点。

当显示方式为“ 6 ” 时( 640*200—2色图形) , 象素点颜色值只取“0” 和 “ 1”; 显示方式为4、 5时, 象素点颜色值取0-3 14) 0DH号子功能:读一个象素点> 格式:MOV AH, 0DHMOV B H ,页号MOV C X ,象素列号( 0-319 或 0-639 即 EGA/VGA)MOV D X ,象素行号( 0-199 或 0-479 即 EGA/VGA)INT 10H>功能:读取指定象素点颜色值于AL中 15) OFH号子功能:读当前显示方式> 格式:MOV AH, OFHINTI OH>功能:读取当前显示方式AL- 显示方式号A H -屏幕显示的字符列数B H -当前显示页号( 16) 13H号子功能:写字符串> 格式:MOV AH, 13HMOV A L ,字符串的显示方式及结构代码M O V B H ,页号MOV C X ,字符串的长度M O V D X ,字符串显示的起始位置( DH:行号;DL:列号)MOV E S ,字符串所在段的段基址MOV B P ,字符串首字符段内偏移量INT 10H>功能:在指定位置按指定属性写一个字符串。

•字符串的显示方式及结构代码字符串的显示方式及结构代码( AL)字符串的结构显示结束后光标的位置0字符,字符,……,字符,字符在字符串的第一个字符位置上1字符,字符,……,字符,字符在字符串的最末字符位置之后2字符,属性,……,字符,属性在字符串的第一个字符位置上3字符,属性,……,字符,属性在字符串的最末字符位置之后4 . 中断的相关知识( 1)中断概述>什么是中断计算机在执行程序的过程中由于随机原因而被中途打断的现象>断点 例行程序被中断的位置称为断点假设例行程序在第n 条指令处中断,则第n+1条指令位置就是断点为了使中断处理完后程序的执行方向能顺利地返回断点处的例行程序,对断点处的相关信息 ( 断点地址和现场信息)必须进行必要的保护和恢复,这将通过指令或CPU 自动完成>中断技术的主要应用• 及时处理计算机中的突发事故:掉电、溢出、内存出错等• 协调快速CPU与慢速外设的矛盾• 实时处理控制现场的参数和信息( 2)中断源和中断类型码>中断源:引起中断的原因或中断信号的来源,称为中断源• 外部中断源如果中断信号来自CPU的外部,称外部中断源,外部中断源引起的中断称为外中断第一、 非屏蔽中断( NMD:该中断不受IF的限制,即无论IF是 “0” 还 是 “ 1”,非屏蔽中断一定会被CPU所接受。

该中断一般用来处理特别紧急的情况,如电源掉电等第二、 屏蔽中断( INTR) :该中断受IF的限制,即屏蔽中断是否被CPU响应受CPU中断的开放情况的控制如果CPU开 中 断 ( IF=1) , 则屏蔽中断可被CPU响应;如果CPU关中断 ( IF R ) , 则屏蔽中断不能被CPU响应这是一般输入输出设备的中断第三、 CPU的IF状态可由指令进行设置STI使IF=1; CLI使IF=0第四、 如果非屏蔽中断源或屏蔽中断源多于一个,则通常将多个非屏蔽中断源通过中断控制芯片8259接8086/8088的非屏蔽中断请求输入端NMI;将多个屏蔽中断源通过中断控制芯片8259接8086/8088的屏蔽中断请求输入端INTR• 内部中断源:如果中断信号来自CPU的内部,称内部中断源,内部中断源引起的中断称为内中断第一、 除法出错中断:当除数为“0” 或商过大时将产生除法出错中断第二、 溢出中断( INTO) :执行该指令时,如果OF=1则产生中断,否则不产生中断;而执行INT4时不管OF的状态,直接产生溢出中断第三、 单步中断:如果TF=1, CPU进入单步工作方式,即每执行一条指令CPU都停下来等待用户检查执行结果,然后再执行。

这是用户调试程序的强有力的手段;TF=0不是单步工作方式第四、 软中断指令INTn:为了提高用户的编程效率,系统提供了两组专用于输入、输出、文件处理的功能子程序供用户直接调用,一组在ROM BIOS中;另一组在MS_DOS系统中用户只须使用软中断指令通过适当的方式就可以很方便的调用它们>中断类型码8086/8088为每一个中断源分配一个中断类型码,当中断发生时,系统将根据中断源的中断类型码在中断向量表中找到该中断源的中断服务程序入口地址,从而转向对应的中断服务程序中断类型码中有些是系统专用的, 另外一些可以由用户自己通过8259来编程确定, 用户自行确定的中断类型码范围为32-255号 3) 中断向量表为了在中断发生时. ,CPU执行程序的方向顺利地转到相应的中断服务程序的入口,系统事先将所有中断源的中断服务程序的入口地址存储到内存0000: 0000H-0000 : 03FFH中,如图所示:从图中可以看出,只要知道了中断源的中断类型码,就可以从中断向量表中知道中断服务程序入口地址表地址,从而可以知道中断服务程序入口地址,最后转向中断服务程序它们的关系是:IP_LOW - [ 中 断 类 型 码 * 4]IP_HIGH _[ 中断类型码*4+1]CS_LOW - [ 中断类型码*4 + 2] CS_HIGH _[ 中断类型码*4 + 3]而中断类型码是在中断发生时由CPU 自动获取的,所以只要设好了中断向量表,中断发生时CPU就能自动响应中断,转向中断服务程序。

入口地址表地址M0000:0000H中断服务程序入口地址IP低 8 位中断类型码:00000:0001H中断服务程序入口地址IP 高 8 位0000:0002H中断服务程序入口地址CS低 8 位0000:0003H中断服务程序入口地址CS高 8 位0000:0004H中断服务程序入口地址IP低 8 位中断类型码:10000:0005 H中断服务程序入口地址IP高 8 位0000:0006H中断服务程序入口地址C S低 8 位0000:0007H中断服务程序入口地址C S高 8 位0000:0008H中断服务程序入口地址IP低 8 位中断类型码:20000:0009H中断服务程序入口地址IP 高 8 位0000:000AH中断服务程序入口地址C S低 8 位0000:000BH中断服务程序入口地址C S高 8 位■■中断服务程序入口地址IP 低 3 位中断类型码:n中断服务程序入口地址IP 高 8 位中断服务程序入口地址C S低 8 位中断服务程序入口地址C S高 8 位1■(0000:03F8H中断服务程序入口地址1P低 8 位中断类型码:2540000:03F9H中断服务程序入口地址IP 高 8 位0000:03FAH中断服务程序入口地址C S低 8 位()000:03FBH中断服务程序人口地址CS ISJ 8 位00(X):03FCH中断服务程号人口地址IP 低 8 2中断类型码:2550000:03FDH中断服务程序人1 」 地址1P高 8 位0000:03FEH中断服务程序入口地址C S低 8 位0000:03FFH111断服务程序入口地址C S高 8 位(4)中断优先级> 优先级问题在系统的众多中断源中,根据它们的轻重缓急分配一个处理的先后顺序,称为优先级,这样,当某一时刻有多个中断源同时申请中断时,CPU将自动选择优先级最高的中断源进行处理,优先级最高的中断源处理完之后才处理优先级较低的中断源。

当 CPU正在处理低级中断时,如果有更高级的中断请求发生,CPU将中止低级的中断处理,而为高级中断源服务,在高级中断源的中断处理完毕之后,再返回继续进行原来的低级中断处理,这就是中断的嵌套> 优先级顺序从高到低的顺序为:除法出错、INTn、INTO f NMI - INTR f 单步中断⑸中断过程A中断请求 CPU响应, 11断的前提是必须要有中断源提出中断请求,不同的中断源产生U I断请求的条件各不相同,输入设备在待输入一个字符时请求中断:输出设备在待输出 个字符时请求中断:除法出错中断是在除数为"0 ” 或商过大时请求中断>中断响应CPU在每一条指令执行完后都要查询是否有中断请求,如有,则将按各中断源优先级的顺序进行查询,查询到有中断请求的中断源,然后读取中断类型码,由CPU 自动完成如下操作后转向相应的中断服务程序• IF、TF置 “0",避免CPU正在进行下列操作时响应其它中断;• FR压入堆栈;• CS、IP ( 断点,相当于子程序调用的调用点)压入堆栈;• IP_LOW - [ 中断类型码* 4]IP_H1GH - | 中断类型码*4+1]CS_LOW - [ 中断类型码*4 + 2]CS_HIGH -[ 中断类型码*4 + 3]转中断服务程序。

>中断处理实际上就是中断服务子程序,体现该中断发生后要求处理的具体内容,各中断源的要求是各不相同的,但其基本结构是相似的,结构如下:中断服务程序名PROC FAR保护现场指令序列CPU开 中 断 ( 如果允许中断嵌套)中断处理指令序列恢复现场指令序列中断返回指令( IRET)中断服务程序名ENDP>中断返回中断返回是由指令IRET完成的,其具体操作为:IP_LOW _ [SP + 0]IP_HIGH _ [SP+ 1]CS_LOW - [SP + 2]CS_HIGH - [SP+3]FR弹出堆栈最后SP复原实验一 中断实验( 综合性实验)一、实验要求和目的1 . 熟悉中断的相关知识;2 , 熟悉MS-DOS中有关程序驻留与设置中断向量的功能调用;3 . 掌握中断处理程序的设计方法 二、软硬件环境1 .硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 .软件环境:装有MASM5.0、DEBUG、LIN K和EDIT等应用程序三、实验涉及的主要知识单元1、中断服务程序结构( 1)设置中断向量;( 2 )中断服务程序驻留;( 3 )中断处理;( 4 )主程序;2、中断服务程序编写示例编写一个中断服务程序及相应的主程序,当INT 31H发生时模拟中断的全过程,在中断服务程序中给出相应的提示。

d a t a s e g m e n tm s l d b I n t e r r u p t S e r ve r P r o g r a m 'd b J H a n d le r I n s t a lle d !d a t a e n d ss t a c kl s e g m e n t s t a c kd w 2 O h d up ( ?)s t a c kl e n d sc o d e s e g m e n ta s s um e c s : c o d e , d s : d a t a , s s : s t a c kls t a r t : m o v a x, c sm o v d s , a x ;中断服务程序入口地址段基址le a d x, d ivz e r ;中断服务程序入口地址段内偏移量m o v a x, 2 5 3 lhin t 2 1h ;在中断向量表中设置中断服务程序入口地址( 用D EBUG看)m o v a x, d a t am o v d s , a xm o v d x, o f f s e t m s lm o v a h , 9in t 2 1h ;显示中断服务程序已经安装m o v d x, 2 1h ; P S P +数据段+堆栈段+代码段;( 100H + 3 0H + 4 0H + 9 7H )字节m o v a x, 3 103 hin t 2 1h ;安装中断服务程序m s 2 d b ' H a s w e n t t o in t e r r up t s e r ve r p r o g r a m 'd b O d h , O a h , * Co n t in ue o r Q uit ( C/ Q ) ?$, d ivz e r p r o c f a r;中断服务程序s t i ;CP U开中断p us h a xp us h b xp us h e xp us h d xp us h s ip us h d ip us h b pp us h d sp us h e s ;m o v a x, c s保护现场m o v d s , a x;设置D Sm o v d x, o f f s e tm o v a h , 9m s 2in t 2 1h ;显示提示信息,表示已转中断服务程序n e xt :m o v a h , 8in t 2 1h ;e m p a l, ' C'je c o n t ine m p a l, ' c 'je c o n t ine m p a l, ' Q 'je e xite m p a ], , q ,je e xitjm p n e xt无回显输入字符,以选择方向e xit :m o v a h , 4 c hin t 2 1h ;输 入“ Q ”或"q ”返回D O Sc o n t in : p o p e sp o p d sp o p b pp o p d ip o p s ip o p d xp o p e xp o p b xp o p a x;恢复现场ir e t;输 入“ C ”或"c ”中断返回继续原程序d ivz e r e n d pc o d ee n d se n d s t a r t用于验证上述中断服务程序的主程序:c o d e s e g m e n ta s s um e c s : c o d es t a r t : in t 3 1h ;发生3 1H号中断,转中断服务程序 m o v a h , 2 ;如果选择继续,中断返回后要执行的程序m o v d l, O a hin t 2 1h ;换行m o v d l, O d hin t 2 1h ;回车m o v d l, ' Y'in t 2 1h ;显 示 “ Y” ,表示中断已返回m o v a h , 4 c hin t 2 1hc o d e e n d se n d s t a r t四、实验内容与步骤1、实验内容( 1 ) 编写主程序程序,从键盘输入一个字符串;( 2 ) 编写中断服务程序程序,当 I N T 3 3 H 发生时将输入字符串中的所有小定字符转换为大定字符并显示该字符串,然后返回主程序。

2 、实验步骤( 1) 预习中断、M S - D O S 功能调用的相关知识,根据实验内容,画出流程图;( 2 ) 利用ED I T或其他编辑软件,编写汇编源程序,取名为“ c h 6e xl. AS M( 主程序) ” 、“ c h 6e x2 . AS M( 中断服务程序) ”;( 3 ) 汇编、连接该源程序,产生 “ c h 6e xl. EX E"、“ c h 6e x2 . EX E” ;( 4 ) 运 行 “ c h 6e x2 . EX E”驻留中断服务程序,利 用 DE B U G查看内存0000: 0 0 C C H 双字单元内容( 中断程序入口地址) :( 5 ) 用 U 命令从中断服务程序入口地址开始验证是否是中断服务程序;( 6) 运行c h 6e xl. AS M, 查看结果是否正确五、实验要求与提示1、画出各程序流程图;2 、列出程序清单,加上适量注释;3 、回答思考问题;4 、记录实验结果六、思考与练习以及测评标准1、中断向量表位于内存的什么位置,其作用是什么? 2、中断服务程序入口地址在中断向量表中的位置与中断类型码有何关系?3、中断发生之后CPU自动完成哪些工作?实验二 学生成绩管理系统设计实验( 综合性实验)一、实验要求和目的1 .熟悉汇编语言程序结构;2 .熟悉INT 21H的文件操作功能调用;3 .熟悉INT 21H的1、9号功能和INT 10H常用功能的使用方法;4 .掌握多模块程序设计方法;二、软硬件环境1 .硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;2 .软件环境:装有MASM5.0、DEBUG、LIN K和EDIT等应用程序。

三、实验涉及的主要知识单元对于一个复杂的程序,往往是分成若干个模块设计的,然后用LIN K将它们连接成一个完整的程序这些模块之间是相互联系的,如变量、标号、符号的相互引用等,为了引用,必须先对它们进行说明一个变量、标号、符号,如果未作说明,则它们是局部标识符,只能供本模块使用,只有将它们说明成全局标识符之后,才能为其它模块所使用1 .全局标识符说明伪指令PUBLIC⑴格式PUBLIC标识符1,标识符2,, 标识符n⑵功能将其后的标识符说明为全局标识符,以便在其它模块中引用该指令可出现在源程序的任意位置上2 .全局标识符引用说明伪指令EXTRN(1)格式EXTRN标识符1:类型, 标识符2:类型, . . . . . . . 标识符n:类型其中类型为:变量名:BYTE、WORD、DWORD标号或过程名:FAR、NEAR符号名:ABSo(2)功能 对本模块将要引用的其它模块的标识符进行说明,否则不能引用四、实验内容与步骤1、实验内容设计一个学生成绩管理系统,要求完成文件建立、学生成绩录入、显示指定学号的学生记录、删除- -个学生的记录、修改学生记录、返回等工作学生成绩包括学号(XH)、姓名(XM)、数学(SX)、语文(YW)、外语(WY)字段。

2、实验步骤( 1 ) 编写主程序m ain.asm,实现如图所示菜单,汇编产生目标程序main.obj;( 2 ) 编写文件创建程序create.asm,实现在指定盘指定文件夹下建立一个指定名称的文件,汇编产生目标程序create.obj,界面如图所示;( 3 ) 编写成绩录入程序append.asm,实现在指定文件尾部插入一个学生的成绩,汇编产生目标程序append.obj,界面如图所示; ( 4)编写显示程序display.asm,实现按指定学号显示一个学生的记录, 汇编产生目标程序display.obj,界面如图所示;C r C: \DOCUIE~ 1 \~ 1 \桌面, 袁建文 ~ 1 \1A IN . EXE-□ xXueHao :XingMing:ShuXue:YuWen :WaiVu:P ress any key8g1n00a0862kl99(5)编写修改程序modify.asm,实现按指定学号修改一个学生的记录字段( 不需修改直接回车) ,汇编产生目标程序modify.obj,界面如图所示; ( 6 ) 编写删除程序delete.asm,实现按指定学号删除一个学生的记录,汇编产生目标程序delete.obj,界面如图所示;c < C: \DOCUIE~1 \A D ・ nn~l \桌面、 新建文~1 \IA工 机 EXEBEIE3Please input f ilenane: f : \kang.datPlease input XH: 2018( 7) main.obj、 create.obi> append.obj> modify.obj> display.obj、 delete.obj 产生可执彳『 文件 main.exe。

五、实验要求与提示1、实验要求( 1 ) 画出各程序流程图:( 2 ) 列出程序清单,加上适量注释;( 3 ) 回答思考问题;( 4 ) 记录实验结果2、实验提示( 1 ) 用 INT 21H的 1 号功能输入字符串时可用回车键作为输入结束标志;( 2 ) 创建文件时可以班为单位进行,可以指定文件名的盘符、路径等 六、思考与练习以及测评标准1 . INT 21H的 9 号功能与INT10H各有何特点?2 . 如 何 用 INT10H实现清屏的功能?3 . 文件在使用之前为何要打开?使用后为何要关闭?怎样计算文件的长度和移动文件的读写指针?七、参考程序1. Main.asmextrn append:far,display:far,modify:far,delete:far,create:fardata segmentda db '1. Append a record $'db '2. Display a record $'db '3. Modify a record $'db *4. Delete a record $'db '5. Create file $'db '6. Return DOS $*db ' Please input 1— 6:$'data endsstack 1 segment stackdw 100 dup(?)stack 1 endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds, axnext 1: mov ah, 6mov al,0mov bh,7mov cx,0mov dx,184fhint lOhmov si,0mov ex,7mov dh,9mov dl,19hnext2: mov ah,2mov bh,0int lOhpush dxlea dx,daadd dx,simov ah,9int21hpop dx appe:disp:modi:dele:crea:exitO:codeinc dhadd si,16hloop next2mov ah, 1int 21hcmp al,31hjzappecmp al,32hjz dispcmp al,33hjz modicmp al,34hjz delecmp al,35hjz creacmp al,36hjz exitOjmp nextlcall appendjmp nextlcall displayjmp nextlcall modifyjmp nextlcall deletejmp nextlcall createjmp nextlmov ah,4chint21hendsend start2. Create.asmpublic createdatabufferpathhandledadatacodecreatesegmentdb?db 100 dup(O)dw ?db "Please input filename:$"endssegmentproc farassume cs:code,ds:data,es:datastart:push dsmov ax,data mov ds,axmov es,axmov ah,6mov al,0mov bh,7mov cx,0mov dx,184fhint lOhmov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,damov ah,9int 21 hlea di,pathnext 1:mov ah,lint21hcmp al,Odhjz exitOmov [di],alinc dijmp nextlexitO:lea dx,pathmov ah,3chmov cx,0int 21 hmov handle,axmov ah,40hmov bx,handlemov cx,0mov dx,offset bufferint21hmov ah,3ehmov bx,handleint21hpop dsretcreatecodeendpendsend3. Append.asmpublic appenddata segment person structxh db "$$$$$$$$$$$$$$$$"name db "$$$$$$$$$$$$$$$$"maths db "$$$$$$$$$$$$$$$$"Chinese db "$$$$$$$$$$$$$$$$"english db "$$$$$$$$$$$$$$$$"d Dpath db 32 dup(O)handle dw ?daO db "Please input filename:, ”da db "Please input XH:$Mdb "Please input XM:$"db "Please input SX:$Udb "Please input YW:$”db "Please input WY:$ndata endscode segmentappend proc farassume cs:code,ds:data,esrdatastart: push dsmov ax,datamov ds,axmov es,axmov ah,6mov al,0mov bh,7mov cx,0mov dx,l84fhint lOhmov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,daOmov ah,9int 21hlea di,pathnext 1: mov ah,lint 21 hcmp al,Odhjz exitOmov [di],alinc di jmp nextlexitO: mov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov bx,0mov si,0mov ex,5mov dh,9mov dl,19hnext2: mov ah,2mov bh,0int lOhpush dxlea dx,daadd dx,simov ah, 9int21hpush bxlopl: mov ah, 1int21hemp al,Odhjz exitlmov buffer[bx],alinc bxjmp loplexitl: pop bxadd bx,10hpop dxinc dhadd si,Hhloop next2lea dx,pathmov ax,3doi hint21hmov handle,axmov cx,0mov dx,0mov bx,handlemov ax,4202hint21hmov ah,40hmov bx,handlemov ex,type person mov dx,offset bufferint21hmov ah,3ehmov bx,handleint 21hpop dsretappend endpcode endsend4. Display.asmpublic displaydata segmentpath db 32 dup(O)buffer db8192 dup(O)key db 16 dup(O)count 1 dw ?count2 dw ?addrl dw ?handle dw ?Csize dw ?daO db 'Please input filename:$'dal db 'Please input XH:$'da2 db 'Cannot find,press any key return !$'da3 db *XueHao: $,db *XingMing: $'db ShuXue: $'db TuWen: $'db WaiYu: $'da4 db Press any key return!$'data endscode segmentdisplay proc farassume cs:code,ds:data,es:datastart: push dsmov ax,datamov ds,axmov es,axmov ah,6mov al,0mov bh,7mov cx,0mov dx,184fhint lOhmov dh,9 mov dl,19hmov ah,2mov bh,0int lOhlea dx,daOmov ah,9int21hlea di,pathnext 1: mov ah,lint 21hcmp al,Odhjz exitOmov [di],alinc dijmp nextlexitO: mov dh,10mov dl,19hmov ah,2mov bh,0int lOhlea dx,dalmov ah,9int 21hmov bx,0lea di,keynext2: mov ah,lint 21hcmp al,Odhjz exitlmov [di],alinc diinc bxjmp next2exitl: mov countl,bxlea dx,pathmov al,0mov ah,3dhint21hmov handle,axmov ah,42hmov al,2mov bx,handlemov cx,0mov dx,0int21hmov Csize,ax mov ah,42hmov al,0mov cx,0mov dx,0int 21hmov ah,3fhmov bx,handlemov cx,Csizelea dx,bufferint 21hmov ah,3ehmov bx,handleint21hmov dx,0mov ax,f_sizemov bx,8Odiv bxmov count2,axmov dx,count2mov bx,off set buffernext4: mov si,-lmov di,-lmov ex,count 1next3: inc siinc dimov al,key[di]emp aljbx+si]loopz next3jz foundadd bx,80dec dxjnz next4mov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,da2mov ah,9int 21h mov ah,8int21hjmp returnfound: mov addrl,bxmov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOh;mov bx,0mov si,0mov ex,5mov dh,9mov dl,19hnext5: mov ah,2mov bh,0int lOhpush dxlea dx,da3add dx,simov ah,9int 21hmov dx,addrladd addrl,16mov ah, 9int 21 hpop dxinc dhadd si,l Ihloop next5mov ah, 2mov bh,0int lOhlea dx,da4mov ah,9int21hmov ah, 8int21hreturn: pop dsretdisplay endpcode endsend5. modify.asm public modifydata segmentpath db 32 dup(O)buffer db8192 dup(O)key db 16 dup(O)count 1 dw ?count2 dw ?addrl dw ?handle dw ?Csize dw ?daO db Tlease input filename:$'dal db 'Please input XH:$'da2 db *Cannot find,press any key return!$'da3 db 'XueHao: $'db fXingMing: $*db 'ShuXue: $'db *YuWen: $'db WaiYu: $'da4 db 'Success,Press any key return!$,data endscode segmentmodify proc farassume cs:code,ds:data,esrdatastart: push dsmov ax,datamov ds,axmov es,axmov ah,6mov al,0mov bh,7mov cx,0mov dx,184fhint lOhmov dh,9mov dl ,19hmov ah,2mov bh,0int lOhlea dx,daOmov ah,9int 21hlea di,pathnext 1: mov ah Jint21hcmp al,Odhjz exitO mov [di],alinc dijmp nextlexitO: mov dh,10mov dl,19hmov ah,2mov bh,0int lOhlea dx,dalmov ah,9int 21hmov bx,0lea di,keynext2: mov ah, 1int21hcmp al,Odhjz exitlmov [di],alinc diinc bxjmp next2exitl: mov count 1 ,bxlea dx,pathmov al,2mov ah,3dhint21hmov handle,axmov ah,42hmov al,2mov bx,handlemov cx,0mov dx,0int 21hmov Csize,axmov ah,42hmov al,0mov cx,0mov dx,0int 21hmov ah,3fhmov bx,handlemov ex,匚sizelea dx,bufferint21hmov dx,0mov ax,匚size mov bx,8Odiv bxmov count2,axmov dx,count2mov bx,offset buffernext4: mov si,-lmov di,-lmov ex,count 1next3: inc siinc dimov al,key [di]emp al,[bx+si]loopz next3jz foundadd bx,80dec dxjnz next4mov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov dh,9mov dl ,19hmov ah,2mov bh,0int lOhlea dx,da2mov ah,9int21hmov ah, 8int21hjmp returnfound: mov addrl,bxmov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov si,0mov ex,5mov dh,9mov dl,19hnext5: mov ah,2 mov bh,0int lOhpush dxlea dx,da3add dx,simov ah,9int21hmov dx,addrlmov ah, 9int 21hpop dxpush dxadd dl,16mov ah,2mov bh,0int I Ohmov bx,addrladd addrl,16lopl: mov ah, 1int21hcmp al,Odhjz exit2mov [bx],alinc bxjmploplexit2: pop dxinc dhadd si,l Ihloop next5mov ah,42hmov al,0mov bx,handlemov cx,0mov dx,0int21hmov ah,40hmov bx,handlemov ex,匚sizemov dx,offset bufferint 21hmov ah,6mov al,0mov bh,7mov cx,0mov dx,l 84fhint lOh mov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,da4mov ah,9int21hmov ah, 8int 21 hreturn: mov ah,3ehmov bx,handleint21hpop dsretmodify endpcode endsend6. Delete.asmpublic deletedata segmentpath db 32 dup(O)buffer db8192 dup(O)key db 16dup(0)count 1 dw ?count2 dw ?addrl dw ?handle dw ?Lsize dw ?daO db 'Please input filenames'dal db Please input XH:$'da2 db *Cannot find,press any key return!$'da3 db 'Success,Press any key return !$*data endscode segmentdelete proc farassume cs:code,ds:data,es:datastart: push dsmov ax,datamov ds,axmov es,axmov ah,6mov al,0mov bh,7mov cx,0 mov dx,l 84fhint lOhmov dh,9mov dl ,19hmov ah,2mov bh,0int lOhlea dx,daOmov ah,9int 21hlea di,pathnext 1: mov ah Jint21hcmp al,Odhjz exitOmov [di],alinc dijmp nextlexitO: mov dh,10mov dL19hmov ah,2mov bh,0int lOhlea dx,dalmov ah,9int21hmov bx,0lea di,keynext2: mov ah,lint21hcmp al,Odhjz exitlmov |di],alinc diinc bxjmp next2exitl: mov countl,bxlea dx,pathmov al,2mov ah,3dhint 21hmov handle,axmov ah,42hmov al,2mov bx,handlemov cx,0 mov dx,0int21hmov f_size,axmov ah,42hmov al,0mov cx,0mov dx,0int21hmov ah,3fhmov bx,handlemov ex,匚sizelea dx,bufferint21hmov dx,0mov ax£sizemov bx,8Odiv bxmov count2,axmov dx,count2mov bx,off set buffernext4: mov si,-lmov di,-lmov ex,count 1next3: inc siinc dimov al,key[di]emp aljbx+si]loopz next3jz foundadd bx,80dec dxjnz next4mov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,da2mov ah,9int 21h mov ah,8int21hjmp returnfound: mov addrl,bxmov ah,42hmov al,0mov bx,handlemov cx,0mov dx,addrlmov si,offset buffersub dx,sipush dxint21hmov ah ,40hmov bx,handlemov ex,匚sizepop dxsub cx,dxsub ex,80mov dx,addrladd dx,80int 21hmov ah,6mov al,0mov bh,7mov cx,0mov dx, 184fhint lOhmov dh,9mov dl,19hmov ah,2mov bh,0int lOhlea dx,da3mov ah,9int 21hmov ah,8int21hreturn: mov ah,3ehmov bx,handleint 21hpop dsretdelete endpcode endsend 附录附录一 8086指令系统一览表耨汇编指令格式功 能操作数说明时钟周期数字节数数MOV dst, src(dst) — (src)mem, reg9+EA2 -4据reg, mem8+EA2 〜 4传reg, reg22送reg, imm42 〜 3类mem, imm10+EA3 〜 6seg, reg22seg, mem8+EA2 〜 4mem, seg9+EA2 〜 4reg, seg22mem, acc103acc, mem103PUSH src(SP) - (SP)-2reg111((SP)+1,(SP)) - (src)seg101mem16+EA2 〜 4POPdst(dst) 一 ((SP)+1,(SP))reg81(SP) ― (SP)+2seg81mem17+EA2 -4XCHG opl,op2(opl) - " (opl)reg, mem17+EA2 〜 4reg, reg42reg, acc31IN acc, port(acc) *- (port)102IN acc, DX(acc) 一 ((DX))81OUT port, acc(port) — (acc)102OUT DX, acc((DX)) - (acc)81XLAT111LEA reg, src(reg) - srcreg, mem2+EA2 -4LDS reg, src(reg) src(DS) *- (src+2)reg, mem16+EA2 〜 4LES reg, src(reg) - src(ES) - (src+2)reg, mem16+EA2 〜 4LAHF(AH) 一 (FR低字节)41SAHF(FR低字节) 一(AH)41PUSHF(SP) — (SP)-2((SP)+1,(SP)) — (FR 低字节)101POPF(FR 低字节) 一((SP)+1,(SP))(SP) ― (SP)+281 算ADD dst, src(dst) — (src) + (dst)mem, reg16+EA2 〜 4术reg, mem9+EA2 〜 4运reg, reg32算reg, imm43 〜 4类mem, imm17+EA3 〜 6acc, imm42 〜 3ADC dst, src(dst) — (src) + (dst) + CFmem, reg16+EA2 〜 4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm17+EA3 〜 6acc, imm42 〜 3INC opl(opl) - (op 1)+1reg2~31 ~2mem15+EA2 〜 4SUB dst, src(dst) — (src) - (dst)mem, reg16+EA2 〜 4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm17+EA3 〜 6acc, imm42 〜 3SBB dst, src(dst) — (src) - (dst) - CFmem, reg16+EA2 〜 4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm17+EA3 〜 6acc, imm42 〜 3DEC opl(opl) — (opl) - 1reg2 〜 31〜 2mem15+EA2 〜 4NEG opl(opl) - 0- (opl)reg32mem16+EA2 〜 4CMPopl, op2(opl)-(op2)mem, reg9+EA2 〜 4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm10+EA3 〜 6acc, imm42 〜 3MUL src(AX) - (AL) * (src)8 位 reg70 〜 7728 位 mem(76 〜 83)+EA2 〜 4(DX, AX) - (AX) * (src)16 位 reg118〜 133216 位 mem(124〜 139)+EA2 〜 4IMULsrc(AX) — (AL) * (src)8 位 reg80-9828 位 mem(86 〜 104>4-EA2 〜 4(DX, AX) — (AX) * (src)16 位 reg128 〜 154216 位 mem(134- 160)+EA2 〜 4 DIV src(AL) — (A X )/(src)的商8 位 reg80 〜 902(AH) — (AX) / (src)的余数8 位 mem(86 〜 96)+EA2 〜 4(AX) 一 (D X ,A X )/(src)的商16 位 reg144 〜 1622(DX) 一 (D X ,A X )/(src)的余数16 位 mem(150〜 168)+EA2 〜 4IDIV src(AL) - (A X )/(src)的商8 位 reg101 〜 1122(AH) - (AX) / (src)的余数8 位 mem(107- 118H-EA2 〜 4(AX) 一 (DX ,AX )/(src)的商16 位 reg165 〜 1842(DX) 一 (D X ,A X )/(src)的余数16 位 mem(171-19QWEA2 〜 4DAA(AL) - AL中的和调整为组合BCD41DAS(AL) - AL中的差调整为组合BCD41AAA(AL) - AL中倾口调整为粗且合BCD(AH) - (AH)+调整产生的进位值41AAS(AL) - AL中的差调整为;| 四合BCD(AH) - (AH)-调整产生的进位值41AAM(AX) - AX中断只调酬非组合BCD832AAD(AL) — (AH)* 10+ (AL)(AH) - 0( 注意是除法进行前调整被除数)602逻AND dst, src(dst) — (dst) A (src)mem, reg16+EA2~4辑reg, mem9+EA2 〜 4运reg, reg32算reg, imm43 〜 4类mem, immI7+EA3 〜 6acc, imm42 〜 3OR dst, src(dst) — (dst) V (src)mem, regI6+EA2 〜 4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm17+EA3 〜 6acc, imm42 -3NOT op 1(opl) — (opl)reg32mem16+EA2 〜 4XOR dst, src(dst) — (dst) ® (sic)mem, reg16+EA2~4reg, mem9+EA2 〜 4reg, reg32reg, imm43 〜 4mem, imm17+EA3 〜 6acc, imm42 〜 3TEST opl, op2(opl) A (op2)reg, mem9+EA2 -4reg, reg32reg, imm53 〜 4mem, imm11+EA3 〜 6acc, imm42 〜 3 SHLopl, 1SHLopl,CL逻辑左移regmemregmem215+EA8 + 4/bit20+EA+ 4/bit22 〜 422 〜 4SAL op 1, 1算术右移reg22mem15+EA2 〜 4SAL op 1, CLreg8 + 4/bit2mem20+EA+ 4/bit2 〜 4SHRopl, 1逻辑右移reg22mem15+EA2 〜 4SHR opl,CLreg8 + 4/bit2mem20+EA+4/bit2 〜 4SAR opl, 1算术右移reg22mem15+EA2 〜 4SAR opl,CLreg8 + 4/bit2mem20+EA+ 4/bit2 〜 4ROLopl, 1循环左移reg22mem15+EA2 〜 4ROLopl,CLreg8 + 4/bil2mem20+EA+ 4/bit2 〜 4ROR opl, 1循环右移reg22mem15+EA2 〜 4ROR opl, CLreg8 + 4/bit2mem20+EA+4/bit2 〜 4RCLopl, 1带进位位的循环左移reg22mem15+EA2 〜 4RCLopl,CLreg8 + 4/bit2mem20+EA+ 4/bit2 〜 4RCR opl, 1带进位位的循环右移reg22mem15+EA2 〜 4RCR opl,CLreg8 + 4/bit2mem20+EA+ 4/bit2 〜 4串MOVSB((DI)) 一 ((SI))不重复:181操(SI) - (SI)±I,(DI) - (DI)±1重 复 : % 17/rep作MOVSW((DI)) 一 ((SI))不重复:181类(SI) - (SI) ±2, (DI) - (DI) ±2重复: 9+17/repSTOSB((DI)) - (AL)不重复:111(DI) 一 (DI)± 1重复: 9+10tepSTOSW((DI)) - (AX)不重复:111(DI) - (DI)±2重复: 9+l(VrepLODSB(AL) 一 ((SI))不重复:121(SI) 一 (SI)±1重复: 9+13/repLODSW(AX) 一 ((SI))不重复:121(SI) - (SI)±2重复: 9+13/rep CMPSBCMPSW((SI))-((DI))(SI) - (SI)±1,(D I) 一 (DI)±1((SI))-((DI))(SI) - (SI)±2, (DI) - (DI)±2不重复:22重复:9+22/rep不重 复 :22重复:9+22/rep11SCASBSCASW(AL)-((DI))(DI) - (D l)± l(AX) 一 ((DI))(DI) - (DI) ± 2不重复:15重复: 9+l5/rep不重复:15重复: 9+15/rep11REP string_instruc(CX)=O退出重复,否则(C X )一(C X )-l并执行其后的串指令21REPE/REPZstring_instruc(CX)=O或(ZF)=0退出重复,否则(C X )-(C X )-1并执行其后的串指令21REPNE/REPNZstring_instruc(CX)=O或(Z F)=1退出重复,否则(C X )-(C X )-1并执行其后的串指令21控制转移类JMP SHORT op 1JMP NEAR PTR oplJMPFARPTR oplJMP WORD PTR oplJMPDWORDPTRopl无条件转移regmem1515151118+EA24+EA23522 〜 42 〜 4JZ /JE oplZF = I则转移16/42JNZ /JNEoplZ F=0则转移16/42JS oplSF=1则转移16/42JNS oplSF=0则转移16/42JP/JPE oplPF=1则转移16/42JNP/JPO oplPF=0则转移16/42JC oplCF=1则转移16/42JNC oplCF=O则转移16/42JO oplOF=1则转移16/42JNO oplOF=0则转移16/42JB/JNAE oplC F = 1且Z F=0则转移16/42JNB/JAE oplC F = 0或Z F=1则转移16/42JBE/JNA oplC F = 1或Z F=1则转移16/42JNBE/JAoplC F = 0且Z F=0则转移16/42JL/JNGE oplS F ® O F = 1则转移16/42JNLZ JGE oplS F ® O F = 0则转移16/42JLE/JNG oplS F ® O F = 1或Z F=1则转移16/42JNLE/JG oplSF@ O F=0且Z F=0则转移16/42JCXZ opI(CX) = 0则转移18/62LOOP opl(CX) / 0则循环17/52LOOPZ TLOOPEopl(C X )# 0且Z F=1则循环18/62LOOHM27LOOPNEopl(C X )= 0且Z F=0则循环19/52 CALL dst段内直接:( SP) - (SP)-2regmem191621+EA322 〜 4段内间接:((SP)+1,(SP)) - (IP)(IP) - (IP) + D16(SP) — (SP)-2((SP)+1,(SP))-(IP)段间直接:段间间接:(IP) - EA(SP) - (SP)-2((SP)+1,(SP)) 一 (CS)(SP) - (SP)-2((SPHL(SP)) — (IP)(IP )一 目的偏移地址(C S)一 目的段基址(SP) — (SP)-2((SP)+1,(SP)) - (CS)(SP) - (SP)-2((SP)+1,(SP)) — (IP)(IP) — (EA)(CS) - (EA+2)2837+EA52 〜 4RET段内:( IP)(SP)段间:( IP)(SP)(CS)(SP)一((SP)+1, (SP))一(SP)+2一 ((SP)+1, (SP))一(SP)+2一 ((SP)+1,(SP))一(SP)+2162411RET exp段内:( IP)(SP)(SP)段间:( IP)(SP)(CS)(SP)(SP)一((SP)+1, (SP))一(SP)+2_ (SP)+D16一 ((SP)+1, (SP))一(SP)+2一 ((SP)+1,(SP))-(SP)+2一(SP)+D16202333INTNINT(SP) - (SP)-2((SP)+1,(SP)) — (FR)(SP) — (SP)-2((SP)+1,(SP)) - (CS)(SP) — (SP)-2((SP)+1,(SP)) — (IP)(IP) 一 (type * 4)(CS) 一 (type * 4+2)N/3(N=3)515221 INTO若 O F = 1 ,贝ij(SP) — (SP)-2((SP)+1,(SP)) — (FR)(SP) — (SP)-2((SP)+1,(SP)) — (CS)(SP) - (SP)-2((SP)+1,(SP)) - (IP)(IP) - (10H)(CS) - (12H)53(OF=1)4(OF=0)1IRET(IP) 一 ((SP)+1,(SP))(SP) ― (SP)+2(CS) 一 ((SP)+1,(SP))(SP) - (SP)+2(FR) 一 ((SP)+1,(SP))(SP) ― (SP)+2241处理器控制类CBW(AL)符号扩展到(AH)2ICBD(AX)符号扩展到(DX)51CLCCF清021CMCCF取反21STCC F置121CLDDF清 。

21STDD F置121CLIIF清021snIF置121NOP空操作31HLT停机21WAIT等待>31ESC mem换码8+EA2 〜 4LOCK总线封锁前缀21seg:段超越前缀21 附 录 二 8086指令对标志位的影响一、 对状态标志位的影响指令类型指 令OFSFZ FAFPFCF加法, 减法ADD, ADC, SUB. SBB,CMP, NEGtttttt字符串比较. 搜索CMPS.SCAS::t:!t增量, 减量INC.DECtttt:•乘 法MULJMULtXXXX!除 法DIV.1DIVXXXXXX十进制调整DAA.DASX:tttAAA.AASXXXtXtAAM,AADXtXtX逻辑运算AND,OR,XOR,TEST0:tXt0移 位SHL,SHR,SAL,SARttXtt循环移位ROL,ROR,RCL,RCRt****t恢复状态标志POPFJRETtSAHF•tttj:设置进位标志STC*••*•1CLC••••*0CMC**•*•!二、 对控制标志位的影响表中符号说明: :: 标志受指令操作的影响; 0: 标志置0; 1: 标志置1;指令类型指 令DF1FTF恢复控制标志POTFJRET:t!中 断INT.INTO*00STD1**设置方向标志CLD0**STI*1*设置中断标志CLI*0*, : 标志不受操作的影响; x : 指令操作后标志不确定; ! : 标志位变反。

附 录 三8086宏汇编常用伪指令表数ASSUMEASSUME segreg:seg_name[,...]说明段所对应的段寄存器据COMMENTCOMMENT delimiter_text后跟注释( 代替: )及DB[variabie_name] DB operand_list定义字节变量结DD[variable_name| DD operand_list定义双字变量构DQ[variable_name] DQ operand_list定义四字变量定DT[variable_name] DT operand_list定义十字变量义DW[variable_name] DW operand_list定义字变量DUPDB/DD/DQ/DT/DW repeat_count DUP(operand_list)变量定义中的重复从句ENDEND [lable]源程序结束EQUexpression_name EQU expression定义符号=label = expression赋值EXTRNEXTRN name:type[,...] (type is: byte,word,dword or near, far)说明本模块中使用的外部符号GROUPname GROUP seg_name_list指定段在64K的物理段内INCLUDEINCLUDE filespec包含其它源文件LABELname LABLE type (type is: byte,word,dword or near, far)定义name的属性NAMENAME module_name定义模块名ORGORG expression地址计数器置expression值PROCprocedure_nanie PROC type (type is: near or far)定义过程开始ENDPprocedure_namc ENDP定义过程结束PUBLICPUBLIC symboljst说明本模块中定义的外部符号PURGEPURGE expression_name_list取消指定的符号( EQU定义)RECORDrecord_name RECORD field_name:length[=preassignment][,...]定义记录SEGMEMTseg_name SEGMENT [align_type] [combine_type] ['class']定义段开始ENDSseg_namc ENDS定义段结束STRUCstructure_name STRUC定义结构开始structure_namc ENDS定义结构结束条IFIF argument定义条件汇编开始件ELSEELSE条件分支汇ENDIFENDIF定义条件汇编结束编IFIF expression表达式expression不为0贝慎IFEIFE expression表达式expression为 。

则真IF1IF1汇编程序正在扫描第•次为真IF2IF2汇编程序正在扫描第二次为真IFDEFIFDEF symbol符号symbol已定义则真IFNDEFIFNDEF symbol符号symbol未定义则真IFBIFB < variable >变量variable为空则真IFNBIFNB < variable >变量variable不为空则真IFIDNIFIDN < string2>字串stringl与string2相同为真IFDIFIFDIF < string 1> < string2>字串stringl与string2不同为真宏MACROmacro_name MACRO [dummy_list]宏定义开始ENDMmacro_name ENDM宏定义结束PURGEPURGE macro_name_Iist取消指定的宏定义LOCALLOCAL local_label_list定义局部标号 REPTREPT expression重复宏体次数为expressionIRPIRP dummy, vargument_Jist >里 雄 每 把gfi用agumcntjistIRPCIRPC dummy, string重复宏体, 每次重复用string中的•个字符取代语句中的形参EXITMEXITM立: 即退出宏定义块或重复块&text&text宏展开时合并text成 个符号, ,;;text宏展开时不产生注释text列表控制.CREF.CREF控制交叉引用文件信息的输出XCREF.XCREF停止交叉引用文件信息的输出.LALL.LALL列出所有宏展开正文.SALL.SALL取消所有宏展开正文.XALL.XALL只列出产生目标代码的宏展开.LIST. LIST控制列表文件的输出.XLIST.XLIST不列出源和目标代码%OUT%OUTtext汇编时显示textPAGEPAGE [operand_ 1 ] [operand_2]控li则 故 ( 懒 出 卜 那 畦 揶1宽SUBTTLSUBTTL text在每页标题行下打印副标题textTITLETITLE text在每页第一行打印标题text 附录四ASCII码表列01234567行000001010on10010111011100000NU LD L ES P0@P、P10001S O HD C 11AQaq20010S T XD C 2•2BRbr30011E T XD C 3并3CScs40100E O TD C 4$4DTdt50101E NQNA K%5EUeu60110A C K 1S Y N&6FVfV70111B E LE T B»7GWgw81000B SC A N(8HXhX91001H TE M)9IYiyA1010L FS U B»:JZj2B1011V TE S C+;K[k1C1100F FF S,Nnn〜F1111SIU S/9Oo席L控制符号的定义NU LN u l l空白D L EDa t a l i n e e s c a p e转义S O HSt a r t o f h e a d i n g序始D C 1De v i c e c o n t r o l 1机控1S T XSt a r t o f t e x t文始D C 2De v i c e c o n t r o l 2机控2E T XEn d o f t e x t文终D C 3De v i c e c o n t r o l 3机控3E O TEn d of tape送毕D C 4De v i c e c o n t r o l 4机控4E NQEn q u i r y询问NA KN e g a t i v e a c k n o wl e d g e未应答A C KAc k n o wl e d g e应答S Y NSy n c h r o n i z e同步B E LBe U响铃E T BEn d o f t r a n s m i t t e d b l o c k组终B SBa c k s p a c e退格C A NCa n c e l作废H THo r i z o n t a l t a b横表E MEn d o f m e d i u m载终L FLi n e f e e d换行S U BSu b s t i t u t e取代V TVe r t i c a l t a b纵表E S CEs c a p e换码F FFOTTH f e e d换页F SF i l e s e p a r a t o r文件隔离符C RCa r r i a g e r e t t m i回车G SGr o u p s e p a r a t o r组隔离符9 0Sh i f t o u t移出R SRe c o r d s e p a r a t e记录隔离符SiSh i f t i n移入U SUn i o n s e p a r a t o r单元隔离符SPSp a c e空格D E LDe l e t e删除 附录五 D OS系统功能调用( INT 2 1 H)AH功能调用参数返回参数00程序终止( 同 IN T 21H)CS二程序段前缀PSP01键盘输入并回车人 1.=输入字符02显示输出口 1=输出字符03辅助设备( C0M1)输入人 1.=输入数据04辅助设备( C0M1)输出口 1=输出字符05打印机输出口匕=输出字符06直接控制台1/0DL=F F ( 输入)DL=字 符 ( 输出)人 1.=输入字符07键盘输入( 无回显)人 1>=输入字符08键盘输入( 无回显)检测CTRL-Br e a k 或 Ct r l -C代 1=输入字符09显示字符串DS: DX=串地址字符串以'$'结尾0A键盘输入字符串到缓冲区DS: DX=缓冲区首址( DS: DX)=缓冲区最大字符数( DS: DX+1)=实际输入的字符数DS:DX+2字符串首地址OB检验键盘状态AL=OO有输入AL=F F 无输入oc清除缓冲区并请求指定的输入功能AL二输入功能号( 1, 6, 7, 8)0D磁盘复位清除文件缓冲区OE指定当前默认的磁盘驱动器口 1=驱动器号( 0=A, 1=B…)41.=系统中驱动器数OF打开文件( F CB)DS: DX=F CB首地址AL=OO文件找到AL=F F 文件未找到10关闭文件( F CB)DS: DX=F CB首地址AL=OO 口录修改成功AL二 F F 目录中未找到文件11查找第一个目录项( F CB)DS: DX=F CB首地址AL=OO找到匹配的目录项AL二 F F 未找到匹配的目录项12查找下一个目录项( F CB)DS: DX=F CB首地址使用通配符进行目录项查找AL=OO找到匹配的目录项AL二 F F 未找到匹配的目录项13删除文件( F CB)DS: DX=F CB首地址AL=OO删除成功AL=F F 文件未删除14顺序读文件( F CB)DS: DX=F CB首地址AL=OO读成功=01文件结束,未读到数据=02 DTA边界错误=03文件结束,记录不完整15顺序写文件( F CB)DS: DX=F CB首地址AL=OO写成功=01磁盘满或是只读文件02=DTA边界错误16建文件( F CB)DS: DX=F CB首地址AL=OO建文件成功二F F 磁盘操作有错17文件改名( F CB)DS: DX=F CB首地址AL=OO文件被改名 =F F 文件未改名19取当前默认磁盘驱动器AL=00默认的驱动器号0=A,1=B, 2=C…1A设置DTA地址DS: DX=DTA 地址IB取默认驱动器F AT信息AL二每簇的扇区数DS: BX=指向介质说明的指针CX二物理扇区的字节数DX二每磁盘簇数IC取指定驱动器F AT信息同上IF取默认磁盘参数块AL=00无错=F F 出错DS: 8* =磁盘参数块地址21随机读文件( F CB)DS: DX=F CB首地址AL=00读成功=01文件结束=02 DTA边界错误=03读部份记录22随机写文件( F CB)DS: DX=F CB首地址AL=00写成功=01磁盘满或是只读文件R2DTA边界错误23测定文件大小( F CB)DS: DX=F CB首地址AL=00成功,记录数填入F CB二 F F 未找到匹配的文件24设置随机记录号DS: DX=F CB首地址25设置中断向量DS: DX二中断向量AL二中断类型号26建立程序段前缀P S PD X^ P S P 段地址27随机分块读( F CB )DS : DX 二 F CB 首地址CX 二记录数A L =0 0 读成功=0 1文件结束=0 2DT A 边界错误=0 3 读部分记录c x=读取的记录数28随机分块写( F CB )DS : DX =F CB 首地址CX 二记录数A L =0 0 写成功=0 1磁盘满或是只读文件=0 2DT A 边界错误29分析文件名字符串( F CB )E S : DI =F CB 首址DS : S I =文件名串( 允许通配符)A L =分析控制标志A L =0 0 分析成功未遇到通配符=0 1分析成功存在通配符=F F 驱动器说明无效2A取系统日期© 乂=年( 19 8 0 - 20 9 9 )口上月( 1- 12)1 ) 1 尸日( 1- 3 1)A L =星 期 ( 0 - 6 )2B置系统日期。

*=年 ( 19 8 0 - 20 9 9 )阱 月 ( 1- 12)D L T ( 1- 3 1)A L =0 0 成功=F F无效2C取系统时间CH :比=时:分Dl l : DL =秒:1/10 0 秒2D置系统时间CH : CL =时:分DH : DL =秒 : 1/10 0 秒A L =0 0 成功=F F 无效 2E设置磁盘检验标志A L =O O 关闭检验二 F F 打开检验2F取 DT A 地址E S : B X =DT A 首地址3 0取 DO S 版本号A L =版本号A H =发行号B H =DO S 版本标志B L : CX =序 号 ( 24 位)3 1结束并驻留A L 二返回码DX 二驻留区大小3 2取驱动器参数块DL 二驱动器号A L 二 F F 驱动器无效DS : B X 二驱动器参数地址3 3CT R L - B r e ak 检测A L =O O 取标志状态DL =O O 关闭 CT R L - B r e ak 检测=0 1 打开 CT R L - B r e ak 检测3 5取中断向量人 1^ =中断类型E S : 8 *=中断向量3 6取空闲磁盘空间DL =驱动器号0 =默认,1=A , 2=B -成功:A X =每簇扇区数1« =可用簇数CX =每扇区字节数DX =磁盘总簇数3 8置/取国别信息A L =O O 或取当前国别信息=F F 国别代码放在B X 中DS : DX =信息区首地址DX =F F F F 设置国别代码B X =国别代码( 国际前缘码)DS : DX 二返回信息区码首址A X 二错误代码3 9建立子目录DS : DX =A S CI Z 串地址A X 二错误码3 A删除子目录DS : DX =A S CI Z 串地址A X 二错误码3 B设置目录DS : DX =A S CI Z 串地址A X =错误码3 C建立文件( han d l e )DS : DX =A S CI Z 串地址CX 二文件属性成功:A X 二文件代号失败:A X =错误码3 D打开文件( han d l e )DS : DX =A S CI Z 串地址A L =访问和文件共享方式0 =读,1=写,2=读/写成功:A X 二文件代号失败:A X 二错误码3 E关闭文件( han d l e )8 *=文件代号失败:A X =错误码3 F读文件设备( han d l e )DS : DX =A S CI Z 串地址8 *=文件代号CX =读取的字节数成功:A X =实际读入的字节数A X =O 已到文件尾失败:A X =错误码4 0写文件或设备( han d l e )DS : DX =A S CI Z 串地址13 *=文件代号CX =写入的字节数成功A X 二实际读入的字节数失败:A X =错误码4 1删除文件DS : DX =A S CI Z 串地址成功: A X =O O失败:A X 二错误码4 2移动文件指针1« =文件代号CX : DX =位移量人 1=移动方式成功:DX : A 城新指针位置失败:A X 二错误码4 3置/取文件属性DS : DX =A S CI Z 串地址A L =O O 取文件属性A L =0 1置文件属性© *=文件属性成功:CX 二文件属性失败:A X 二错误码 4 4设备驱动程序控制8 乂=文件代号人 1=设备子功能代码( 0 T 1H )0 =取设备信息1=置设备信息3 =写字符设备4 =读块设备5=写块设备6 =取输入状态7 =取输出状态,…B L =驱动器代码© *=读/写的字节数成功:。

乂=设备信息A X 二传送的字节数失败:A X 二错误码4 5复制文件号B X =文件代号1成功:A X 二文件代号2失败:A X 二错误码4 6强行复制文件代号8 *=文件代号1© *=文件代号2失败:A X 二错误码4 7取当前目录路径名口 1=驱动器号DS : S I =A S X I Z 串地址( 从根目录开始路径名)成功DS : S F A S X I Z 串地址失败:A X 二错误码4 8分配内存空间8 乂=申请内存字节数成功: A X =分配内存的初始段地址失败: A X =错误码B X =最大可用空间4 9释放已分配内存£5=内存起始段地址失败:A X 二错误码4 A修改内存分配E S =原内存起始段地址B X =新申请内存字节数失败:A X =错误码B X =最大可用空间4 B装入/执行程序DS : DX =A S CI Z 串地址E S : B X =参数区首地址A L =O O 装入并执行程序=0 1装入程序, 但不执行失败: A X =错误码4 C带返回码终止A L 二返回码4 D取返回代码A L 二子出口代码A H 二返回代码0 0 =正常终止0 1二用Ctr l - C终止0 2二严重设备错误终止0 3 二用功能调用3 1H 终止4 E查找第一个匹配文件DS :DX = AS C I Z 串地址C X = 属性失败:AX 二错误码4F查找下一个匹配文件DT A保留4E H 的原始信息失败:AX 二错误码5 0置 P S P 段地址1 3 乂= 新P S P 段地址5 1取 P S P 段地址1 ^ = 当前运行进行的P S P5 2取磁盘参数块£ $: [« = 参数块链表指针5 3把 B I O S 参数块转换为DO S的驱动器参数块( DP B )E S :B P = DP B 的指针5 4取写盘后读盘的检验标志AL = 00检验关闭= 01 检验打开 5 5建立P S PDX = 建立P S P 的段地址5 6文件改名DS :DX = 当前AS C I Z 串地址失败:AX 二错误码£ 5 2 1 = 新 AS C I Z 串地址5 7置/取文件日期和时间8 乂= 文件代号失败:AX = 错误码AL = 00读取日期和时间二 01 设置日期和时间( DX :C X ) = 日期:时间5 8取/置内存分配策略AL = 00取策略代码成功:AX 二策略代码AL = 01 置策略代码失败:AX = 错误码8 乂= 策略代码5 9取扩充错误码B X = 00AX = 扩充错误码B H 二错误类型B L 二建议的操作C H 二出错设备代码5 A建立临时文件C X 二文件属性DS : DX = AS C I Z 串( 以' 结束) 地址成 功 : 八 *= 文 件 代 号 DS :DX = AS C I Z 串地址 失败错误代码5 B建立新文件C X 二文件属性DS : DX 二 AS C I Z 串地址成功:人乂= 文件代码失败:AX =错误代码5 C锁定文件存取AL = 00锁定文件指定的区域= 01 开 锁 B X 二文件代号C X :。

乂= 文件区域偏移值S I : 1 = 文件区域的长度失败:人*= 错误代码5 D取/置严重错误标志的地址AL = 06 取严重错误标志地址AL = 0A置 E R R O R 结构指针DS : S I = 严重错误标志的地址6 0扩展为全路径名DS : S I = AS C I Z 串的地址 E S : DI =工作缓冲区地址失败:人乂= 错误代码6 2取程序段前缀地址B X = P S P 地址6 8刷新缓冲区数据到磁盘AI 产文件代号失败:人乂= 错误代码6 C扩充的文件打开/建立成功:6 *= 文件代号C X = 采取的动作失败:4 = 错误代码 附录六 BIOS系统功能调用INTAH功能调用参数返回参数100设置显示方式AL=OO 4 0 X 2 5黑白文本,16级灰度=01 40X25 16 色文本=02 8 0 X 2 5黑白文本,16级灰度=03 80X25 16 色文本=04 320X200 4 色图形=05 32 0 X 2 0 0黑白图形,4级灰度=06 640X200黑白图形=07 8 0 X 2 5黑白文本=08 160X200 16 色图形(MCGA)=09 320X200 16 色图形(MCGA)=0A 640X200 4 色图形(MCGA)=0D 320X200 16 色图形(EGA/VGA)=0E 640X200 16 色图形(EGA/VGA)=0F 640X350 单色图形(EGA/VGA)=10 640X350 16 色图形(EGA/VGA)=11 640X480 黑白图形(VGA)=12 640X480 16 色图形(VGA)=13 320X200 256 色图形(VGA)101置光标类型CH0-3=光标起始行CL0-3=光标结束行102置光标位置BH=页号 DH/DL=行/列103读光标位置BH二页号CH=光标起始行CL=光标结束行DH/DL=行/列104读光笔位置AH=00光笔未触发=01光笔触发CH/BX=象素行/列口 口 八1=光笔字符行/列数105置当前显示页AL=页号106屏幕初始化或上卷AL=0初始化窗口 AL=上卷行数BH=卷入行属性01/0>=左上角行/列号DH/DI尸右下角行/列号107屏幕初始化或下卷AL=O初始化窗口 AI尸下卷行数BH二卷入行属性CH/CI尸左上角行/列号。

亚1=右下角行/列号108读光标位置的字符和属性BH二显示页AH/AL=字符/属性109在光标位置显示字符和属性BH二显示页AL/BL二字符/属性CX二字符重复次数10A在光标位置显示字符BH=显示页人1=字符CX=字符重复次数10B置彩色调色板BH二彩色调色板IDBL二和ID配套使用的颜色10C写像素AL二颜色值BH二页号DX/CX二像素行/列10D读像素BH二页号DX/CX二像素行/列AL=像素的颜色值10E显示字符( 光标前移)人1=字 符BH=页 号BL=前景色 10F取当前显示方式B H =页号AH= 字符列数AL二显示方式1 01 0置调色板寄存器( E G A/V G A)AL = O , B L =调色板号,B H =颜色值1 011装入字符发生器( E G A/V G A)AL = 0-4全部或部分装入字符点阵集AL = 2 0-2 4置图形方式显示字符集AL = 3 0读当前字符集信息E S :B P =字符集位置1 01 2返回当前适配器设置的信息( E G A/V G A)B L = 1 0H ( 子功能)B H = O单色方式= 1彩色方式B L = V R AM 容量( 0= 6 4K, 1 = 1 2 8 K, ••­ )C H =特征位设置C L = E G A的开关位置1 01 3显示字符串E S :B P =字符串地址AL =写方式( 0〜 3 )C X =字符串长度DH /DL =起始行/列B H /B L =页号/属性1 1取设备清单AX = B I O S设备清单字1 2取内存容量AX =字节数( KB )1 30磁盘复位DL二驱动器号( 00, 0 1为软盘,8 0,8 1 ,…为硬盘)失败:AH二错误码1 31读磁盘驱动器状态人心状态字节1 32读磁盘扇区A L二 扇 区 数C L u. 产磁道号C L o 'k扇区号DH/DL二磁头号/驱动器号ES : B X二数据缓冲区地址读成功:A H=OA L =读取的扇区数读失败:A H=错误码1 33写磁盘扇区同上写成功:A H=OA L二 写入的扇区数写失败:A H二 错误码1 34检验磁盘扇区A L二 扇 区 数CLG. 7 cHo ; =磁道号C L o卡扇区号DH/DI尸磁头号/驱动器号成功:A H=O人1尸检验的扇区:数失败:A H=错误码1 35格式化盘磁道A L =扇 区 数C L « , £% B磁道号C L » r =扇区号DH/DL =磁头号/驱动器号ES : B X =格式化参数表指针成功:A H=O失败:A H=错误码1 40初始化串行口A L =初始化参数口* =串行口号A H; 通信口状态,4 1 =调制解调器状态1 41向通信口写字符A L =字符 DX =通信口号写成功:A H, =O写失败:A Hv =lC IU=通信口状态1 42从通信号读字符DX =通信口号读成功:A H; =O A L =字符读失败:A H7=11 43取通信号状态DX二通信号A H=通信口状态A L二调制解调器状态1 44初始化扩展C O M1 45扩展C O M控制1 50启动盒式磁带机1 51停止修理工磁带机 1 52磁带分块读ES : 8 * =数据传输区地址C X =字节数人心状态字节=00读成功=01 冗余检验错=02 无数据传输=04 无引导=8 0非法命令1 53磁带分块读DS : B X 二数据传输区地址C X 二字节数人心状态字节( 同上)1 60从键盘读字符A L = 字符码A H二扫描码1 61取键盘缓冲区状态Z F=O A L =字符码A H=扫描码Z F=1 缓冲区无按键等待1 62取键盘标志字节A L =键盘标志字节1 70打卬字符回送状态字节A L =字符口* =打印机号人心打印机状态字节1 71初始化打印机回送状态字节DX TT印机号A HTT印机状态字节1 72取打印机状态DX ^ J 印机号人心打印机状态字节1 8R O W B A S IC 语言1 9引导装入程序1 A0读时钟C H: C L =时:分DH: DL =# : 1 /1 00 0;1 A1置时钟C H: € 1 =时:分DH: DL =秒 :1 /1 00 秒1 A6置报警时间C H: C L =时 :分 ( B C D)DH: DL =秒:1 /1 00 秒 ( B C D)1 A7清除报警3 300鼠标复位A L =O OA X =O O O O 硬件未安装=FFFF硬件已安装B X =鼠标的键数3 300显示鼠标光标A L =01显示鼠标光标3 300隐藏鼠标光标A L =02隐藏鼠标光标3 30( ) 读鼠标状态A L 二 03B X =键 状 态 C X /DX =鼠标水平/垂直位置3 300设置鼠标位置A L =04C X /DX =鼠标水平/垂直位置3 300设置图形光标A L =09 B X /C X =鼠标水平/垂直中心ES : DX =1 6X 1 6光标映像地址安装了新的图形光标3 300设置文本光标A L =O A 1 « =光标类型C X =象素位掩码或其始的扫描线DX =光标掩码或结束的扫描线设置的文本光标3 300读移动计数器A L =O BC X /DX =鼠标水平/垂直距离3 300设置中断子程序A L 二 0C C X 二中断掩码ES : DX 二中断服务程序的地址附 录 七Debug命令表 命令功能格式A(Assmble)汇编语句Afaddress]C(Compare)比较内存C range addressD(Dump)显示内存D [address]E(Enter)改变内存E address listF(Fill)填充内存F range listG(GO)执行程序G [address]H( Hexart hmetic)十六进制运算H Value ValueI(Input)输入I port addressL(Load)装入内存L[address]M(Move)传送内存M range rangeN(Name)定义文件N [d:][path]filename[.com]O(out put)输出字节0 port address byteQ(Quit)退出DEBUG状态QR((Register)显示寄存器R[register name]S(Search)检索字符S rang listT(Trace)单步/多步跟踪T orT[address][value]U(Unassmble)反汇编U [address]orU[range]W(Write)文件或数据写盘W [address[drive sector sector]] 。

下载提示
相似文档
正为您匹配相似的精品文档