您好,欢迎访问三七文档
1▲过程名常用作CALL调用指令的操作数,子程的最后安排RET返回指令,使执行完子程后能返回调用处。▲过程有两种类型:NEAR和FAR无类型项时,默认为NEAR类型。当过程与调用指令不在同一段时,应将过程定义为FAR类型。过程类型决定子程中RET的返回类型2例1displayPROC、、、、C3H、、RET;NEAR属性的过程对应段内返回displayENDP例2displayPROCFAR、、、、CBH、、RET;FAR属性的过程对应段间返回displayENDP3汇编语言程序举例三4;利用汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin;指示程序结束和;程序入口5七、等值定义伪操作格式符号名EQU需等值的表达式▲作用是用符号名等值指定的表达式其中:表达式可以是任何有效的操作数汇编时用语句中的表达式代替程序中符号所在的地方。▲应用:1.定义符号常量,方便修改程序。2.某表达式多次出现时,用等值伪操作可以方便编程。6;利用汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin;指示程序结束和;程序入口7实现用二进制显示中断向量表中数据D0H的个数。分析:中断向量表指内存0:0~0:3FFH大小400H(即1K)字节空间;查找关键字D0H;将关键字的个数,存放在BX中,采用二进制显示BX内容,16个字符;采用子程调用结构。8主程序流程图取内存单元内容,与关键字比较,相等?N开始YYNBX←计数值加1修改指针,指向下一单元CX←CX-1,查找结束?DS:SI←查找区域首地址0:0CX←查找长度400HBX←计数值初值0调用子程,显示BX的内容返回DOS子程序流程图开始YN清DL的高7位,只保留要显示位的值调用DOS系统02功能,显示DL中的字符CX←CX-1,显示结束?CX←显示字符个数16RET返回BX循环左移1位,将要显示的位移至最低位,保存在DL中DL←DL+30H,完成数值0~1的ASCII码转换9;利用汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQUD0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin;指示程序结束和;程序入口10;利用汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据D0H的个数keyEQU0D0H;用符号表示常量(关键字)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程MOVAH,4CH;返回DOSINT21H;用二进制显示BX内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin;指示程序结束和;程序入口思考:如何用SCANSB改写此程序?11例:用CMP指令在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(scanskey.asm)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000H;设置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;设置查找长度MOVBX,0;计算值初值MOVAH,01H;从键盘输入INT21H;输入关键字在AL中next:CMP[SI],ALJNZpointINCBXpoint:INCSICALLdisplay;调用显示子程MOVAH,4CH;调用4CH功能INT21H;返回DOS;用二进制显示BX内容子程displayPROCMOVCX,16;显示位数rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin12例:用LODSB在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(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改写程序13八、数值回送操作符:TYPE,LENGTH,SIEE,OFFSET,SEG5种。把一些特征或存贮器地址的一部分作为数值回送。·TYPE格式:TYPEvariable变量或label标号•回送该变量的以字节数表示的类型(DB为1,DW为2,DD为4,DQ为8,DT为10)•回送标号类型数值(NEAR为-1,FAR为-2)例:ARRAYDW1,2,3ADDSI,TYPEARRAY汇编程序其形式:ADDSI,214·LENGTH格式:LENGTHvariable对于变量中使用DUP,汇编回送分配给变量单元数,其他情况回送1。例:FESSDW100DUP(0)对于MOVCX,LENGTHFEES汇编程序将其形式:MOVCX,100其他情况:例:ARRAYDW1,2,3对于指令MOVCX,LENGTHARRAY汇编程序将使其形式为:MOVCX,1例:TABLEDB‘ABCD’对于指令MOVCX,LENGTHTABLE汇编程序使其形式为:MOVCX,115·SIZE格式:SIZEvariable回送分配给该变量的字节数LENGTH*TYPE例:FEESDW100DUP(0)MOVCX,SIZEARRAY将形成:MOVCX,200例:TABLEDB‘ABCD’MOVCX,SIEETABLE将形成:MOVCX,1例:ARRAYDW1,2,3MOVCX,SIEEARRAY形式:MOVCX,2LENGTH*TYPE=216小小结:TYPE变量的返回值是类型的字节数:DB为1,DW为2,DD为4,DQ为8,DT为10;TYPE标号的返回值是:NEAR为-1,FAR为-2。LENGTH变量返回:DUP分配的单元数,对于其他情况则返回1。SIZE返回值是:LENGTH和TYPE值的乘积,即变量的字节数。
本文标题:微机原理第五章
链接地址:https://www.777doc.com/doc-3177957 .html