660 likes | 849 Views
微型计算机原理及其应用 —— 第四章:汇编语言程序设计. 合肥工业大学计算机与信息学院. 第四章:汇编语言程序设计. 汇编语言的基本要素 伪指令 汇编语言程序设计. 第四章:汇编语言程序设计. 汇编语言的基本要素 伪指令 汇编语言程序设计. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式 汇编语言中的常数 汇编语言中的运算符和表达式. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式 汇编语言中的常数 汇编语言中的运算符和表达式. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式
E N D
微型计算机原理及其应用——第四章:汇编语言程序设计微型计算机原理及其应用——第四章:汇编语言程序设计 合肥工业大学计算机与信息学院
第四章:汇编语言程序设计 • 汇编语言的基本要素 • 伪指令 • 汇编语言程序设计
第四章:汇编语言程序设计 • 汇编语言的基本要素 • 伪指令 • 汇编语言程序设计
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言的格式 • 汇编语言中的常数 • 汇编语言中的运算符和表达式
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言的格式 • 汇编语言中的常数 • 汇编语言中的运算符和表达式
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言的格式 由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1~4个部分组成,其格式是: [标号] 指令助记符 [操作数] [;注解] • 标识符:给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母:A ~ z ; 数字:0 ~ 9 ; 特殊字符:?、· 、@、一、$ 。数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。 • 指令助记符:表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。 • 操作数:指令执行的对象。依指令的要求,可能有一个、两个或者没有。 • 注解:该项可有可无,是为源程序所加的注解,用于提高程序的可读性。
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言的格式 • 汇编语言中的常数 • 汇编语言中的运算符和表达式
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的常数 汇编语言中的常数可以分数值常数和字符串常数两类。数值常数按其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同的表示形式,汇编语言中采用不同的后缀加以区分。 • B:表示二进制数。例如,10100101B。 • D:表示十进制数。例如,278D或278。 • Q:表示八进制数。例如,567Q,263Q。 • H:表示十六进制数。例如,9AH,5678H。 • 字符串常数是由单引号括起来的一串字符。例如:‘THIS IS A STUDENT!’‘12345’ • 要指出的是,此处的’12345’其值并非是十进制数12345,而是代表它们所对应的ASCII码,即31H,32H,33H,34H,35H。
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式 在表达式中,运算符充当着重要的角色。8086宏汇编有算术运算符、逻辑运算符、关系运算符、数值回送操作符和属性操作符共5种。 数值回送(Value_returning)操作符可以把一些特征或存储器地址的一部分作为数值回送。共有5个:SEG(求段基值)、OFFSET(求偏移量)、TYPE(求变量类型)、LENGTH(求字节数)和SIZE(求字节数)。其中LENGTH和SIZE只对数据存储器地址操作数有效。 属性操作符可以用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,而忽略当前的属性。共有6个:PTR、段属性前缀、SHORT、THIS、HIGH和LOW。
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——数值回送操作符 • SEG运算符:利用运算符SEG可以得到一个标号或变量的段基址 • 格式:SEG变量名或标号名 • 例如:已知数据段DATA从存储器实际地址03000H开始,作如下定义后,用SEG运算符求变量所在的段基址。 DATA SEGMENT ;定义数据段 VAR1 DB 10H,18H,25H,34H ;定义字节数据 VAR2 DW 2300H,1200H ;定义字数据 VAR3 DD 11002200H,33004400H ;定义双字数据 DATA ENDS ;数据段结束 • MOV BX,SEG VAR1汇编成: MOV BX,0300H • MOV CX,SEG VAR2汇编成: MOV CX,0300H • MOV DX,SEG VAR3汇编成; MOV DX,0300H
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——数值回送操作符 • OFFSET运算符:利用运算符OFFSET可以得到一个标号或变量的偏移量。 • 使用格式:OFFSET 变量名或标号名 DATA SEGMENT ;定义数据段 VAR1 DB 10H,18H,25H,34H ;定义字节数据 VAR2 DW 2300H,1200H ;定义字数据 VAR3 DD 11002200H,33004400H ;定义双字数据 DATA ENDS ;数据段结束 • MOV BX,OFFSET VAR1汇编成: MOV BX,0000H • MOV CX,OFFSET VAR2汇编成: MOV CX,0004H • MOV DX,OFFSET VAR3汇编成: MOV DX,0008H
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——数值回送操作符 • TYPE运算符:TYPE运算符可加在变量、结构或标号的前面,所求出的是这些存储器操作数的类型部分。运算符TYPE的运算结果是一个数值,这个数值与存储器操作数类型属性的对应关系。 MOV BX,TYPE VAR1汇编成: MOV BX,1 MOV CX,TYPE VAR2 汇编成: MOV CX,2 MOV DX,TYPE VAR3 汇编成: MOV DX,4
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——数值回送操作符 • LENGTH运算符:LENGTH运算符放在数组变量的前面,可以求出该数组中所包含的变量的个数。 ARRAY1 DB 100DUP(?) ARRAY2 DW 10DUP(?) ARRAY3 DD 10DUP(?) 下列指令: MOV BX,LENGTH ARRAY1 汇编后:MOV BX,100 MOV CX,LENGTH ARRAY2 汇编后:MOV CX,10 MOV DX,LENGTH ARRAY3 汇编后:MOV DX,10
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——数值回送操作符 • SIZE运算符:如果一个变量已经用重复操作符DUP加以说明,则利用SIZE运算符可以得到分配给该变量的字节总数。 ARRAY1 DB 100DUP(?) ARRAY2 DW 10DUP(?) ARRAY3 DD 10DUP(?) 下列指令: MOV BX,SIZE ARRAY1 汇编后:MOV BX,100 MOV CX,SIZE ARRAY2 汇编后:MOV CX,20 MOV DX,SIZE ARRAY3 汇编后:MOV DX,40
第四章:汇编语言程序设计——汇编语言的基本要素第四章:汇编语言程序设计——汇编语言的基本要素 • 汇编语言中的运算符和表达式——属性操作符 • PTR运算符:用来建立一个符号地址。其本身并不分配存储器,只是用来给已分配的存储器地址赋予另一种属性,使该地址具有另一种类型。 VAR1 DB 10H,18H,25H,34H VAR2 DW 1223H,1200H MOV AX, WORD PTR VAR1执行后:AX=1810H MOV BL, BYTE PTR VAR2 执行后:BL=23H
第四章:汇编语言程序设计 • 汇编语言的基本要素 • 伪指令 • 汇编语言程序设计
第四章:汇编语言程序设计——伪指令 伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令CPU去执行什么操作。 亦即它不像机器指令那样是在程序运行期间由计算机来执行的,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 该类伪指令用来定义存贮空间及其所存数据的长度。 • DB:定义字节,即每个数据是1个字节。 • DW:定义字,即每个数据占1个字(2个字节)。 • DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址。 • DQ:定义4字长,即每个数据占4个字。 • DT:定义10个字节长,用于压缩式十进制数据。 • 例如:DATA1 DB 10H,6,78H,100 • 表示从DATA1单元开始连续存放10H,6,78H,100,共占4个字节地址。
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 DATA1 DB 20H DATA2 DW 0240H,1000H DATA3 DB (-1*3),(15/5) DATA4 DD 12345H DATA5 DB '0123' DATA6 DW 'AB','C','D' DATA7 DB ? DATA8 DD ? DATA9 DB 5DUP(00) DATA10 DW 3DUP(?)
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 符号定义伪指令 • EQU伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,如: COUNT EQU 100 ;COUNT代替常数100 SUM EQU 30*25 ;SUM代替数值表达式 C EQU CX ;C代替寄存器CX M EQU MOV ;M代替指令助记符MOV • 需要注意的是,一个符号一经EQU伪指令赋值后,在整个程序中,不允许再对同一符号重新赋值。
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 段定义伪指令 段定义伪指令的用途是在汇编语言程序中定义逻辑段,用它来指定段的名称和范围,并指明段的定位类型、组合类型及类别。常用的段定义为指令有SEGMENT和ENDS。 段名 SEGMENT [定位类型] [组合类型] [类别]…(段内语句系列)段名 ENDS
第四章:汇编语言程序设计——伪指令 • 段定义伪指令 DATA1 SEGMENT ┇ DATA1 ENDS STACK1 SEGMENT STACK ┇ STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX ┇ CODE1 ENDS
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 设定段寄存器伪指令 设定段寄存器伪指令用来通知汇编程序哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。常用的段定义为指令有ASSUME。 ASSUME 段寄存器:段名[,段寄存器:段名,……] 注意:由于ASSUME伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。
第四章:汇编语言程序设计——伪指令 • 设定段寄存器伪指令 DATA1 SEGMENT ┇ DATA1 ENDS STACK1 SEGMENT STACK ┇ STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX ┇ CODE1 ENDS
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 定义过程伪指令 在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。一个过程由伪指令PROC和ENDP来定义。 过程名 PROC [类型] 过程体 RET 过程名 ENDP 其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。过程可以嵌套,也可以递归使用。
第四章:汇编语言程序设计——伪指令 • 定义过程伪指令 DELAY PROC MOV BL,10 DELY: MOV CX,2801 WAIT: LOOP WAIT DEC BL JNZ DELY RET DELAY ENDP
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 宏指令 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。 宏指令的一般格式为: 宏指令名 MACRO [形式参量表] 宏体 ENDM 例如:SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • ORG伪指令 ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。 一般格式: ORG <表达式> 例如:DATA SEGMENT BUFF1 DB 23,56H,‘EOF’ ORG 2000H BUFF2 DB ‘STRING’ DATA ENDS
第四章:汇编语言程序设计——伪指令 • 定义数据伪指令 • 符号定义伪指令 • 段定义伪指令 • 设定段寄存器伪指令 • 定义过程的伪指令 • 宏指令 • ORG伪指令 • 汇编结束伪指令END
第四章:汇编语言程序设计——伪指令 • 汇编结束伪指令END 该伪指令表示源程序的结束.令汇编程序停止汇编。因此,任何一个完整的源程序均应有END指令。 一般格式: END [表达式] 其中表达式表示该汇编程序的启动地址。例如: END START ;表明该程序的启动地址为START。
第四章:汇编语言程序设计 • 汇编语言的基本要素 • 伪指令 • 汇编语言程序设计
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述 • 顺序程序设计 • 选择程序设计 • 循环程序设计 • 子程序设计
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述 • 顺序程序设计 • 选择程序设计 • 循环程序设计 • 子程序设计
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述 1.编写源程序 在弄清问题的要求,确定方案后,汇编语言程序设计者便可依据前面的指令系统和汇编语言的规定,逐个模块地编写汇编语言源程序。 2.源程序输入微型机 在编辑软件EDIT.EXE或其他编辑软件的支持下,将源程序输入到计算机中。通常,汇编语言源程序的扩展名为 ASM。 3.汇编 利用汇编程序(或宏汇编程序)(ASM或MASM)对汇编语言源程序进行汇编,产生扩展名为OBJ的可重定位的目的代码。 4.连接 利用连接程序(LINK)可将一个或多个扩展名为OBJ文件进行连接,生成扩展名为扩展名为EXE的可执行文件。 5.调试 对于稍大一些的程序来说,经过上述步骤所获得的 .EXE可执行文件,在运行过程中难免无错。调试汇编程序最常用的工具是动态调试程序DEBUG。
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述 • 顺序程序设计 • 选择程序设计 • 循环程序设计 • 子程序设计
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 顺序程序设计 对于一些简单的数据处理,只要把完成处理的各个步骤用汇编语言描述清楚,让计算机按指令编写的次序从头到尾一条条执行即可,这样的程序结构称为顺序结构。 【例4-1】已知X和Y是数据段中的两个无符号字节单元,用程序完成表达式Z=(X2+Y2)/2的计算。
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 顺序程序设计 DATA SEGMENT X DB 15 Y DB 34 Z DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据段 MOV AL,X ;X中的内容送AL MUL AL ;计算X×X MOV BX,AX ;X×X乘积送BX MOV AL,Y ;Y中的内容送AL MUL AL ;计算Y×Y ADD AX,BX ;计算X2+Y2 SHR AX,1 ;计算(X2+Y2)/2 MOV Z,AX ;结果送Z单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS END START ;汇编结束
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 顺序程序设计 【例4-2】从键盘读入两个一位数(按键时保证按下的是数字键),显示它们的积。先后从键盘上读取两个按键,分别减去30H得到它们对应的数值,然后相乘分解成十位数字与个位数字,转换成ASCⅡ码后依次输出即可。为了输入输出效果的直观,有必要在每次按键后回车换行。 CODE SEGMENT ASSUME CS:CODE MAIN: MOV AH,1 INT 21H ;读入第1个数字 MOV BL,AL ;保存在BL中 MOV AH,2 MOV DL,13 INT 21H ;回车 MOV DL,10 INT 21H ;换行 MOV AH,1 INT 21H ;读入第2个数字 SUB AL,30H ;第2个数字转换成十进制数 SUB BL,30H ;第1个数字转换成十进制数 MUL BL ;两个数相乘,积在AX中
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 顺序程序设计 MOV BL,10 ; DIV BL ;积除以10取商送AL,余数在AH中 ADD AX,3030H ;转换成相应的ASCⅡ码 MOV BX,AX ;保存在BX中 MOV AH,2 MOV DL,13 INT 21H ;回车 MOV DL,10 INT 21H ;换行 MOV DL,BL MOV AH,2 INT 21H ;输出十位数 MOV DL,BH INT 21H ;输出个位数 MOV AH,4CH INT 21H ;返回DOS CODE ENDS END MAIN ;程序结束
第四章:汇编语言程序设计——汇编语言程序设计第四章:汇编语言程序设计——汇编语言程序设计 • 汇编语言程序设计概述 • 顺序程序设计 • 选择程序设计 • 循环程序设计 • 子程序设计