1六、过程定义伪操作格式过程名PROC类型、、、过程名ENDP▲过程定义由伪操作PROC开始、ENDP结束。其中:PROC和ENDP必须成对出现,且语句前必须有过程名,过程名必须相同。▲PROC和ENDP语句之间为子程的指令序列。▲程序中可以定义多个过程。▲程序经汇编、连接及装入内存后,过程名为一具体的内存地址,指示子程入口。2▲过程名常用作CALL调用指令的操作数,子程的最后安排RET返回指令,使执行完子程后能返回调用处。▲过程有两种类型:NEAR和FAR无类型项时,默认为NEAR类型。当过程与调用指令不在同一段时,应将过程定义为FAR类型。过程类型决定子程中RET的返回类型3例1displayPROC、、、、C3H、、RET;NEAR属性的过程对应段内返回displayENDP例2displayPROCFAR、、、、CBH、、RET;FAR属性的过程对应段间返回displayENDP4;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据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汇编源程序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汇编程序提示出错的行号,据此可修改程序中的语法错误。11;汇编语言程序结构例二(子程结构);用二进制显示中断向量表中数据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改写此程序?12汇编、连接后,执行程序:D:\masmscans;在DOS下运行程序0000000000000100D:\masmdebug;利用DEBUG检测结果-S0:0L400D00000:00230000:00430000:00730000:009C-QD:\masm请上机自己调试该程序。13例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(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;代码段结束ENDbegin14例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(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改写程序15八、数值回送操作符:(自学)课前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,216·LENGTH格式:LENGTHvariable对于变量中使用DUP汇编回送分配给变量单元数,其他情况回送1。例:FESSDW100DUP(0)对于MOVCX,LENGTHFEES汇编程序将其形式:MOVCX,100其他情况例:ARRAYDW1,2,3对于指令MOVCX,LENGTHARRAY汇编程序将使其形式为:MOVCX,1例:TABLEDB‘ABCD’对于指令MOVCX,LENGTHTABLE汇编程序使其形式为:MOVCX,117·SIEE格式:SIEEvariable回送分配给该变量的字节数LENGTH*TYPE例:FEESDW100DUP(0)MOVCX,SIZEARRAY将形成:MOVCX,200例:TABLEDB‘ABCD’MOVCX,SIEETABLE将形成MOVCX,1例:ARRAYDW1,2,3MOVCX,SIEEARRAY形式MOVCX,2LENGTH*TYPE=218其中:TYPE变量的返回值是类型的字节数:DB为1,DW为2,DD为4,DQ为8,DT为10;TYPE标号的返回值是:NEAR为-1,FAR为-2。LENGTH变量返回DUP分配的单元数,对于其他情况则返回1。SIZE返回值是:LENGTH和TYPE值的乘积,即变量的字节数。