资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 汇编语言程序设计,汇编语言与汇编程序,4.1,伪指令,4.2,DOS功能调用,4.3,汇编语言程序设计基础,4.4,4.1 汇编语言概述,机器指令,:,用二进制编码的指令,如:1000 1001 1101 1000,机器语言编写程序烦琐,难记忆,易出错。,符号指令,:,由助记符、符号组成,与机器指令一一对应,MOV AX,BX,1000 1001 1101 1000,汇编:,机器只能识别机器指令,所以需要将符号指令,翻译成机器指令,翻译的过程称作汇编。,汇编程序:,完成汇编任务的程序。,4.1 汇编语言概述(续),汇编语言源程序:,用符号指令书写的程序。,1EPUSH DS,2BC0SUB AX,AX,50PUSH AX,B83412MOV AX,1234,8ED8MOV DS,AX,汇编语言源程序,汇编程序,目标文件,图4.1,4.2 汇编语言源程序格式,汇编语言源程序结构采用,分段式结构,。,一个汇编语言源程序由若干段组成,一般有数据段、代码段、扩展段和堆栈段四种类型,,源程序,可以根据实际需要确定段的数目,。,汇编语言的语句格式,4.2.1,伪指令,4.2.2,汇编语言源程序的结构,4.2.3,4.2.1 汇编语言的语句格式,汇编语言的语句分类,1,汇编语言语句的格式,2,1.汇编语言的语句分类,汇编语言有三种基本语句:,指令语句,伪指令语句,宏指令语句,指令语句,指令语句是指在汇编时产生目标代码对应着机器某种操作的语句,,每条指令语句都对应着CPU的一条机器指令,。,2.汇编语言语句的格式,指令语句的格式为,:,标号:助记符号 操作数;注释,伪指令语句的格式为,:,名称 定义符号 参数,参数;注释,标号和名称,助记符和定义符,操作数,注释,2)助记符和定义符,指令语句中的,助记符,,规定了该指令语句的操作。例如MOV、ADD、XOR等。,伪指令语句中的,定义符,对应于8086宏汇编中提供的伪操作功能。,(1)常量,常量:指令中出现的固定不变的值。可分为:,数值常量,字符常量,数值常量允许使用二进制、十进制、十六进制数,但要注意应以B、D、H字符结尾。,十六进制数如果以字母开头,则必须在该数前面加0,,以区别于标识符,如0F5H。,ASCII码常数可将字符放在单引号内,如A。,(2)变量,变量:指存放在某些存储单元中的值,这些值是可变的。,可以用不同的寻址方式对其存取。变量具有如下三种属性:,段属性,:,指变量所在段的,段基址,。,偏移量属性:,指变量单元地址与段的起始地址之间的地址,偏移量,。,类型属性:,是指变量所占存储单元的字节数。类型有字节(BYTE)、字(WORD)、双字(DWORD)等。,(3)表达式,分析运算符,取地址偏移量运算符OFFSET,类型设置运算符PTR,a)取地址偏移量运算符OFFSET,格式:,OFFSET 变量或标号,例:MOV SI,OFFSET BUF,等价于 LEA SI,BUF,注意:,OFFSET后面只能是变量或标号,。,格式:类型 PTR 表达式,其中类型可以是BYTE、WORD、DWORD。该运算符强制设置表达式类型为运算符前的规定类型。,例:MOV BYTE PTR SI,200,类型设置运算符PTR,1.符号定义伪指令,符号定义伪指令用来,给一个符号重新命名,,或定义新的类型属性等。,这些符号包括汇编语言中所用的变量名、标号名、过程名、寄存器名以及指令的助记符等。,符号定义伪指令有:,等价伪指令,等号伪指令,1)等价伪指令,格式:,符号名 EQU 表达式,例:A EQU 5*3+2,利用EQU伪指令,可以用一个名字代表一个数值。如该数值在程序中多次被引用,这种方法可以使程序更加简洁,并且将来修改数值时,只要修改一处,而不必修改多处,提高了修改的效率。,利用EQU伪指令,也可以用一个较短的名字来代表一个较长的名字。,EQU伪操作不能对同一个符号重复定义,。,2.数据定义伪指令,数据定义伪指令用来定义一个变量,为变量分配存储空间,赋初值等。,格式:,变量名 伪指令 表达式,表达式,变量名字段为可选项,可有可无。,表达式可以不止一个,但相互之间应以逗号分开。,伪指令,表达式,例4.4,例4.5,例4.8,伪指令,用,DB,定义的变量类型为字节,(BYTE),;,用,DW,定义的变量类型为字,(WORD),;,用,DD,定义的变量类型为双字,(DWORD),;,COUNT DB 3 字节变量COUNT,其初值为3,BUFF DW 11,52,23 定义一组连续的存单元 BUFF,代表这些单元的起始地址。,CHAR DD XYZ,SUM DW?,例4.4,X1,DB,08H,BUF,DW,01H,02H,03H,04H,X1,08H,01H,存储器,00H,BUF,02H,00H,03H,00H,04H,00H,01H,02H,03H,04H,例4.5,BUF1,DB,HELLO,BUF2,DB,AB,BUF1,H,E,存储器,L,BUF2,L,O,A,B,练习,分别写出下面题中相应的伪指令语句,定义一个数据段的字符变量或数据变量。,TRING为字符串变量:Persenal computer。,VALD为十进制数字节变量12,99。,VAIU为十六进制数字变量32H,0FAH。,VALZ为10个零的字节变量。,3.段定义伪指令,一个汇编语言源程序由若干个逻辑段组成,所有的指令、变量分别存放在各个逻辑段中。,段定义伪指令用来定义汇编语言源程序的逻辑段。,常用的段定义伪指令有:,SEGMENT/ENDS,ASSUME,ORG,1)伪指令,SEGMENT/ENDS,格式:,段名 SEGMENT,定位方式 组合方式 类别,段名 ENDS,SEGMENT为段定义符,ENDS为段结束符,它们必须成对出现。,省略号部分,:,对于,数据段,、扩展段和堆栈段来说,,一般是存储单元的定义、分配等伪指令,;,对于,代码段,来说,一般是完成程序功能的指令语句和伪指令语句。,段名是程序员为该段定义的名字,不可省略。,2)伪指令ASSUME,通过建立段与段寄存器之间的对应关系,明确源程序中逻辑段与物理段之间的关系。,格式:,ASSUME 段寄存器名:段名,段寄存器名:段名,其中段寄存器名必须是CS、DS、ES、SS中的一个,段名必须是由SEGMENT和 ENDS伪指令定义的段名。,ASSUME伪指令只指定所定义的段和段寄存器的对应关系,,并不能将段基址装入段寄存器中,。,数据段、扩展段、堆栈段寄存器的初值应该在代码段中由程序写入,代码段CS寄存器的初值由系统自动装入,。,例4.9,例4.9,DSEG SEGMENT,DATA1 DB 02H,BUF1 DW 01H,,,02H,,,03H,DSEG ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DSEG,START:MOV AX,DSEG,MOV DS,AX ;将DSEG段的段基址装入DS,CODE ENDS,END START,3)定位伪指令ORG,定位伪指令ORG可以设置当前汇编地址计数器中的值。,格式:,ORG 数值表达式,例4.11,例4.11,DSEG SEGMENT,ORG 10H,BUF,DB,1234,NUM,DW,50,DSEG ENDS,存储器,BUF,0010H,1,2,3,4,NUM,32H,00H,50,4.过程定义伪指令,格式:,过程名 PROC NEAR/FAR,过程名 ENDP,如没有指明类型,则,默认为NEAR类型,。,PROC和ENDP必须成对出现。,当一个程序段被定义为过程后,在其它地方就可以通过CALL指令来调用这段程序。,5.源程序结束伪指令,格式:,END 标号,该语句为源程序的最后一个语句,表示源程序的结束。,其中标号对应程序开始执行的起始地址。,4.2.3 汇编语言源程序的结构,例4.13:两数求和的程序段,DSEG SEGMENT DATA;定义数据段,DATA1 DB 15H;被加数,DATA2 DB 12H;加数,SUM DB 00H;和,DSEG ENDS;数据段结束,CSEG SEGMENT CODE;定义代码段,ASSUME CS:CSEG,DS:DSEG,START:MOV AX,DSEG,MOV DS,AX;装入数据段DS初值,MOV AL,DATA1;被加数送AL,ADD AL,DATA2;(AL)+DATA2 AL,MOV SUM,AL;和送SUM,HLT;暂停指令,CSEG ENDS;代码段结束,END START;源程序结束,汇编语言程序的结构是分段结构形式,一个汇编语言源程序由若干段组成,每个段以,SEGMENT,开始,以,ENDS,结束。,整个源程序以,END,结束。,每个段均有若干行指令,每一条指令占一行。,4.3 汇编语言程序设计,程序设计的基本步骤,4.3.1,顺序结构,4.3.2,分支结构,4.3.3,循环结构,4.3.4,子程序结构,4.3.5,4.3.1 程序设计的基本步骤,分析问题,建立数学模型,确定算法,绘制流程图,分配存储器及寄存器,编制程序,调试程序,4.3.2 顺序结构,顺序程序是指程序在执行时完全按照指令的存放顺序从第一条开始逐条执行,直到最后一条指令为止。,顺序程序能较好地完成一些基本功能,例如数据的传送和交接、查找和算术运算等。,顺序程序是构成复杂程序的基础。,例4.14,例4.14,设内存单元DATA存放一字节无符号数,编程将其拆成二个一位十六进制数,HEX单元存放低位十六进制数,HEX+1单元存放高位十六进制数。,DSEG SEGMENT,DATA DB 8AH,HEX DB 0,0,DSEG ENDS,SSEG SEGMENT STACK,STK DB 100 DUP(?),SSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DSEG,SS:SSEG,START:MOV AX,DSEG,MOV DS,AX,MOV AL,DATA;无符号数送AL,MOV AH,AL;保存副本到AH,AND AL,0FH;屏蔽高四位,MOV HEX,AL;保存低四位,AND AH,0F0H;屏蔽低四位,MOV CL,4,SHR AH,CL;右移四位,MOV HEX+1,AH;保存高四位,MOV AH,4CH,INT 21H;返回操作系统,CSEG ENDS,END START,4.3.3 分支结构,在很多实际问题中,都是根据不同的情况进行不同的处理。这种思想体现在程序设计中,就是根据不同条件而跳到不同的程序段去执行,这就构成了分支程序。,分支程序结构有,不完全分支结构,和,完全分支结构,两种基本形式。,例子,分支结构程序示例,设内存中有三个互不相等的有符号字数据,分别存放在X、Y、Z字单元中,编程将其中最小值存入MIN单元。,DSEG SEGMENT,X DW 4321H,Y DW 7658H,Z DW 9B00H,MIN DW,?,DSEG ENDS,SSEG SEGMENT STACK,STK DB 100 DUP(?),SSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DSEG,SS:SSEG,START:MOV AX,DSEG,MOV DS,AX,MOV AX,X,CMP AX,Y,JL NEXT,MOV AX,Y,NEXT:CMP AX,Z,JL DONE,MOV AX,Z,DONE:MOV MIN,AX,MOV AH,4CH,INT 21H,CSEG ENDS,END START,4.3.4 循环结构,在程序设计中,经常遇到一个程序段需要多次重复执行。对这类问题采用循环程序结构,可以使程序代码缩短,并节省内存。,循环程序的四部分:,循环初始化,:设置地址指针、置计数初值、设置必要的常数、对工作寄存器及工作单元置初值或清0等。,循环体,:重复执行的部分,循环的核心。,循环修改,:修改计数器、寄存器、地址指针、恢复某些参数。,循环控制,:判断控制循环是否结束或继续。,图4.4 循环结构图,循环程序有两个基本结构:,先处理后判断结构,先判断后处理结构,例4.18,试编程统计DA1字单元中二进制数据中含1的个数,结果存于DA2单元中。,分析:可以利用移位指令,将待判断的字数据一位一位地移到进位位中,然后判断进位位是1还是0,以此实现对二进制数据中含1的个数统计。,流程图,源程序,例4.18流程图,例4.18源程序,DSEG SEGMENT,DA1 DW 3F28H,DA2 DB?,DSEG ENDS,SSEG SEGMENT STACK,STK DB 100 DUP(?),SSEG ENDS,CSEG SEGMENT,ASSUME DS:DSEG,SS:SSEG,CS:CSEG,START:MOV AX,DSEG,MOV DS,AX,XOR BL,BL,MOV AX,DA1,LP:AND AX,AX,JZ DONE,SHL AX,1,JNC LP,INC BL,JMP LP,DONE:MOV DA2,BL,MOV AH,4CH,INT 21H,CSEG ENDS,END START,4.4 DOS功能调用,DOS(Disk Operation System)和BIOS(Basic Input and Output System)为用户提供两组系统服务程序。用户程序可以调用这些系统服务程序。,DOS提供若干功能调用。包括,基本输入/输出管理,、内存储器读/写管理、磁盘文件的读/写管理、时间和日期的设置功能。,BIOS在较低层次上为用户提供一组I/O程序,要求用户对硬件有一定的了解,但也不要求用户直接控制外设。BIOS驻留在ROM中,独立于操作系统。,用户通过软中断指令INT n去调用DOS和BIOS中的服务程序来访问系统,。,系统功能调用的方法,4.4.1,常用的系统功能调用,4.4.2,4.4.1 系统功能调用的方法,INT 21H是一个具有多个子功能的中断服务程序,这些子功能的编号称为功能号。INT 21H一般称为系统功能调用。,调用步骤:,置入口参数,功能号,AH,执行INT 21H,分析出口参数,视具体情况而定,4.4.2 常用的系统功能调用,返回操作系统(4CH功能),5,在屏幕上输出字符串(09H功能),3,字符串输入(0AH功能),4,在屏幕上输出单个字符(02H功能),2,读取键盘单个字符并回显(01H功能),1,1.读取键盘单个字符并回显(01H功能),调用方式:,MOV AH,1;子功能号送AH,INT 21H,说明:该调用没有入口参数,执行时,系统扫描键盘,等到键盘按下,先检查是否是CTRL-BREAK键,如是则退出命令执行,否则将按下键对应ASCII码送入AL寄存器,并在屏幕上显示该字符。,2.在屏幕上输出单个字符(02H功能),调用方式:,MOV AH,2;子功能号送AH,MOV DL,A,INT 21H;将字符A在屏幕上显示出来,说明:该调用无出口参数,入口参数(待显示字符的ASCII码)送DL,如DL中的字符为CTRL-BREAK,则终止程序执行。,3.在屏幕上输出字符串(09H功能),功能:,在输出设备上显示一个以$为结束标志的字符串。,入口参数:DS:DX指向一个以$为结束标志的字符串。,例:BUF DB WELCOME TO OUR SYSTEM$,.,MOV DX,OFFSET BUF,MOV AH,9,INT 21H,运行后,在屏幕上显示“WELCOME TO OUR SYSTEM”。,4.字符串输入(0AH功能),功能:,将从键盘上输入的一串字符送到指定的内存缓冲区。,入口参数:DS:DX指向内存缓冲区。,缓冲区的第一个字节:放缓冲区,能容纳的最大字符个数,(1-255),不能为零。,缓冲区的第二个字节:是保留来,填写实际输入的字符个数,,由计算机自动填入。,缓冲区的第三字节开始,存放从键盘接收到的字符,最后结束字符串的回车符也包括在内。如实际键入的字符数少于定义的字节数,缓冲区内其余字节填零,若多于定义的字节数,则后来的输入字符丢掉并响铃。,字符串输入(0AH功能)示例,DSEG SEGMENT,BUF DB 30 ;定义缓冲区的长度,DB?;保留为填入实际输入的字符个数,DB 30 DUP(?);定义30个字节存储空间,用以存放键入的字符,DSEG ENDS,CSEG SEGMENT,.,LEA DX,BUF,MOV AH,0AH,INT 21H,.,CSEG ENDS,5.返回操作系统(4CH功能),无入口参数。,功能:结束当前程序,返回操作系统。,调用方式:,MOV AH,4CH,INT 21H,
展开阅读全文