云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 8086汇编语言上机实验实验二PB

8086汇编语言上机实验实验二PB

  • 62 次阅读
  • 3 次下载
  • 2026/1/9 18:42:20

实验(A) 请编写程序,在屏幕上显示“What is your name?”,从键盘输入自己姓名“X X

X”后屏幕显示“My name is XXX. ”。要求将屏幕上显示字符串的功能设计为一个可以被其它任意程序调用的子程序。(提示:键盘输入到缓冲区使用0AH号DOS功能调用。)

(一)程序的算法思想

将程序分为两个模块MOD1和MOD2。程序入口设在MOD1,是为主模块,在其中执行段寄存器初始化,为MOD2的输出模块计算入口参数DISP,使用21H号DOS中断的0AH号功能调用以实现从键盘输入字符串,调用MOD2的远程调用过程OUTPUT_STRING执行字符串输出,返回DOS系统等操作。MOD2接受来自MOD1的参数DISP,用之修改输出函数入口参数,并接着使用21H号DOS中断的09号功能调用,完成字符串的输出。

其他基本算法不做累述,在这里只说如何在输出名字(即buff中的字符串)之后,在正确的位置补上句号。

我们在调用21H号中断的0A号功能调用时,入口参数为DS:DX=缓冲区的首地址(这里是BUFF的地址偏移量)。在使用缓冲区之前,为了便于输出,我们将整个缓冲区除了标志位(0、1位),其他都初始化为09号功能调用的输出结束标志符’$’(ASCII码为24H)

缓冲区中存放数据的规则如下(假设输入字符串为我的名字pyxiao): 14 06 70 79 78 69 61 6F 0D 24 0 1 2 3 4 5 6 7 8 9 这里显示了以缓冲区首地址为0号下标开始的是个储存单元,放的都是16进制数,0号位放的是14H=20D即缓冲区的最大缓存空间的字节数;1号位置放的是缓冲区内有效字符的个数n,即字符串”pyxiao”的长度,为6;从2号位开始接下来n个字节(2号到7号位)内存放的即是输入的字符串(这里的字符串对大小写敏感)的ASCⅡ码;再接下来的一个字节即n+2号位(8号)内放的将是键盘输入的结束标志回车符的ASCII码(0DH)。之后便是我们缓冲区的空余部分了,我们将至初始化为了’$’(24H)。

假如我们不对输入缓冲区做修改,直接输出缓冲区类容,那么回车符也将被输出,输出的当前位置将回到本行开头,这将导致我们的补充输出的句号将不是补在输出字符串”pyxiao”之后,而是出现在该行的第一个位置。换言之,该行输出语句不是我们期望的:

MY NAME IS : pyxiao. 而是:

.Y NAME IS : pyxiao

注意句号’.’的位置,我们用红色标出以示强调。

实际上,我们可以将缓冲区的n+2号位置的回车符(0DH)直接修改为’.’(2EH)。这样输出的BUFF就会变成输入的字符串加上一个句号(’.’)。缓冲区自动为我们提供了有效输入的长度n,我们可以通过MOV操作,将缓冲区偏移量为(n+2)的字节的内容修改为’.’(2EH)。具体操作可用下面的代码来实现。

;我们用BX来作为要操作元素的指针,

LEA BX,BUFF ;先将BX赋值为BUFF的偏移量,现在BX指向缓冲区的0号位 INC BX ;BX加1,使其指向缓冲区的1号位

MOV AL,[BX] ;将缓冲区1号位的内容(即有效字符串长度)赋值给AL寄存器。 MOV AH,0 ;将AX的高字节清0 CLC ;进位标识清0

ADC BX,AX ;计算输入的有效字符串的最后一位(’o’)的地址偏移量 MOV AL,'.' ;将’.’的ASCII码(2EH)赋给AL

INC BX ;BX加1,使其指向缓冲区的(n+2)位,即回车符所在字节 MOV [BX],AL ;将回车符改为’.’

至此将缓冲区中字符串输入的结束标志回车符(0DH)修改为’.’,这样我们输出BUFF中的内容就会是键入的字符串加上一个句号。

(二) 程序的流程图

初始化堆栈段,数据段 调用远过程OUTPUT_STRING(之后简写为 OS),以输出提示字符串QUS,参数DISP=QUS 地址偏移量 执行远调用过程OS: 调用21号中断的09号功能调用,入口调用21H号中断的0AH号功能调用 参数DS:DX=输出字符串首地址 从键盘输入字符串到键盘缓冲区,出口参数 期中DX=DISP DS:DX=键盘缓冲区首地址 输出以’$’结尾的字符串QUS 其中DX=缓冲区BUFF的首地址偏移量 (前文已详细解释),此处不 修改缓冲区的内容 做累述 调用远过程OS,以输出回答字符串ANS,参数 DISP=ANS地址偏移量

执行远调用过程OS:

调用21号中断的09号功能调用,入 调用远过程OS,以输出BUFF中答案字符串,口参数DS:DX=输出字符串首地址 参数DISP=BUFF地址偏移量+2(BUFF的0、期中DX=DISP 1号位置内容不输出),以及回车变’.’ 输出以’$’结尾的字符串ANS

执行远调用过程OS:

调用21号中断的09号功能调用,入

口参数DS:DX=输出字符串首地址

期中DX=DISP

输出BUFF中以’$’结尾的字符串

“pyxiao.”(注意’.’的存在)

调用21H号中断4C号功能调用,安全关闭文件,返回DOS系统

(三) 源程序及注释

;======================文件名mod1.asm================================= NAME MOD1 ;模块一 EXTRN OUTPUT_STRING:FAR ;要调用远调用过程OUTPUT_STRING PUBLIC DISP ;提供可供远调用参数DISP DATA SEGMENT ;定义数据段 QUS DB 'WHAT IS YOUR NAME?',0DH,0AH,'$' ;定义字符串QUS ANS DB 'MY NEME IS: ','$' ;定义字符串ANS BUFF DB 20 ;定义缓冲区BUFF DB ? DB 20 DUP('$') DISP DW ? DATA ENDS

;定义地址偏移量参数DISP ;数据段定义完成 ;定义堆栈段

;200个字节的堆栈段 ;代码段开始 ;初始化堆栈段

STACK SEGMENT STACK SPAN DB 200 DUP(0) TOP EQU LENGTH SPAN STACK ENDS

CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA,SS:STACK START: MOV AX,STACK MOV SS,AX MOV SP,TOP

MOV AX,DATA ;初始化数据段 MOV DS,AX

;==============================输出问题提示字符串QUS LEA BX,QUS MOV DISP,BX CALL OUTPUT_STRING

;==============================键盘输入字符串到BUFF LEA DX,BUFF MOV AH,0AH INT 21H

;=============================修改BUFF中的内容 LEA BX,BUFF INC BX MOV AL,[BX] MOV AH,0 CLC ADC BX,AX

MOV AL,'.' 将BUFF中字符串后的回车改为句号’.’ INC BX MOV [BX],AL

;=============================输出回答字符串ANS LEA BX,ANS MOV DISP,BX CALL OUTPUT_STRING

;============================输出缓冲中的字符串内容(包括修改来的句号’.’) LEA BX,BUFF ADD BX,2 MOV DISP,BX CALL OUTPUT_STRING ;=============================关闭文件,结束程序,返回DOS MOV AH,4CH INT 21H CODE1 ENDS ;代码段结束 END START ;START结束,设置程序入口为START,模块一结束 ;======================================================================

;===================文件名mod2.asm============================== NAME MOD2 ;模块2 EXTRN DISP:WORD ;将用到的调用参数DISP,以字打开 PUBLIC OUTPUT_STRING ;提供远程调用过程OUTPUT_STRING ;===================================代码段开始 CODE2 SEGMENT

OUTPUT_STRING PROC FAR ASSUME CS:CODE2 PUSH DX ;保护DX中内容,虽然本次实验中无妨,但要养成习惯 ;========================== 执行21H号中断的09号功能调用 MOV DX,DISP ;设置09号功能调用的入口参数DX=DISP MOV AH,09 INT 21H

;=================== POP DX ;弹出DX RET ;返回调用语句所在函数 OUTPUT_STRING ENDP ;过程OUTPUT_STRING定义完成 CODE2 ENDS ;代码段CODE2定义完 END ;模块2结束

搜索更多关于: 8086汇编语言上机实验实验二PB 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

实验(A) 请编写程序,在屏幕上显示“What is your name?”,从键盘输入自己姓名“X XX”后屏幕显示“My name is XXX. ”。要求将屏幕上显示字符串的功能设计为一个可以被其它任意程序调用的子程序。(提示:键盘输入到缓冲区使用0AH号DOS功能调用。) (一)程序的算法思想 将程序分为两个模块MOD1和MOD2。程序入口设在MOD1,是为主模块,在其中执行段寄存器初始化,为MOD2的输出模块计算入口参数DISP,使用21H号DOS中断的0AH号功能调用以实现从键盘输入字符串,调用MOD2的远程调用过程OUTPUT_STRING执行字符串输出,返回DOS系统等操作。MOD2接受来自MOD1的参数DISP,用之修改输出函数入口参数,并接着使用21H号DOS中断的09号功能调用,完成字符串的输出。 其他基

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com