《微机原理课件第9讲.ppt》由会员分享,可在线阅读,更多相关《微机原理课件第9讲.ppt(67页珍藏版)》请在三一办公上搜索。
1、,微,机,原,理,及,应,用,Microcomputer Principium and Application,1,上节内容回顾,汇编程序的基本结构汇编语言中的表达式,2,实验一,【实验题目】熟悉实验环境和程序设计实验【实验目的】熟悉并掌握ADEK教学平台使用方法。熟悉并了解汇编语言程序设计方法。【实验内容】教材P122,10、14题,要求将已知条件编入程序,按标号书写各语句。分析各语句的功能并记录运行结果与预期是否相符。,3,实验一,CODE SEGMENTASSUME CS:CODESTART:MOV AX,2508H MOV BX,0F36H MOV CX,0004H MOV DX,18
2、64H;you codeCODE ENDSEND START,AND AH,CL,要求逐条指令执行记录目的操作数的结果 CF的值怎么看?,4,实验一,(1)AND AH,CL(2)OR BL,30H(3)NOT AX(4)XOR CX,0FFF0H(5)TEST DH,0FH(6)CMP CX,00H(7)SHR DX,CL(8)SAR AL,1,5,实验一,(9)SHL BH,CL(10)SAL AX,1(11)RCL BX,1(12)ROR DX,CL,6,实验一,2、在下列程序段的括号中分别填写如下指令(1)LOOP NEXT(2)LOOPE NEXT(3)LOOPNE NEXT说明在这
3、三种情况下,程序段执行完后,AX,BX,CX,DX寄存器的内容分别是什么。START:MOV AX,01H MOV BX,02H MOV DX,03H MOV CX,04HNEXT:INC AX ADD BX,AX SHR DX,1(YOU CODE),CODE SEGMENTASSUME CS:CODE,CODE ENDSEND START,7,第四章 汇编语言程序设计,8,4.2 伪 指 令 语 句,【伪指令语句】在汇编期间进行处理,主要完成变 量定义,存储器分配,指示程序开 始和结束,段定义,段分配等。伪指令没有对应的机器代码,不像指令语句那样由CPU来执行,它是由汇编程序在汇编期间进行
4、处理。伪指令则不产生与之相应的目标代码。,9,伪指令语句分类,数据定义语句,如DB,DW,DD等标号赋值语句,如EQU,=等段定义语句,如SEGMENTENDS段分配语句,如ASSUME过程定义语句,如PROCENDP程序开始结束语句,如ORG,END,10,数据定义伪指令,【格式1】变量名 助记符 操作数1,操作数n;注释【格式2】变量名 助记符 n DUP(操作数1,操作数n);注释 功能:将操作数存入变量名指定的存储单元中,或者 只分配存储空间不存入数据。变量名:用符号表示,可以省略,后面不跟冒号。汇编时将变量助记符后的第一个字节的偏移地址作为它的符号地址。助记符:所用伪指令助记符主要有
5、 DB,DW,DD,DQ,DT。,11,数据定义伪指令,操作数:操作数可以是常数,字符串,变量,标号,表达式等。多个操作数之间必须用逗号分开;格式2中,n必须是正整数。注释:说明伪指令的功能,可以省略,注释前必须带分号“;”,如果注释在一行中注释写不下,换行写时,前面必须加上分号。,12,数据定义伪指令,【例】操作数是常数和表达式DA1 DB 10H,52HDA2 DW 1122H,34HDA3 DD 5*20H,0FFEEH 汇编后数据在存储器中存放格式如图所示:,10,52,22,11,34,00,DA1,DA2,1122H,34H,A0,00,00,00,DA3,EE,FF,00,00,
6、00A0H,0FFEEH,13,数据定义伪指令,【例】操作数是字符串FIRST DB HELLOSE DW OK DW在定义字符串时,只能定义两个,若要定义多个字符,只能用DB。汇编后数据在存储器中存放格式如图所示:,48,45,4C,4C,FIRST,HELLO,4B,4F,SE,KO,4F,14,DB与DW在存放上的区别,NUM1 DB 12H,34H NUM2 DW 1234HCHAR1 DB OK CHAR1 DW OK,12,34,NUM1,34,12,NUM2,4F,4B,CHAR1,O,K,4B,4F,CHAR2,K,O,15,数据定义伪指令,【例】操作数用DUP定义重复变量。O
7、NE DB 5 DUP(0)TWO DW 10 DUP(?)THR DB 4 DUP(1,2 DUP(20H),00,ONE,?,TWO,00,?,01,20,20,THR,01,20,20,5 个,20 个,4 个,16,数据定义伪指令,【例】用地址表达式定义变量。ONE DW PAR1TWO DW ADR2THR DD ADR3 此表达式中,分别将PAR1,ADR2的偏移地址赋给字变量ONE和TWO,以及将ADR3的偏移地址和段基址赋给双字变量THR。设CS=2000H,偏移地址分别为0100H,0200H,0300H,汇编后存储情况如图所示。,00,ONE,00,TWO,01,02,00
8、,03,00,20,THR,PAR1偏移地址,ADR2偏移地址,ADR3偏移地址段基址,17,数据定义伪指令,【例】变量的类型属性可以通过属性操作符PTR来指定。OPER1 DB 1,23HOPER2 DW 6677H,1234H 观察以下指令:MOV AX,OPER1+1 MOV AL,OPRE2正确的指令如下:MOV AX,WORD PTR OPER1+1;AX=7723HMOV AL,BYTE PTR OPER2;AL=77H,18,下列变量各占多少字节?A1DW23H,5876HA2DB3 DUP(?),0AH,0DH,$A3DD5 DUP(1234H,567890H)A4DB4 DU
9、P(3 DUP(1,2,ABC)A1:2*2=4 A2:3+3=6 A3=5*(4+4)=40 A4:4*(3*5)=60,课堂练习,19,表达式赋值语句,表达式赋值语句有两种,赋值语句EQU和等号语句=,两者均不占用内存。【EQU语句格式】符号名 EQU 表达式【功能】给变量、标号、常数、指令、表达式等定义一 个符号名,一经定义在同一个程序模块中不能 重新定义。,20,EQU赋值语句,【举例】EQU 表达式COUNT EQU 100;常数值赋给符号名COUNTDATA EQU COUNT2;表达式值赋给符号名DATAA1 EQU DXSI;变址寻址存储单元内容赋给A1B1 EQU OFFSE
10、T A1;偏移地址值赋给符号名B1C1 EQU ADD;加法指令赋给符号名C1 PURGE语句可以解除对某一个标号的赋值,使它在后面可以重新定义。PURGE C1;C1不再代替ADD,在EQU语句右边表达式中的变量或标号,必须预先定义,上例中,若无COUNT EQU 100的定义,汇编时对第2条语句会报错。,21,等号语句=,【=语句格式】符号名=表达式【功能】给变量、标号、常数、指令、表达式等定义一 个符号名,允许重复定义。【举例】等号语句=COUNT=100 COUNT=COUNT+10 A1=BX+SI MOV AX,A1;BX+SI内容送AX A1=BX,22,有符号定义语句如下:BU
11、F DB3,4,5,123ABUF DB0L EQU ABUF-BUF求L的值为多少?答案:L=6,课堂练习,23,段定义语句,【段定义语句】SEGMENTENDS【常见格式】段名 SEGMENT 逻辑段内容 段名 ENDS 我们在学习时,可以忽略其它因素,会识别,使用常用格式即可。,24,段分配语句,【段分配语句】ASSUME【格式】ASSUME CS:段名,DS:段名,SS:段名,ES:段名段名必须是前面段定义语句SEGMENTENDS中定义的段名。代码段和数据段的定义是必须的。段程序开始时,需要将数据段(除代码段)的段基址装入相应的段寄存器中。数据段段基地址DS,堆栈段段基地址SS,扩展
12、段段基地址ES,,25,【例】两个16位无符号二进制数相乘,DATA SEGMENTD1DW 1234HD2DW 5678HP1DW?P2DW?DATA ENDSSTACK SEGMENT STACK STACKSTTDB 100 DUP(?)TOPEQULENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:;程序部分 CODE ENDSEND START,数据段,堆栈,代码段,26,程序部分,MOV AX,STACK;初始化SS,SPMOV SS,AXMOV SP,TOP;栈顶偏移地址送堆栈指示器SP中。M
13、OV AX,DATA;初始化DS,必须先送AX,再转存MOV DS,AXL1:MOV AX,D1;D1*D2,积的高位在DX,低位在AXMUL D2MOV BX,OFFSET P1;积送P2和P1 指向的存储单元MOV BX,AXMOV BX+2,DXMOV AH,4CHINT 21H;可参阅教材P140,返回DOS方式不一样。,27,过程定义语句,过程也程为子过程,可以节省存储空间,模块化设计【格式】过程名 PROC 属性;过程内容 RET N 过程名 ENDP【功能】定义一个过程,主程序可以用CALL指令调用过程名:过程的名字,不可缺省,为子程序的入口地址具有三个属性:段属性、偏移地址属性
14、、距离属性。,28,过程定义语句,PROCENDP:过程定义伪指令助记符,成对出现,不可缺省。二者前面有相同的过程名。RET N:过程内部的返回指令。过程内部至少有一条RET指令,可以在过程的任何位置,使过程返回到主程序。过程内部可以有多个RET,表示此过程具有多个返回出口(在不同条件下,从不同出口返回)。N为弹出值,N必须为正偶数,可以缺省。过程调用允许嵌套和递归调用。嵌套与递归的深度由堆栈段的容量决定。,29,【例】用过程调用的方法,将内存中4个十六进制数进行相加,DATA SEGMENTONEDB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HSUM DB 2
15、0 DUP(?);总和DATA ENDSSTACK SEGMENT STACK STACKSTTDB 100 DUP(?)TOPEQULENGTH STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:;程序部分CODE ENDSEND START,数据段,堆栈,代码段,30,主程序部分,MOV AX,STACK;初始化SS,SPMOV SS,AXMOV SP,TOP;栈顶偏移地址送堆栈指示器SP中MOV AX,DATAMOV DS,AX;初始化DS,必须先送AX,再转存MOV SI,OFFSET ONE;ONE偏移地址送
16、SIMOV DI,OFFSET TWO;TWO偏移地址送DIMOV BX,OFFSET SUM;和的偏移地址送BXCLC;清除进位位MOV CX,4L1:CALL ABCLOOP L1MOV AH,4CHINT 21H,ABC PROCMOV AL,SIADC AL,DIMOV BX,ALINC SIINC DIINC BXRETABC ENDP,31,程序结束语句END,【格式】END 标号名【功能】标记汇编源程序结束。END伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个END,汇编程序遇到END语句即停止汇编。标号名是该程序中第一条可执行语句的编号,可以缺省,若一个程序包含
17、多个模块,END后面带的标号为主程序模块中的标号名称。,32,系统功能调用系统功能调用是微机的磁盘操作系统DOS为用户提供的一组例行子程序,因而又称为DOS系统功能调用。这些子程序可分为以下四个主要方面:(1)磁盘的读/写及控制管理;(2)内存管理;(3)基本I/O管理(如键盘、打印机、显示器等);(4)其他管理(如时间、日期等)。,常用系统功能调用和BIOS中断调用,33,键盘和显示器的DOS调用,34,对于所有的功能调用(包括设备管理、文件读写等子程序),使用时一般需要经过以下三个步骤:子程序的入口参数送相应的寄存器(有些子程序调用不需要入口参数,此步可略)。子程序编号送AH。发出中断请求
18、:INT 21H(系统功能调用指令)。,DOS调用的步骤,35,【调用格式】MOV AH,1INT 21H系统执行该功能时将扫描键盘,等待键入。一旦有键按下,就将键值(相应字符的ASCII码值)读入,先检查是否是Ctrl-Break,若是,则退出命令执行;否则将键值送入AL寄存器,同时将这个字符显示在屏幕上。,1号功能调用,8号调用与其类似,区别在于在显示器上不回显,36,【调用格式】MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 本调用执行后,显示器显示其ASCII码值放入DL中的字符。,2号功能调用,5号调用与其类似,打印机打印DL中的字符,37,【调用格式】MO
19、V DX,待显示字符串首字符的偏移地址MOV AH,9 INT21H 本调用执行后,显示器显示待显示的字符串。调用时,要求DS:DX必须指向内存中一个以“$”作为结束标志的字符串。,9号功能调用,38,DATASEGMENT BUF DB HOW DO YOU DO?$DATAENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOVAH,9INT 21H,9号功能调用举例,屏幕上显示HOW DO YOU DO?,39,【调用格式】MOV DX,数据区的首偏移地址 MOV AH,1
20、0 INT 21H 能从键盘接收字符串到内存的输入缓冲区,要求预先定义一个输入缓冲区,缓冲区的第一个字节指出能容纳的最大字符个数,由用户指出;第二个字节存放实际输入的字符个数,由系统写入;从第三个字节开始存放从键盘接受的数据直到回车键。,10(0AH)号功能调用,40,BUF DB 100;用户定义存放100字节的缓冲区 DB?;系统填入实际输入字符字节数 DB 100 DUP(?);存放输入字符的ASCII码值 MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1;取输入字符数送CL
21、ADD DX,2;使指针指向第一个字符。,10(0A)号功能调用举例,41,4.3汇编语言程序设计基础,好程序的标准:模块化设计,易读、易调试、易维护。执行速度快。占用内存空间小。,42,设计汇编语言源程序的基本步骤,分析问题绘制流程图 分配存储空间和工作单元 编写程序 上机调试程序运行,分析结果,抽象出问题的数学模型,确定实现算法。,形式化描述算法。绘制时,从粗到细。,分配数据段、堆栈段、程序段的位置,确定寄存器主要作用,按流程图设计来编写程序,实现功能。,检查程序的语法错误和逻辑错误。,运行程序测试数据是否符合预期。,43,顺序结构 分支结构 循环结构 子程序结构,四种程序结构,44,顺序
22、结构,【特点】顺序执行,程序通常简单;无分支、无循环、无转移 图中无判断框;,开始,语句1,语句n,结束,45,【例】内存从Table开始存放0-9的平方值,通过人机对话,当给定一个数X(0-9),查表得出X得平方值,放入AL中。,分析问题:首先在内存中开辟区域存放Table内容,利用01功能调用从键盘上输入一个数据,利用XLAT查表即可获得数据置入AL即可。流程图:如图所示。,开始,提示输入数据,查表 结果送AL,结束,接收数据,46,Step 1:,Step 2:查表,;9号功能调用,提示用户输入数据MOV AH,01HINT 21H;1号功能调用,键值存入AL中,MOV BX,OFFSE
23、T TableXLAT;表交换指令,【例】内存从Table开始存放0-9的平方值,通过人机对话,当给定一个数X(0-9),查表得出X得平方值,放入AL中。,47,【例】内存从Table开始存放0-9的平方值,通过人机对话,当给定一个数X(0-9),查表得出X得平方值,放入AL中。,DATA SEGMENTTable DB 0,1,4,9,16,25,36,49,64,81BUF DB input number:,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFS
24、ET BUF MOV AH,09H;0D,0A代表回车换行,9号功能调用 INT 21H MOV AH,1;1号调用,数据送AL INT 21H AND AL,0FH,MOV BX,OFFSET TABLE XLAT CODE ENDSEND START,48,分支结构,【分支结构】程序根据不同条件选择不同的处理方法。图中可以有一个到多个判断条件。,49,【例】存储器中有一字符串首地址为BUF,字符串长度小于256,要求分别计算出数字0-9,字母A-Z和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。,分析问题:对于BUF中的字符串,取出一个字符,将字符的ASCII码和数字0
25、9(30H39H)及字母AZ(41H5AH)进行比较并计数,最后存入内存单元中。流程图:如图所示。,开始,取字符数入CX,DL=DL+1,结束,取字符,CX=0?,DH=DH+1,N,为数字09?,N,Y,Y,为字母AZ?,Y,N,50,【例】存储器中有一字符串首地址为BUF,字符串长度小于256,要求分别计算出数字0-9,字母A-Z和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。,DATA SEGMENT BUF DB N DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP(?)DATA ENDSCODE SEGMENT ASSUME
26、CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA BX,BUF MOV CX,BX;取字符数N放入CX中 MOV DX,0;计数DH,DL清零 INC BX;指向首字符,51,【例】存储器中有一字符串首地址为BUF,字符串长度小于256,要求分别计算出数字0-9,字母A-Z和其它字符的个数,并分别将它们的个数存放到此字符串的下面三个单元中。,LP:MOV AL,BX CMP AL,0 JL NEXT;指向下一个字符 CMP AL,9 JG ABC;是否为字符 INC DH JMP NEXT,ABC:CMP AL,A JL NEXT CMP AL,Z
27、JG NEXT INC DL;判断字符范围,NEXT:INC BX LOOP LP;CX不为零,循环,LEA BX,NUMMOV BX,DHMOV BX+1,DLMOV AL,BUFSUB AL,DHSUB AL,DLMOV BX+2,AL CODE ENDS END START,52,循环结构,【循环结构】程序根据需要重复执行某段语句以完成某特定功能。一般可以分成两种结构形式:先执行,后判断:进入循环后至少要执行一次循环体,再判断循环是否结束。适合于循环次数固定的程序。先判断,后执行:进入循环后,先判断循环结束条件,再决定是否执行循环体,可能循环体一次也不执行。适合于循环次数不固定的程序。,
28、53,先执行,后判断,初始化部分,入口,循环体,修改参数,循环控制,出口,初始化部分,入口,循环体,修改参数,循环控制,出口,先判断,后执行,循环结构,54,循环结构,【循环结构四部分】初始化:设置循环计数值,设置变量初值。循环体:循环部分的核心:循环的全部执行指令。修改参数:修改操作数地址,为下次循环作准备。循环控制:修改计数器值,判断循环控制条件,决定是 否跳出循环。,55,【例】AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到CL寄存器。,MOV CL,0;初始化 L1:AND AX,AX;控制循环 JZ STOP SAL AX,1;循环体 JNC L2 INC CL L
29、2:JMP L1STOP:HLT,两个问题:如何判断某位为1?循环次数如何控制?,56,多重循环,有些循环结构比较复杂,需要多重循环完成。【例】存储器数据段从BUF开始存放一个字数组,数组中第一个字中存放该数组的长度N,编制一个程序将此数组中的数据按照从小到大的次序排列。用冒泡排序完成。,57,76H,A768H,1256H,A768H,3412H,A768H,15,A768H,37,8600,3412H,1256H,76H,15,42856,37,8600,13330,4694,118,3412H,A768H,1256H,76H,37,8600,15,3412H,A768H,76H,8600
30、,37,1256H,15,3412H,A768H,1256H,8600,37,76H,15,3412H,A768H,1256H,8600,37,76H,15,3412H,A768H,1256H,8600,37,76H,15,冒泡排序过程,58,DATA SEGMENTBUF DW N,15,37,8600,0A768H,3412H,1256H,76HDATA ENDS,CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXSTOP:MOV AH,4CHINT 21HCODE ENDSEND START,程序主要部分,59,MOV
31、 BX,0MOV CX,BUFBX;循环次数放CX中DEC CXL1:MOV DX,CX;保存CX,外循环次数L2:ADD BX,2MOV AX,BUFBXCMP AX,BUFBX+2;相邻两数比较 JBE NEXT;小于等于,比较下一对XCHG AX,BUFBX+2;大于则交换MOV BUFBX,AX;写入内存NEXT:LOOP L2;内循环MOV CX,DXMOV BX,0LOOP L1;外循环,如何优化?,标志BH=0MOV BH,0,修改标志MOV BH,1,CMP BH,0JE STOP,60,子程序结构,多次使用的程序段可以写成一个相对独立的程序段,将它定义为“过程”或“子程序”,
32、需要执行这段程序时,就进行“过程”调用,执行完毕后再返回原来调用它的程序。,子过程定义:SUBPROC PROC RETSUBPROC ENDP,61,DATA SEGMENTARY1 DW 100 DUP(?)SUM1 DW?ARY2 DW 100 DUP(?)SUM2 DW?DATA ENDS,CODE SEGMENTASSUME CS:CODE DS:DATASTART:MOV AX,DATAMOV DS,AX,;主程序部分 CODE ENDS END START,数据段定义两个数组,编程实现数组分别求和(不计溢出),62,LEA SI,ARY1MOV CX,LENGTH ARY1CAL
33、L SUMLEASI,ARY2MOV CX,LENGTH ARY2CALL SUMMOV AH,4CHINT 21H,SUM PROC XOR AX,AXL1:ADD AX,WORD PTRSIADD SI,2LOOP L1MOV WORD PTRSI,AX RETSUM ENDP,子程序,主程序,数据段定义两个数组,编程实现数组分别求和(不计溢出),63,子程序嵌套,子程序本身又调用其它子程序,称为子程序嵌套。,嵌套的层数本身不限,受堆栈空间限制。,64,主程序,Call A,子程序A,Call B,子程序B,RET,RET,子程序嵌套,继续执行主程序,65,小结,伪指令语句的分类与功能DOS功能调用的介绍程序设计的结构及应用,66,本节作业,【P199】6【P199】8,