第四章汇编语言程序设计4.1程序格式和表达式程序格式MASM中的语句分为指令性语句和伪指令语句指令性语句与机器指令相对应,汇编程序将它们翻译成目标代码。语句格式为:标号:指令助记符操作数,操作数;注释伪指令语句没有对应的机器指令,可完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。名字伪指令指示符操作数,操作数;注释汇编语言中常数,变量和标号是三种基本数据项4.1程序格式和表达式MASM中的表达式算术运算符逻辑运算符关系运算符数值返回修改属性其他运算符运算符优先级算术运算符符号名称运算结果+加法和-减法差*乘法积/除法商MOD模除余数SHL左移左移后的二进制数SHR右移右移后的二进制数例:ARRAYDB1,2,3,4,5TRYDB20MOVAX,30*5MOVCX,(TRY–ARRAY)DAEQU300MOVCX,DA/100逻辑运算符符号名称运算结果AND与运算逻辑与结果OR或运算逻辑或结果XOR异或运算逻辑异或结果NOT非运算逻辑非结果例:MOVAL,NOTOFFHMOVBL,8CHAND73HMOVAH,8CHOR73HMOVCH,8CHXOR73H关系运算符符号名称运算结果为真输出全‘1’,为假输出全‘0’EQ相等NE不等LT小于LE小于等于GT大于GE大于等于例:MOVAX,10HGT16ADDBL,6EQ0110BMOVCX,((PORTLT5)AND100)OR((PORTGE5)AND200)数值返回符号名称运算结果OFFSET返回偏移地址偏移地址SEG返回段地址段地址TYPE返回元素字节数字节数LENGTH返回变量单元数单元数SIZE返回变量总字节数总字节数例:MOVBX,OFFSETDA1MOVAX,SEGM1MOVDS,AXA1DB20H,30HMOVAH,TYPEA1MOVCX,LENGTHA1MOVBL,SIZEA1修改属性符号名称运算结果段寄存器名段前缀修改段PTR修改类型属性修改后类型THIS指定类型/距离属性指定后类型HIGH分离高字节高字节LOW分离低字节低字节SHORT短转移说明-128~127字节间转移例:N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1MOVBL,BYTEPTRN2FIRSTEQUTHISBYTETABLEDW200DUP(?)L1:JMPSHORTL2K1EQU0ABCDHMOVAH,HIGHK1MOVBL,LOWK1其他运算符符号名称运算结果()圆括号改变运算符优先级[]方括号下表或间接地址•点运算符连接结构与变量尖括号修改变量MASK记录位图位图形WIDTH记录宽度记录/字段位数运算符优先级优先级运算符1(),[],,•,LENGTN,WIDTH,SIZE,MASK2PTR,OFFEST,SEG,TYPE,THIS,CS:,DS:,ES:,SS:3HIGH,LOW4*,/,MOD,SHL,SHR5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT4.2伪指令1数据定义语句和存储指令2表达式赋值语句3段定义语句4过程定义语句5程序开始和结束语句6结构和宏定义语句7外部伪指令及对准伪指令1数据定义语句DB定义字节(8位)DW定义字(16位)DD定义双字(32位)DQ定义四字(64位)DT定义10个字节(80位)DUP产生重复的字符或数字存储段中数据存储指令PTR指示存储器指针BYTE指示字节的长度的操作数,如同BYTEPTRWORD指示字操作数的作用,如WORDPTRDWORD指示双字长度的操作数,如DWORDPTRNEAR定义近指针FAR定义远指针格式1:变量名助记符操作数,操作数…格式2:变量名助记符nDUP(操作数,操作数….)N必须是正整数,表示括号内操作数的重复次数例如:DA1DB10H,23H;变量DA1装入10H,23HDA2DW‘OK’;字符串‘OK’的ASCII码装入DA2开始的存储单元中DA3DB?;变量DA3为不确定字节,保留1字节空间DA4DB5DUP(0);重复5个0存入DA4开始的存储单元中2表达式赋值语句1)赋值语句EQU格式:符号名EQU表达式;一个符号名只能定义一次例:COUNTEQU100;常数赋给符号名COUNTDATAEQUCOUNT+2;表达式赋给符号名DATAA1EQU[BX+SI];B1EQUORRSETA1;C1EQUADD;加法指令赋给符号名C12)等号语句=与EQU功能相同,可以重复定义,例如:COUNT=100COUNT=COUNT+103段定义语句段定义语句SEGMENTENDS定义段段名segment定义类型组合类型‘分类名’段名ends;指示段或者结构结束功能:将一个逻辑段定义成一个整体ASSUME规定段所属的段寄存器assumecs:段名,ds:段名,ss:段名,ES:段名功能:定义4个逻辑段,指明段和段寄存器的关系3段定义语句定义类型是对该段起始位置的定义。参数有:PARA,BYTE,WORD,PAGE组合类型提出各个逻辑段之间的组合方式,参数包括:NONE,PUBLIC,COMMON,AT表达式,STACK,MEMORY分类名的主要作用式汇编程序连接时将所有同名的逻辑段组成一个段组。例:DATASEGMENTDIDW1234HP1DD?DATAENDSSTACKSEGMENTSTACK‘STACK’DW100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK…….CODEENDS4过程定义语句格式:过程名PROC属性;过程内容RETN过程名ENDP功能:定义一个过程,主程序可以用CALL指令调用。过程名的三种属性:段属性:该过程所在段的基址偏移地址属性:该过程第一字节与段首之间距离字节距离属性:NEAR或FAR。例:MCODESEGMENTMAIN••SPDPROCFAR•••RETSPDENDP•••CALLSPD•••MCODEENDS5程序开始和结束语句NAME格式:NAME程序名功能:为源程序目标模块赋名字ORG格式:ORG表达式功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。表达式:给定的偏移地址值,结果是正整数END格式:END标号名功能:标记汇编源程序结束标号名:该程序第一条可执行语句的标号名6结构和宏定义语句结构的定义格式:结构名STRUC(用DB,DW,DD等语句定义数据变量)结构名ENDS功能:把各种不同类型的数据放在同一数据结构中结构付本预置必须先预置结构付本,汇编程序给每个结构付本分配存储空间。格式1:结构付本名结构名元素值,元素值…格式2:结构付本名结构名NDUP(元素值,元素值…)例:TABSTRUCT1DB‘ABCD’T2DW?T3DW2DUP(0)TABENDS•••TWOTAB‘STOP’•••MOVTWO•T2,AX6结构和宏定义语句宏定义语句MACRO定义宏的名字、参数和开始格式:宏名macroENDM指示宏序列结束7外部伪指令及对准伪指令外部伪指令PUBLIC名称,名称,….;注释EXTRN名称,类型,名称,类型,….;注释对准伪指令格式:EVEN功能:使下一语句的地址调整为偶地址LABEL格式:名称LABEL类型属性功能:为LABEL下一行语句中的变量或标号取别名例:DATASEGMENTA1DW4DUP(?)DATAENDSCODE1SEGMENT•••PUBLICA1CODE1ENDSPCODESEGMENTEXTRNA1:WORDMIAN:••••••MOVAX,OFFSETA1PCDOEENDSENDMAIN例:DATASEGMENTX1DB0DHEVENX2DW100DUP(?)DATAENDSDATBLABELBYTEDATWDW3031H,3233HMOVAL,DATB[0]MOVBX,DATW[1]4.3DOS系统功能调用1.DOS键盘功能调用2.DOS显示功能调用3.DOS打印功能调用4.日期与时间设置5.异步通讯6.返回操作系统DOS常用的软中断命令软中断指令功能入口参数出口参数INT20H程序正常退出无无INT21H系统功能调用AH=功能号,相应入口号相应出口号INT22H结束退出INT23HCtrl-Break处理INT24H出错退出INT25H读磁盘AL=驱动器号CX=读入扇区数DX=起始逻辑扇区号DS:BX=内存缓冲区地址CF=0成功CF=1出错INT26H写磁盘同上,CX=写入扇区数同上INT27H驻留退出DS:DX=程序长度1.DOS键盘功能调用AH功能入口参数出口参数1从键盘输入一个字符,并在屏幕上显示,检查Ctrl-Break键AL=字符8键盘输入一个字符,无回显6直接键盘输入/输出字符,不检查Ctrl-Break键DL=0FFHAL=字符7直接键盘输入/输出字符,无回显,不检查Ctrl-Break键AL=字符0AH输入字符串到内存缓冲区DS:DX=缓冲区首址0BH检查键盘输入状态AL=FFH有键入,=0无键入0CH清键盘缓冲区,调用键盘输入功能AL=键盘功能号2.DOS显示功能调用AH功能入口参数说明2显示一个字符,检查Ctrl-Break键DL=字符光标跟踪字符移动6显示一个字符,不检查Ctrl-Break键DL=字符光标跟踪字符移动9显示字符串DS:DX=串地址串以‘$’结束,光标跟随移动3.DOS打印功能调用字符码功能字符码功能08H空格0FH设置紧缩方式09H水平TAB(横表)0EH设置扩展方式0AH换行12H取消紧缩方式0BH垂直TAB(纵表)14H取消扩展方式0CH换页1BH30H设置每英寸8行0DH回车1BH32H设置每英寸16行1BH45H设置加重打印方式1BH46H取消加重打印方式4.日期与时间设置功能号功能入口参数出口参数2BH设置日期CX:年号;DH:月号DL:日号AL=0成功AL=0FFH无效2AH取消日期CX:年号;DH:月号DL:日号2DH设置时间CH:小时;CL:分DH:秒;DL:百分之一秒AL=0成功AL=0FFH无效2CH取消时间CH:小时;CL:分DH:秒;DL:百分之一秒5.异步通讯MOVAH,4CHINT21H6.返回操作系统功能号功能入口参数出口参数3异步通讯口输入AL=输入8位数据4异步通讯口输入DL=输出8位数据4.4汇编程序格式1高档微机新增伪指令2完整的段定义3模型方式格式1高档微机增加的伪指令.286选择80286指令系统.286P选择80286保护模式指令系统.386选择80386指令系统.386P选择80386保护模式指令系统.486选择80486指令系统.486P选择80486保护模式的指令系统.586选择Pentium指令系统.586P选择Pentium保护模式指令系统.287选择80287数字协处理器.387选择80387数字协处理器1高档微机增加的伪指令.EXIT用来使程序设计模型退回到DOS.MODEL选择编程模型.STARTUP在编程模型中指示程序的开始ALIGN2按字或双字分界的段中数据的开始USES自动保存过程使用的寄存器USE16386以上处理器使用16位指令模式和数据长度USE32386以上处理器使用32位指令模式和数据长度.STACK堆栈段定义.CODE代码段定义.DATA数据段定义2完整的程序格式(推荐使用)stacksegmentstack’stack’;定义堆栈段dw512dup(?);堆栈段有512字空间stackends;堆栈段结束Datasegment;定义数据段...;在数据段定义数据dataendsCodesegment;定义代码段assumecs:code,ds:data,ss:stackstart:movax,st