1第4章汇编语言程序设计2主要内容汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计3§4.1汇编语言源程序了解:汇编语言源程序的结构汇编语言语句类型及格式4一、汇编语言源程序结构51.汇编语言源程序与汇编程序汇编语言源程序汇编程序用助记符编写汇编程序汇编语言源程序机器语言目标程序源程序的编译程序62.汇编语言程序设计与执行过程输入汇编语言源程序(EDIT)汇编(MASM)链接(LINK)调试(TD)源文件.ASM目标文件.OBJ可执行文件.EXE最终程序7二、汇编语言语句类型及格式81.汇编语言语句类型指令性语句指示性语句CPU执行的语句,能够生成目标代码CPU不执行,而由汇编程序执行的语句,不生成目标代码92.汇编语言语句格式指令性语句:[标号:][前缀]助记符[操作数],[操作数][;注释]指令的符号地址标号后要有冒号操作码注释前加分号10指示性语句格式[名字]伪指令助记符操作数[,操作数,…][;注释]变量的符号地址其后不加冒号指示性语句中至少有一个操作数113.标号、名字标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。英文字母、数字及专用字符组成,最大长度不能超过31个,且不能由数字打头,不能用保留字(如寄存器名,指令助记符,伪指令)。124.操作数寄存器存储器单元常量变量或标号表达式13常量数字常量字符串常量例:‘A’MOVAL,’A’例:’ABCD’汇编时被译成对应的ASCII码41H,42H,43H,44H用单引号引起的字符或字符串14变量代表内存中的数据区,程序中视为存储器操作数变量的属性:变量所在段的段地址变量单元地址与段首地址之间的位移量。字节型、字型和双字型段值偏移量类型15表达式算术运算逻辑运算*关系运算取值运算和属性运算其它运算16算术运算和逻辑运算符算术运算符+,-,*,/,MOD逻辑运算符AND,OR,NOT,XOR例:MOVAL,8AND4MOVAL,8+4-117取值运算符取得其后变量或标号的偏移地址取得其后变量或标号的段地址TYPE取变量的类型LENGTH取所定义存储区的长度SIZE取所定义存储区的字节数用于分析存储器操作数的属性获取变量的属性值OFFSETSEG18取值运算符例MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATALEABX,DATA等价于19取值运算符例若BUFFER存储区用如下伪指令定义:BUFFERDW200DUP(0)则:TYPEBUFFER等于2LENGTHBUFFER等于200SIZEBUFFER等于40020属性运算符用于指定其后存储器操作数的类型运算符:PTR例:MOVBYTRPTR[BX],12H21其它运算符方括号:[]段重设符段寄存器名:[]方括号中内容为操作数的偏移地址用于修改默认的段基地址22§4.2伪指令掌握:伪指令的格式及实现的操作伪指令的应用23伪指令由汇编程序执行的“指令系统”作用:定义变量;分配存储区定义逻辑段;指示程序开始和结束;定义过程等。24常用伪指令数据定义伪指令符号定义伪指令段定义伪指令结束伪指令过程定义伪指令宏命令伪指令25一、数据定义伪指令用于定义数据区中变量的类型及大小格式:[变量名]伪指令助记符操作数,…;[注释]符号地址定义变量类型定义变量值及区域大小261.数据定义伪指令助记符DB定义的变量为字节型DW定义的变量为字类型(双字节)DD定义的变量为双字型(4字节)DQ定义的变量为4字型(8字节)DT定义的变量为10字节型27数据定义伪指令例DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD11H*2,22H,33445566H以上变量在内存中的存放形式28数据定义伪指令例_变量在内存中的分布DATA111223344DATA2224411000033DATA32200220000XX6655443329数据定义伪指令的几点说明伪指令的性质决定所定义变量的类型;定义字符串必须用DB伪指令例:DATA1DB‘ABCD’,66H‘A’‘B’‘C’‘D’41H42H43H44H66H302.重复操作符作用:为一个数据区的各单元设置相同的初值目的:常用于声明一个数据区格式:[变量名]伪指令助记符nDUP(初值,…)例:BW20DUP(0)M1DB10DUP(0)313.“?”的作用表示随机值,用于预留存储空间MEM1DB34H,’A’,?DW20DUP(?)预留40个字节单元,每单元为随机值随机数占1个字节单元32数据定义伪指令例M1DB‘Howareyou?’M2DW3DUP(11H),3344HDB4DUP(?)M3DB3DUP(22H,11H,?)变量在内存中的分区33数据定义伪指令例M1‘H’‘o’‘w’‘‘‘a’M211H11H00H44H33H‘r’‘e’‘‘‘y’‘o’‘u’‘?’11H00H00H随机数M311H22H11H22H11H22HXXXXXXXXXXXXXX34二、符号定义伪指令格式:符号名EQU表达式操作:用符号名取代后边的表达式,不可重新定义例:CONSTANTEQU100VAREQU30H+99HEQU说明的表达式不占用内存空间35三、段定义伪指令说明逻辑段的起始和结束;说明不同程序模块中同类逻辑段之间的联系形态36段定义伪指令格式段名SEGMENT[定位类型][组合类型][’类别’]┇段名ENDS说明逻辑段的起点说明不同模块中同名段的组和连接方式37定位类型PARA:段的起点从节边界开始(16个字节为1节)BYTE:段的起点从存储器任何地址开始WORD:段的起点从偶地址开始PAGE:段的起点从页边界开始(256个字节为1页)38组合类型与其它模块中的同名段在满足定位类型的前提下具有的组合方式:NONE:不组合PUBLIC:依次连接(顺序由LINK程序确定)COMMON:覆盖连接STACK:堆栈段的依次连接AT表达式:段定义在表达式值为段基的节边界MEMORY:相应段在同名段的最高地址处。39类别不同模块连接时将相同类别的段放在连续的内存区域中40段定义伪指令例DATASEGMENTMEM1DB11H,22HMEM2DB‘Hello!’MEM3DW2DUP(?)DATAENDS变量在逻辑段中的位置就代表了它的偏移地址表示变量所在逻辑段的段地址表示变量的类型41四、设定段寄存器伪指令说明所定义逻辑段的性质格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]42五、结束伪指令表示源程序结束格式:END[标号]43汇编语言源程序结构数据段名SEGMENT…数据段名ENDS附加段名SEGMENT…附加段名ENDS堆栈段名SEGMENT…堆栈段名ENDS代码段名SEGMENT…代码段名ENDSEND44一个完整源程序结构例DSEGSEGMENTDATA1DB1,2,3DUP(?)DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP(?)ESEGENDSSSEGSEGMENTSTACK‘STACK’DB200DUP(?)SSEGENDS45一个完整源程序结构例CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDSENDSTART源程序代码段寄存器初始化——将段地址送相应的段寄存器46六、过程定义伪指令用于定义一个过程体格式:过程名PROC[NEAR/FAR]┇RET过程名ENDPP157例过程入口的符号地址过程定义及调用例定义延时子程序DELAYPROCPUSHBXPUSHCXMOVBL,2NEXT:MOVCX,4167W10M:LOOPW10MDECBLJNZNEXTPOPCXPOPBXRETDELAYENDP47调用延时子程序:CALLDELAY48七、宏命令伪指令源程序中由汇编程序识别的具有独立功能的一段程序代码格式:宏命令名MACRO形式参数┇┇ENDM宏体宏49八、其它伪指令段内程序代码或变量的起始偏移地址格式:ORG表达式例:ORG2000H计算值为非负常数ORG50其它伪指令NAME-------为目标程序设定一个名字格式:NAME模块名TITLE-------为程序清单指定打印标题格式:TITLE标题名51§4.3功能调用DOS功能调用BIOS功能调用52DOS功能调用包含多个子功能的功能包;用软中断指令调用,中断类型码固定为21H;各子功能采用功能号来区分。53DOS功能调用设备管理目录管理文件管理其它54DOS功能调用调用格式:MOVAH,功能号置相应参数INT21H55一、单字符输入调用方法:MOVAH,01INT21H输入的字符在AL中56单字符输入例GET_KEY:MOVAH,1INT21HCMPAL,’Y’JZYESCMPAL,’N’JZNOJMPGET_KEYYES:┇NO:┇交互式应答程序57二、字符串输入注意问题:调用格式字符输入缓冲区的定义581.调用格式功能号OAH字符串在内存中的存放地址INT21HAHDS:DX592.定义字符缓冲区用户自定义缓冲区格式:0DHN1N2整个缓冲区最大可键入字符数实际键入字符数存放键入的字符存放字符个数:≤25560输入字符串程序段DAT1DB20,?,20DUP(?)┇LEADX,DAT1MOVAH,0AHINT21H在数据段中定义61输入缓冲区14H?20个字节定义后的输入缓冲区初始状态:62三、单字符显示输出功能号O2H待输出字符INT21HAHDL63单字符显示输出例MOVAH,02MOVDL,41HINT21H执行结果:屏幕显示A64四、字符串输出显示功能号O9H待输出字符串的偏移地址INT21HAHDS:DX65字符串输出显示被显示的字符串必须以‘$’结束,且所显示的内容不应出现非可见的ASCII码66字符串输出显示例DATASEGMENTMESS1DB‘InputString:’,0DH,0AH,’$’DATAENDSCODESEGMENT┇MOVAH,09MOVDX,OFFSETMESS1INT21H┇67§4.4汇编语言程序设计设计步骤:根据实际问题抽象出数学模型确定算法画程序流程图分配内存工作单元和寄存器程序编码调试68程序流程图符号起始:功能:判断:子过程:69汇编语言程序结构顺序结构循环结构先判定型后判定型分枝结构单分枝多分枝子程序结构70本章注意点完整的汇编语言源程序结构定义逻辑段,说明段的含义,初始化段寄存器伪指令数据定义方式字符及字符串的输入和显示输出字符输入缓冲区的定义,输出字符串的定义源程序的编写几种结构(顺序、循环、分枝等)