第六章 微型计算机程序设计_第1页
第六章 微型计算机程序设计_第2页
第六章 微型计算机程序设计_第3页
第六章 微型计算机程序设计_第4页
第六章 微型计算机程序设计_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章微型计算机程序设计第1页,课件共124页,创作于2023年2月汇编语言程序举例查找关键字

第2页,课件共124页,创作于2023年2月过程定义伪操作

格式

过程名PROC类型、、、过程名ENDP过程定义由伪操作PROC开始、ENDP结束。其中:PROC和ENDP必须成对出现,且语句前必须有过程名,过程名必须相同。PROC和ENDP语句之间为子程的指令序列。程序中可以定义多个过程。程序经汇编、连接及装入内存后,过程名为一具体的内存地址,指示子程入口。第3页,课件共124页,创作于2023年2月过程名常用作CALL调用指令的操作数,

子程的最后安排RET返回指令,使执行完子程后能返回调用处。过程有两种类型:NEAR和FAR

无类型项时,默认为NEAR类型。当过程与调用指令不在同一段时,应将过程定义为FAR类型。过程类型决定子程中RET的返回类型第4页,课件共124页,创作于2023年2月例1displayPROC、、、、C3H

、、RET;NEAR属性的过程对应段内返回displayENDP例2displayPROCFAR、、、、CBH、、RET;FAR属性的过程对应段间返回displayENDP第5页,课件共124页,创作于2023年2月;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程

MOVAH,4CH;返回DOS

INT21H;用二进制显示BX内容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代码段结束ENDbegin;指示程序结束和;程序入口第6页,课件共124页,创作于2023年2月等值定义伪操作

格式

符号名EQU需等值的表达式作用是用符号名等值指定的表达式其中表达式可以是任何有效的操作数汇编时用语句中的表达式代替程序中符号所在的地方。应用:1.定义符号常量,方便修改程序。2.某表达式多次出现时,用等值伪操作可以方便编程。第7页,课件共124页,创作于2023年2月;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H

;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0

MOVAL,key

next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程

MOVAH,4CH;返回DOS

INT21H;用二进制显示BX内容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代码段结束ENDbegin;指示程序结束和;程序入口第8页,课件共124页,创作于2023年2月例三用二进制显示中断向量表中数据

D0H的个数。分析:中断向量表指内存0:0~0:3FFH

大小400H(即1K)字节空间;查找关键字D0H;将关键字的个数,存放在BX中,采用二进制显示BX内容,16个字符;

采用子程调用结构。第9页,课件共124页,创作于2023年2月主程序流程图子程序流程图第10页,课件共124页,创作于2023年2月;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQUD0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,key

next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代码段结束ENDbegin;指示程序结束和;程序入口第11页,课件共124页,创作于2023年2月汇编源程序scans.asmD:\MASM\MASMscans;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.scans.ASM(1):errorA2009:Symbolnotdefined:D0Hscans.ASM(9):errorA2009:Symbolnotdefined:KEY49924+419241Bytessymbolspacefree0WarningErrors2SevereErrorsD:\masm>汇编程序提示出错的行号,据此可修改程序中的语法错误。第12页,课件共124页,创作于2023年2月;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,key

next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROC

MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP

codeENDS;代码段结束ENDbegin;指示程序结束和;程序入口思考:如何用SCANSB改写此程序?第13页,课件共124页,创作于2023年2月汇编、连接后,执行程序:D:\masm>scans;在DOS下运行程序0000000000000100D:\masm>debug;利用DEBUG检测结果-S0:0L400D00000:00230000:00430000:00730000:009C-QD:\masm>请上机自己调试该程序。第14页,课件共124页,创作于2023年2月例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(scanskey.asm)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000H;设置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;设置查找长度MOVBX,0;计算值初值

MOVAH,01H;从键盘输入

INT21H;输入关键字在AL中next:CMP[SI],ALJNZpointINCBXpoint:INCSI

CALLdisplay;调用显示子程

MOVAH,4CH

;调用4CH功能

INT21H

;返回DOS;用二进制显示BX内容子程

displayPROC

MOVCX,16;显示位数rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30H

MOVAH,2HINT21H

LOOProtate

RET;子程返回

displayENDP

codeENDS;代码段结束ENDbegin第15页,课件共124页,创作于2023年2月例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(scanskey.asm)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000H;设置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;设置查找长度MOVBX,0;计算值初值

MOVAH,01H;从键盘输入

INT21H;输入关键字

MOVDL,AL;保存在DL中next:LODSB;从串取CMPAL,DL;与关键字比较JNZpointINCBX;计算值加1point:LOOPnext;查找结束?CALLdisplay;调用显示子程MOVAH,4CH;调用4CH功能INT21H;返回DOS;用二进制显示BX内容子程displayPROCMOVCX,16;显示位数rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin用LODSB改写程序第16页,课件共124页,创作于2023年2月数值回送操作符:(自学)课前5分钟TYPE,LENGTH,SIEE,OFFSET,SEG5种。把一些特征或存贮器地址的一部分作为数值回送。·TYPE格式:TYPEvariable变量则回送该变量的以字节数表示的类型(DB为1,DW为2,DD为4,DQ为8,DT为10)或label标号回送标号类型数值(NEAR为-1,FAR为-2)例:ARRAYDW1,2,3ADDSI,TYPEARRAY汇编程序其形式:ADDSI,2第17页,课件共124页,创作于2023年2月·LENGTH格式:LENGTHvariable对于变量中使用DUP汇编回送分配给变量单元数,其他情况回送1。例:FESSDW100DUP(0) 对于MOVCX,LENGTHFEES 汇编程序将其形式:MOVCX,100 其他情况例:ARRAYDW1,2,3 对于指令MOVCX,LENGTHARRAY 汇编程序将使其形式为:MOVCX,1例:TABLEDB‘ABCD’ 对于指令MOVCX,LENGTHTABLE汇编程序使其形式为:MOVCX,1第18页,课件共124页,创作于2023年2月·SIEE格式:SIEEvariable

回送分配给该变量的字节数LENGTH*TYPE例:FEESDW100DUP(0)

MOVCX,SIZEARRAY 将形成:MOVCX,200例:TABLEDB‘ABCD’

MOVCX,SIEETABLE 将形成MOVCX,1例:ARRAYDW1,2,3

MOVCX,SIEEARRAY 形式MOVCX,2 LENGTH*TYPE=2第19页,课件共124页,创作于2023年2月其中:TYPE变量的返回值是类型的字节数: DB为1,DW为2,DD为4,DQ为8,DT为10; TYPE标号的返回值是:NEAR为-1,FAR为-2。

LENGTH变量返回DUP分配的单元数,对于其他情况则返回1。

SIZE返回值是:LENGTH和TYPE值的乘积,即变量的字节数。第20页,课件共124页,创作于2023年2月第五节BIOS和DOS中断功能调用

一、概述

1.BIOS和DOS中断子程层次特点2.中断类型分类3.调用方法二、BIOS功能调用1.设置显示方式(10H类型,00H功能)2.置光标位置(10H类型,02H功能)3.清屏、清窗口(10H类型,06H或07H功能)三、

DOS系统功能调用(21H类型中断调用)1.显示单字符(02H功能)2.显示字符串(09H功能)3.单字符输入(01H、07H、08H功能)4.字符串输入(0AH功能)5.检测键盘状态(0BH功能)6.保存中断向量(35H功能)(第六章介绍)7.设置中断向量(25H功能)第21页,课件共124页,创作于2023年2月maxDB11,?,4DUP(?)dataSEGMENTstringDB‘HelloWorld!’,’$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AH;调用0AH输入功能INT21HLEADX,stringMOVAH,09H;调用09H显示功能INT21HMOVAH,4CHINT21H;返回DOScodeENDSENDstart第22页,课件共124页,创作于2023年2月第三节BIOS和DOS中断功能调用

一、概述

二、BIOS功能调用三、

DOS系统功能调用(21H类型中断调用)第23页,课件共124页,创作于2023年2月一、概述1.BIOS和DOS中断子程层次特点2.中断类型分类3.调用方法第24页,课件共124页,创作于2023年2月1.BIOS和DOS中断子程层次特点用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令DOS系统层次结构第25页,课件共124页,创作于2023年2月层次特点:ROMBIOS中的中断子程使用IN/OUT指令直接控制外设,实现与外设之间的输入/输出操作,以软件形式向其上层提供服务。IO.SYS中的中断子程(称基本输入/输出BIOS模块)

调用ROMBIOS的基本I/O功能,向MSDOS.SYS提供设备驱动服务。用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令第26页,课件共124页,创作于2023年2月

MSDOS.SYS中的中断子程(称DOS内核模块)调用IO.SYS,实现对外设的控制。与标准外设有两层隔离:IO.SYS和ROMBIOS。其中21H类型的中断子程提供了丰富的系统服务,称21类型的中断调用为DOS系统(功能)调用。用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令第27页,课件共124页,创作于2023年2月用户编程原则①尽可能使用DOS的系统功能调用,提高程序可移植性。②在DOS功能不能实现情况下,考虑用BIOS功能调用。③在DOS和BIOS的中断子程不能解决问题时,使用IN/OUT指令直接控制硬件。用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令第28页,课件共124页,创作于2023年2月2.中断类型分类向量表中的中断类型分为七类:①处理CPU特殊操作(除0、溢出)的00H、04H类型。②

为DEBUG调试程序设置的单步(01H)、断点(03H)类型。③

处理CPU的NMI引脚信号的02H类型。非屏蔽硬中断子程④

处理CPU的INTR引脚信号的08~0FH类型。可屏蔽类型硬中断子程⑤

用INT指令调用的中断子程

BIOS功能调用(如10~1AH)DOS功能调用(如21H)NMIINTR8088第29页,课件共124页,创作于2023年2月⑥

保留类型为DOS系统保留

1)指现在未用到,以后系统可能会用到。

2)已用到,但不向用户公开。为用户保留

1)被系统子程嵌套调用了的类型(如1BH、1CH)。使用户在系统功能基础上扩充功能。

2)系统未占用类型(如60H~67H)。⑦非中断向量类型对应向量表中的4个单元存放的不是中断向量。(如1DH、1EH、1FH、41H、46H、22H)通常是一些参数表的地址信息.第30页,课件共124页,创作于2023年2月

中断向量分配表第31页,课件共124页,创作于2023年2月第32页,课件共124页,创作于2023年2月第33页,课件共124页,创作于2023年2月3.调用方法设置入口参数在AH设置功能号m执行中断指令INTN分析、应用出口参数第34页,课件共124页,创作于2023年2月例1单字符显示功能调用MOVDL,‘A’;设置入口参数MOVAH,02H;设置功能号INT21H;执行中断调用

例2单字符输入功能调用MOVAH,01H;设置功能号

INT21H;执行中断调用CMPAL,0DH;分析、应用出口参数JZexit、、、第35页,课件共124页,创作于2023年2月二、BIOS功能调用基本输入/输出模块BIOS:实现对输入/输出设备的控制,内含0–1CH等类型中断子程,包括显示器、磁盘、键盘、打印机等标准外设的驱动程序。(参看中断类型分配表)

BIOS功能调用指对BIOS模块中的中断子程的调用。第36页,课件共124页,创作于2023年2月有关显示器①显示器通过显卡(显示适配器)连接到计算机上。②单色显示器只能显示黑白两色。彩色显示器能显示多种颜色。第37页,课件共124页,创作于2023年2月③屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。640KBRAM基本内存0000:00000040:00000050:00000070:0000

A000:0000B000:0000

C800:0000F600:0000FE00:0000FE00:1FFF显示缓存区(显存)硬盘驱动器控制ROM32KBROMBASIC8KBROMBIOSIO.SYS模块COMMAND.COM常驻模块MSDOS.SYS模块用户程序空间COMMAND.COM暂驻模块256KBROMDOS工作区ROMBIOS工作区128KBRAM保留区1KB中断向量表第38页,课件共124页,创作于2023年2月④显示器有两种显示方式:

图形方式:将屏幕划分为m×n的点阵,在每个点的位置显示象素,一个点是一个象素。文本方式将屏幕划分为若干行和列,在每个网格位置上显示象素,一个字符是一个象素。第39页,课件共124页,创作于2023年2月文本方式将屏幕划分为m列和n行(m×n),在每个网格位置上显示象素,一个字符是一个象素。80×25文本方式A~~~~~~~~~~~~~~~~0列0行79列24行BC第40页,课件共124页,创作于2023年2月~~~~640×480图形方式640点480点图形方式:将屏幕划分为m×n的点阵,在每个点的位置显示象素,一个点是一个象素。第41页,课件共124页,创作于2023年2月在文本方式下,对应屏幕上的每个字符,在显示缓冲区中占用两个单元:一个存放ASCII码,一个存放显示属性。41H07H42H07H61H70H62H70H、、、显示缓冲区(显存)字符A,黑底白字字符B,黑底白字字符a,白底黑字字符b,白底黑字第42页,课件共124页,创作于2023年2月例10000111B或87H表示黑底白字,闪烁

01110000B或70H表示白底黑字,不闪烁16种0000黑1000灰

0010绿1010浅绿0100红1100浅红0111灰白1111白BLRGBIRGB闪烁背景前景765432108种000黑010绿

100红111白0不闪烁1闪烁属性字节的含义:第43页,课件共124页,创作于2023年2月

据显存大小,可存储若干页的字符象素。

例16KB显存能存储:80×25方式,4页(0~3),80×25×2×4=1600040×25方式,8页(0~7),40×25×2×8=16000第44页,课件共124页,创作于2023年2月1.设置显示方式入口参数AL=显示方式值

0040×25黑白文本方式

0140×25彩色文本方式

0280×25黑白文本方式

0380×25彩色文本方式

04320×320彩色图形方式功能号

AH=00H类型号

10H出口参数无实现功能将显示方式设置为指定形式例将显示方式设置为80×25彩色文本方式MOVAL,03HMOV

AH,00

INT10H第45页,课件共124页,创作于2023年2月2.

清屏、清窗口功能入口参数AL=0CH=窗口左上角行号CL=窗口左上角列号DH=窗口右下角行号DL=窗口右下角列号BH=窗口属性功能号

AH=06H或AH=07H类型号

10H出口参数无实现功能按给定属性清除指定的窗口内容第46页,课件共124页,创作于2023年2月例清除屏幕显示,将其属性置为反白(白底黑字)显示。MOVAL,0;清屏功能MOVBH,70H;白底黑字MOVCH,0;左上角行号MOVCL,0;左上角列号MOVDH,24;右下角行号MOVDL,79;右下角列号MOVAH,6;功能号INT10H;中断调用第47页,课件共124页,创作于2023年2月3.置光标位置光标控制开始显示的位置,计算机有专门的硬件控制光标的显示大小、位置。光标只在文本方式中出现,在图形方式下光标消失。~~~~~~~~~~~~~~~~0列0行79列24行5列1列1行2行第48页,课件共124页,创作于2023年2月置光标位置入口参数DH=行号DL=列号BH=页号

功能号

AH=02H

类型号

10H

出口参数无

实现功能将光标设置在指定的位置第49页,课件共124页,创作于2023年2月例将光标设置在2行5列的位置MOVDH,2MOVDL,5MOVBH,0MOVAH,2INT10H~~~~~~~~~~~~~~~~0列0行79列24行5列1列1行2行第50页,课件共124页,创作于2023年2月三、DOS系统功能调用(21H类型中断调用)1.显示单字符(02H功能)2.显示字符串(09H功能)3.单字符输入(01H、07H、08H功能)4.字符串输入(0AH功能)5.检测键盘状态(0BH功能)6.保存中断向量(35H功能)(第六章介绍)7.设置中断向量(25H功能)第51页,课件共124页,创作于2023年2月1.显示单字符(02H功能)

入口参数DL=要显示字符的ASCII码功能号

AH=02H类型号

INT21H出口参数无实现功能显示指定字符,光标随动。例显示字符AMOVDL,‘A’MOVAH,02HINT21H第52页,课件共124页,创作于2023年2月例使光标回到下一行的行首。MOVDL,0DH

;显示回车符MOVAH,02HINT21HMOVDL,0AH

;显示换行符MOVAH,02HINT21H~~~~~~~~~~~~~~~~HelloWorld

第53页,课件共124页,创作于2023年2月2.显示字符串(09H功能)入口参数①定义要显示的字符串,

字符串尾应为’$’,作为结束显示的标志。②DS:DX=字符串的首地址功能号

AH=09H类型号

21H出口参数无实现功能显示字符串,遇’$’停止显示,光标随动。第54页,课件共124页,创作于2023年2月例编程显示字符串’TsinghuaUniversity’dataSEGMENT

;定义显示的子符串striDB‘TsinghuaUniversity’,‘$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data

;置缓冲区地址于DS:DXMOVDS,AXLEADX,stri

MOVAH,09H;调显示功能

INT21HMOVAH,4CH;返回DOS

INT21HcodeENDS

ENDstart第55页,课件共124页,创作于2023年2月有关键盘①键盘通过键盘接口电路与计算机连接。②键盘上的键有三种类型:字符键A~Z,0~9等功能键F1~F12,PageUp等组合控制键Shift,Ctrl,Alt等③

键盘上的每个键都有一个扫描码。◢◢据扫描码可确定操作的是哪个键、是按下键还是释放键;◢◢扫描码用一个字节表示。低7位是扫描码的数字编码,与键盘上的键一一对应;最高位D7位表示键的操作状态:当按下键时,D7=0;当释放键时,D7=1第56页,课件共124页,创作于2023年2月⑤

键盘中断子程功能(09H类型中断子程)

◢从键盘接口读取操作键的扫描码;

◢将扫描码转换成字符码;大部分键的字符码为ASCII码,无ASCII码键(如组合键Shift、Ctrl等)的字符码为0。◢将键的扫描码、字符码存放在键盘缓冲区,供其它有关键盘的中断子程应用。④键盘接口对按下键和释放键均向计算机发出中断申请,如果中断响应条件满足,CPU转去执行键盘中断子程。

键盘中断子程类型号为09H。第57页,课件共124页,创作于2023年2月3.单字符输入(01H、07H、08H功能)①入口参数无

功能号

AH=01H

类型号

21H

出口参数AL=键入字符的ASCII码

实现功能

等待从键盘输入一个字符,并在屏幕上回显,光标移动,检测Ctrl-Break键第58页,课件共124页,创作于2023年2月例利用键盘输入的字符产生分支:MOVAH,1;等待从键盘输入INT21H

CMPAL,‘Y’

;是’Y’?JZyes

CMPAL,‘y’

;是’y’?

JZyesno:......JMPexityes:......exit:...第59页,课件共124页,创作于2023年2月例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(scanskey.asm)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000H;设置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;设置查找长度MOVBX,0;计算值初值

MOVAH,01H;从键盘输入

INT21H;输入关键字

MOVDL,AL;保存在DL中next:LODSB;从串取CMPAL,DL;与关键字比较JNZpointINCBX;计算值加1point:LOOPnext;查找结束?CALLdisplay;调用显示子程MOVAH,4CH;调用4CH功能INT21H;返回DOS;用二进制显示BX内容子程displayPROCMOVCX,16;显示位数rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin第60页,课件共124页,创作于2023年2月②入口参数无功能号

AH=07H类型号

21H出口参数AL=键入字符的ASCII码实现功能

等待从键盘输入一个字符,不在屏幕上回显,不检测Ctrl-Break键第61页,课件共124页,创作于2023年2月例用不带回显功能输入密码时:input:MOVAH,07H

;等待从键盘输入

INT21HMOV[DI],AL;存入缓冲区

CMPAL,0DH;是回车符?JNZinput;不是,继续输入check:、、、、、、第62页,课件共124页,创作于2023年2月4.字符串输入(0AH功能)

入口参数DS:DX=缓冲区的首地址(DS:DX)=限制最多输入的字符数

功能号

AH=0AH

类型号

21H

出口参数(DS:DX+1)=实际键入的字符(不含回车符)从(DS:DX+2)开始顺序存放键入的字符串,回车符0DH为串尾最后一字符。

实现功能等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,

回车符使光标回到行首。

注意事项:应按要求先定义缓冲区,再调用。第63页,课件共124页,创作于2023年2月例应用0AH功能输入字符串。

dataSEGMENT;定义缓冲区maxDB11;定义限制最多输入个数lenthDB?;用于存放实际输入个数striDB11DUP(?);用于存放输入的字符串dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,max

MOVAH,0AHINT21H;调0A输入功能

MOXCH,0MOVCL,lenth;取字符串长度放CX中

LEABX,stri;取字符串首址于BX中MOVAL,[BX];应用输入字符、、、、、codeENDS第64页,课件共124页,创作于2023年2月dataSEGMENT;定义缓冲区maxDB11;定义限制最多输入个数lenthDB?;用于存放实际输入个数striDB11DUP(?);用于存放输入的字符串dataENDS从键盘输入‘ABCD’,回车,内存的存放结果:0B04414243440D00max07000000000000000080a0b0f12345690c0d0elenthstri地址内容DS:DX第65页,课件共124页,创作于2023年2月如下编程与上例相同:dataSEGMENT

maxDB11等价于:

DB?

maxDB11,?,11DUP(?)

DB11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,max

MOVAH,0AH;调输入功能

INT21H

MOXCH,0MOVCL,max+1;取字符串长度放CX中

LEABX,max+2;取字符串首址于BX中MOVAL,[BX];应用输入字符、、、codeENDS第66页,课件共124页,创作于2023年2月dataSEGMENTmaxDB11DB?DB11DUP(?)dataENDS从键盘输入‘ABCD’,回车,内存的存放结果:等价于maxDB11,?,11DUP(?)0B04414243440D00max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX第67页,课件共124页,创作于2023年2月0AH功能执行过程:①若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束调用。②若(DS:DX)字节单元的内容大于0,则等待从键盘输入,并把输入键的ASCII码顺序存放在DS:DX+2开始的单元,按回车键表示结束输入。当按下键的个数超过(DS:DX)中值,发出警告声’嘟嘟’,不再接收输入的数据,直到输入回车键。③将实际输入的字符个数(不包括回车键)填入(DS:DX+1),结束调用。DS:DX00000000000000000000000000000000第68页,课件共124页,创作于2023年2月0AH功能注意事项:◢输入的字符均带回显,且光标随字符移动。当输入回车符结束时,也回显回车符。表现为功能调用结束后,光标回到了行首。◢

回车符0DH作为一个输入的字符存放在字符串尾,但计数输入个数时,不包括回车键。实际最多能输入的字符数=限制的最多数-1(回车符占一个)◢

执行完0AH功能后,DS和DX的值不变,DS:DX仍指向缓冲区的首地址。◢

整个缓冲区的大小应为:限制的最多数+2maxDB11,?,11dup(?)第69页,课件共124页,创作于2023年2月例利用DEBUG查看0A功能输入结果。dataSEGMENTmaxDB11,?,11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,max

MOVAH,0AH;调输入功能

INT21H

MOVCH,0MOVCL,max+1;取输入长度到CX中MOVAH,4CH;返回DOSINT21HcodeENDSENDstart第70页,课件共124页,创作于2023年2月D:\MASM>DEBUGTEST0a.exe

;装入执行文件-U

;反汇编程序

129E:0000B89D12MOVAX,129D129E:00038ED8MOVDS,AX129E:00058D160000LEADX,[0000]129E:0009B40AMOVAH,0A129E:000BCD21INT21129E:000DB500MOVCH,00129E:000F8A0E0100MOVCL,[0001]129E:0013B44CMOVAH,4C129E:0015CD21INT21、、、-D129D:0L10

;查看程序执行前缓冲区内容

129D:00000B00000000000000-0000000000000000-G

000D

;执行程序

Hello

;从键盘输入字符串

Programterminatednormally-D129D:0L10

;查看程序执行后缓冲区内容

129D:00000B

05

48656C6C6F0D-0000000000000000..Hello-第71页,课件共124页,创作于2023年2月思考:1.若将程序改为如下形式,设想程序执行的结果。dataSEGMENTmaxDB100HDUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,max

MOVAH,0AH;调输入功能INT21HMOVAH,4CH;返回DOSINT21HcodeENDSENDstart第72页,课件共124页,创作于2023年2月结果是:不等待输入,结束0AH功能调用。0000000000000000max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX注意:由于DS:DX限制输入最大字符数为0,

所以不等待输入,结束0AH功能调用。原因是:第73页,课件共124页,创作于2023年2月2.若将程序改为如下形式,设想程序执行的结果。dataSEGMENTmaxDW100H,?,100HDUP(?);定义为字类型dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,max

MOVAH,0AH;调输入功能INT21HMOVAH,4CH;返回DOSINT21HcodeENDSENDstart第74页,课件共124页,创作于2023年2月结果是:不等待输入,结束0AH功能调用。0001000000000000max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX注意:0AH功能以字节类型应用DS:DX指向的缓冲区。并不随缓冲区类型定义的变化而变化。原因是:第75页,课件共124页,创作于2023年2月例编程从键盘输入字符串,给出显示提示’Pleaseinput:’dataSEGMENTstriDB‘PleaseInput:’,’$’maxDB11,?,11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,striMOVAH,09H;显示提示INT21HLE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论