欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    微机原理与接口技术.ppt

    • 资源ID:4519336       资源大小:1.19MB        全文页数:116页
    • 资源格式: PPT        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    微机原理与接口技术.ppt

    ,侯彦利,吉林大学工学部计算机硬件基础课程微机原理与接口技术,1,吉林大学工学部计算机硬件基础课程微机原理与接口技术,2,第4章 汇编语言及其程序设计,教学目的:了解汇编语言源程序的结构掌握伪指令系统理解DOS功能调用掌握汇编语言源程序的设计方法,3,4.1 汇编语言源程序,用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序assembler,翻译的过程叫做汇编assemble。,4,4.1.1 汇编语言源程序结构,汇编语言源程序结构是指语句的格式和程序的组成部分。源程序结构取决于汇编程序,不同的汇编程序要求的源程序结构不同,不同CPU的汇编程序也不相同。不过功能大致相同的汇编语言其源程序结构也大致相同。本章以80X86CPU所常用的MASM宏汇编程序为背景介绍汇编语言源程序结构。汇编语言源程序的组成部分,5,1.汇编语言源程序的组成部分:,数据段名 SEGMENT 数据段名 ENDS附加数据段名 SEGMENT 附加数据段名 ENDS堆栈段名 SEGMENT 堆栈段名 ENDS代码段名 SEGMENT 代码段名 ENDS END,每段以SEGMENT语句开始,整个程序以END语句结束,以ENDS语句结束,6,【例题4-1】将STRING 1中100个字节传送到STRING 2中,DATASEGMENT;定义数据段STRING1 DB 100 DUP(55H)DATA ENDS;数据段结束EDATA SEGMENT;定义附加段STRING2 DB 100 DUP(?)EDATA ENDS;附加段结束 STACKSEGMENT;定义堆栈段 DW 256 DUP(?)STACK ENDS;堆栈段结束 CODE SEGMENT;定义代码段ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX;初始化DS MOV AX,EDATA MOV ES,AX;初始化ES MOV AX,STACK MOV SS,AX MOV SI,OFFSET STRING1;初始化源串指针MOV DI,OFFSET STRING2;初始化目的指针MOV CX,100;初始化计数器CLD;设置DF=0,使SI和DI按增量变化,增量为1REP MOVSBMOV AH,4CHINT 21H CODE ENDS;代码段结束 END START,7,汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三类段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。,8,2.汇编语言的语句格式,汇编语言源程序中一行只能写一个语句。每个语句可以有4部分:标号、操作码助记符、操作数助记符、注释。例如:BEGAIN:MOV AX,BX;BX数据传送给AX,9,标号是某条指令的地址,是用符号表示的地址,所以也叫符号地址。标号后加冒号“:”。名字是变量、段或子程序的名字。例如【例题4-1】中的DATA、EDATA、STACK和CODE。名字后面没有冒号“:”,与操作码之间用空格分隔。操作码和操作数之间用空格分隔,操作数之间用逗号分隔。分号表示注释,用来说明程序或语句的功能,常跟在语句的后面,分号为注释的开始。如果一行的第一个字符是“;”说明整行都是注释,用来说明下面程序段的功能。,10,汇编语言语句类型:,指令性语句、指示性语句,11,指示性语句,又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是定义变量、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。例如:DATA SEGMENT;定义数据段STRING1 DB 100 DUP(55H)DATA ENDS;数据段结束,12,指令性语句,指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。例如:START:MOV AX,DATA MOV DS,AX;初始化DS MOV AX,EDATA MOV ES,AX;初始化ES MOV AX,STACK MOV SS,AX MOV SI,OFFSET STRING1;初始化源串指针MOV DI,OFFSET STRING2;初始化目的指针MOV CX,100;初始化计数器CLD;设置DF=0,使SI和DI按增量变化,增量为1REP MOVSBMOV AH,4CHINT21H,13,指令性语句和指示性语句的区别:1.标号和名字指令性语句的标号是指令的符号地址,后边通常加上:名字通常表示变量名、段名和过程名,后边不加:2.操作数指令性语句的操作数最多有2个,可以没有;指示性语句中的操作数至少要有1个,可以有多个,相互之间用逗号分开;,14,4.1.2 汇编语言源程序的处理过程,汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成目标程序,目标程序经过连接程序连接,就得到可执行文件。,15,4.1.3 汇编语言中的操作数,汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。,16,1.常量常量也称常数,有数值常量和字符常量两种。数值常量可以是二进制数、十进制数和十六进制数。十六进制数若是以字母(AF)开始,需在前面加一个数字0,用以说明这是数值常量,不是字符串。例如:MOV AX,0D3A9H字符常量是用单引号括起来的字符或字符串,源程序汇编之后它们转换为相应的ASCII码。例如:MOV AL,A;AL=41H VARDBHello;相当于 VAR DB 48H,65H,6CH,6CH,6FH,17,2.变量变量是指存储单元中的数据,这些数据在程序运行中可以修改变化,因此称其为变量。每个变量可以有一个名字(变量名),也可以没有。一个变量名可以表示一个数据或一组类型相同的数据,即一个变量名可以是一个数据的符号地址,也可以是一组数据的符号首地址。变量名可以作为存储器操作数使用。例如:STRDB STRINGNUMDW 0AAH,23HLAB0DQ 01A4578H,18,变量在除了代码段之外的其他段中定义,有段、偏移量和类型三种属性。段属性:变量所在的段。偏移量属性:变量的偏移地址。类型属性:变量所存储数据的数据类型,有:BYTE、WORD、DWORD、DQ(8个字节)、DT(10个字节)。,19,3.标号与名字标号在代码段中定义,后面跟冒号,是指令的符号地址。标号经常作为转移指令、循环指令和调用指令的操作数。标号有三种属性:段、偏移量和类型。段属性:标号所在的段。偏移量属性:标号的偏移地址。类型属性:标号是在本段内还是在其他段内,在本段内称为近地址属性(NEAR),在其他段内称为远地址属性(FAR),近地址属性NEAR可以省略。,20,例如:LEA SI,VAR MOV CX,100 XOR AX,AX COUNT:ADD SI,2 ADD AX,SI LOOP COUNT MOV SUM,AX;COUNT的属性为近地址属性NEAR,21,名字通常指的是段名、变量名和子程序名,其后不跟冒号。标号与名字的用法作用不同,但设置方法却一样。可以使用:大小写英文字母数字0特殊字符?#$标号或名字中的第一个字符必须是英文字母或圆点,整体最长不能超过31个字符,不能使用指令助记符、寄存器名及汇编语言指令系统中的保留字。标号和名字由程序员确定。,22,表达式表达式由常量、变量和标号通过运算符结合而成。表达式中的运算在汇编时完成,运算结果可以是操作数也可以是操作数地址。例如下面指令中的源操作数:MOV AX,SEG VARMOV BX,5 MOD 3ADD AL,LAB*5+DATA,23,表达式中的常用运算符:,(1)算术运算符:+、-、*、/、MODMOD是指除法运算的余数,如15 MOD 7结果为1。MOV AX,15 MOD 7;汇编之后为MOVAX,1MOV DX,ARRAY+(7-1)*2(2)逻辑运算符:AND、OR、XOR、NOT逻辑运算符只能用于数字表达式,不能用于地址表达式中。CMPAL,04H AND 75H;汇编之后为CMPAL,04,24,(3)关系运算符:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)关系运算符对两个性质相同的数据进行运算,可以构成数字表达式或地址表达式,运算的结果应为逻辑值:关系成立结果为真,输出为全1;关系不成立结果为假,输出为0。例如:DATA和NUM为常量,DATA=5AH NUM=35HMOV BX,DATA GT NUM;汇编之后为MOV BX,0FFFFHMOV BX,DATA EQ NUM;汇编之后为MOV BX,0,25,(4)取值运算符:TYPE、SIZE、OFFSET、SEG TYPE Variable 或label;取变量或标号的类型。变量的类型值:DB为1、DW为2、DD为4、DQ为8、DT为10 标号的类型值:NEAR为-1;FAR为-2 例如:NUM DW 0375H,982AH,793EH;定义变量 ADD SI,TYPE NUM;汇编之后为ADD SI,2,26,SIZE Variable取变量的所有操作数的字节数,也称为大小运算符。例如:LAB0 DB34,65,28 LAB1 DW 100 DUP(3755H)MOV CX,SIZE LAB0;汇编之后为MOV CX,3MOV AX,SIZE LAB1;汇编之后为MOV CX,200,27,OFFSET Variable 或label取变量或标号的偏移地址。例如:MOV BX,OFFSET NUM;与LEA BX,NUM指令等价SEG Variable 或label取变量或标号的段基址。例如:MOV BX,SEG NUM;取NUM所在段的段基址,28,(5)修改属性运算符:PTR修改操作数的类型,操作仅限于本条指令。例如:MOV BX,WORD PTR LAB0段超越前缀“:”用来表示一个标号、变量或地址表达式的段属性。例如:MOV AX,ES:BX+SI,29,注意:在计算表达式值时,括号内的表达式优先计算,然后按运算符的优先顺序计算,对优先级相同的运算符按从左到右的顺序进行计算。运算符的优先级别从高到低的排列次序如下:在圆括号中的项,方括号中的项PTR、OFFSET、SEG、TYPE*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GE先NOT,AND,然后是OR和XOR,30,4.2 伪 指 令,汇编语言中的指示性语句也称为伪指令。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。宏汇编程序MASM设置了几十种伪指令,下面简单介绍一些常用的伪指令:设定段寄存器伪指令数据定义伪指令符号定义伪指令过程定义伪指令宏命令伪指令 模块定义与连接伪指令,31,4.2.1段定义伪指令,段定义伪指令SEGMENT和ENDS格式:段名SEGMENT 定位类型 组合类型 类别 段名ENDS例如:DATA SEGMENT BUFFER DB 100 DUP(?)COUNT DW 100 DATA ENDS,32,(1)定位类型:说明该段对起始地址的要求。PARA:段起始地址必须能被16整除;BYTE:段起始地址可以是任何地址;WORD:段起始地址必须为偶数;PAGE:段起始地址必须从页边界开始,即必须能被256整除;如果省略定位类型参数,汇编程序默认为PARA。,33,(2)组合类型:多个程序模块进行连接时,相同类型的段进行组合构成一个段。NONE:本段作为独立段装入内存,不与其他模块中的段组合,即使段名相同也不组合。PUBLIC:与其他模块中由PUBLIC说明的同名段接在一起。COMMON:与其他模块中由COMMON说明的同名段重叠存放,后连接的COMMON段会覆盖前面的内容,连接之后COMMON的长度是各分段中的最长的段的长度。STACK:与其他模块中由STACK说明的同名堆栈连接在一起,形成一个大的堆栈段,由各模块共享,堆栈指针自动指向这个大堆栈段的栈顶。,34,MEMORY:将该段放在所有段的最后(高地址),如果连接时有多个MEMORY段,汇编程序将遇到的第一个作为MEMORY段,其余的作为COMMON段。AT:表达式计算出的值为段基址,但不能用这种方式指定代码段。如果省略组合类型参数,汇编程序默认为NONE。,35,(3)类别:指定段的类别。用单引号括起来的字符串,常用STACK表示堆栈段,CODE表示代码段,DATA表示数据段,EXTRA表示附加数据段。在多个程序模块连接时,具有相同类别的段在一起装入连续的内存区域,无类别的段在一起装入连续的内存区域。,36,Estacksegmentpara stack stackEstackends该段是堆栈段,段名为Estack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;stack指明类别是堆栈类。注意:同一个段的起始和结束必须是同一个名字。,37,2.ASSUME伪指令,格式:ASSUME 段寄存器名:段名,段寄存器名:段名,ASSUME伪指令说明段名和段基址寄存器之间的关系,但它不能给段寄存器赋值,段寄存器的值需要在代码段中由指令性语句赋值。例如:ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:EDSEG说明CSEG段是代码段,DSEG段是数据段,SSEG段是堆栈段,EDSEG段是附加数据段。,38,【例题4-2】测试内存TAB单元内的数为奇数还是偶数,如是奇数则BX置成0FFFFH;如是偶数BX置成0。,39,DSEGSEGMENT;默认定位类型PARA,默认组合类型NONETAB DB?DSEG ENDS SSEGSEGMENT STACK;默认定位类型PARA,组合类型为STACK DW256 DUP(0)SSEG ENDS CSEG SEGMENT;默认定位类型PARA,默认组合类型NONEASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART:MOV AX,DSEG MOV DS,AX;给DS段寄存器赋值 MOV AX,SSEG MOV SS,AX;给SS段寄存器赋值 MOV AL,TABTEST AL,01H;测试BX中最低位的逻辑值JZ EVEN1;ZF=1,AL为偶数转移至EVEN处执行MOV BX,0FFFFH;AL为奇数,设置奇数标志JMP CONEVEN1:MOV BX,0;设置偶数标志,40,CON:MOV AH,4CHINT21H CSEG ENDS;代码段结束 END START,41,4.2.2 数据定义伪指令,数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。格式:变量名 伪操作助记符 操作数1,操作数2DATA SEGMENTSTRDB STRINGNUMDW 0AAH,23HLAB0DQ 01A4578HDATA ENDS,42,数据变量有5种定义命令,如下:DB:定义变量为字节类型,其后的每个操作数都占一个字节。DW:定义变量为字类型,其后的每个操作数都占两个字节。DD:定义变量为双字类型,其后的每个操作数都占二个字,即四个字节。DQ:定义变量为四个字类型,其后的每个操作数都占四个字,即八个字节。DT:定义变量为十个字节,其后的每个操作数都占十个字节。,43,例如:VARDB 67H,4FH,7AH;定义VAR为字节类型变量,3个字节类型的操作数顺序存储在以VAR为首地址的连续内存单元中,每个操作数占一个内存单元。注意:使用变量时,变量的类型必须与指令的要求相符。例如:MOV AL,VAR;AL=67H,44,DELAY DW 98A3H,17D9H;定义DELAY为字类型变量,2个字类型的操作数顺序存储在以DELAY为首地址的连续内存单元中,每个操作数占2个内存单元。例如:MOV BX,DELAY+2;BX=17D9H,45,NUMDD 0AAH,3EF6AC23H;定义NUM为双字类型变量,2个双字类型的操作数顺序存储在以NUM为首地址的连续内存单元中,每个操作数占4个内存单元。,46,从NUM中取一个字,应使用如下方法:例如:MOV SI,OFFSET NUMMOV CX,SI下列用法错:MOV CX,NUM;指令错误,47,LAB0 DQ 01A4578H;定义LAB0为4字类型变量,操作数存储在以LAB0为首地址的连续8个内存单元中。LAB1 DT 3958235434H;定义LAB1为10个字节类型变量,操作数存储在以LAB1为首地址的连续10个内存单元中。注意:多字节数据在内存中存放时遵守“低位存于低地址中,高位存于高地址中”的原则。,48,【例题4-3】数据段中变量的内存分配。DATASEGMENT STRDB STRING NUMDW 0AAH,23H LAB0DQ 01A4578HENDS,49,数据定义伪指令中的操作数可以是数值型常量、字符串常量,也可以是常量表达式,还可以是问号?,问号表示预留相应数量的存储单元,但不存入数据。例如:DATA1DW 16*9,55*3DATA2 DB?,?变量DATA2有2个字节类型的操作数,为每个操作数预留2个存储单元,不进行初始化。,50,如果操作数很多而且相同,可以使用重复数据操作符DUP定义变量。例如:DATA3 DB 6 DUP(AAH)DATA4DB 3 DUP(?,55H,?)变量DATA3有6个操作数,初始化为AAH;变量DATA4有3组操作数,每组为3个,共9个字节类型的操作数。,51,4.2.3符号定义伪指令,符号定义伪指令也称为赋值伪指令。在程序中有时会多次出现同一个数值或表达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令:EQU=,52,1.EQU伪指令格式:符号名 EQU 表达式例如:CONS EQU 10;常数赋给符号CONSALPHA EQU CONS9-32;常数赋给符号ALPHA ADDR EQU ALPHASI+8;地址表达式赋给符号ADDR LOAD EQU MOV;助记符赋给符号注意:表达式中如果有变量或符号,则应该在该语句之前定义它们。在同一个程序中,一个符号不能定义两次。,53,用法:MOV AL,ALPHACMP AL,CONSJMP WORD PTR ADDR,54,=伪指令格式:符号名=表达式说明:功能与EQU一样,给符号赋值,唯一的区别是可以对一个符号名重复定义。例如:NUM=8NUM=NUM+6这两条伪指令汇编之后,NUM=14,一般等号伪指令定义数值常量。,55,4.2.4 过程定义伪指令,过程定义伪指令也称为子程序定义伪指令。在程序中使用调用命令CALL调用它。过程定义伪指令的格式:过程名 PROC 属性 过程名 ENDP,56,说明:过程名(procedure name)为标识符,由程序员设置。过程名是子程序入口的符号地址,即是子程序的第一条指令性语句的符号地址。过程的属性可以是NEAR或FAR,过程与调用命令在同一个代码段,过程的属性可以设置为NEAR类型;过程与调用命令不在同一个代码段,过程的属性应该设置为FAR类型。NEAR为缺省属性。,57,DELAY PROC NEAR PUSH AX PUSH CXMOV AX,0FFFFHNEXT:MOV CX,AXNEXT1:LOOP NEXT1DEC AXJNZNEXT POP CX POP AX RETDELAY ENDP,58,可以使用CALL指令调用DELAY,也可以用JMP指令跳转到DELAY 例如:CSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG MOV DS,AX MOV AX,ARRAYCALLDELAYMOV AH,4CHINT21H CSEG ENDS END START,59,一个过程可以调用其他的过程,这称为过程嵌套。例如:MAINPROC FARCALLSUBRETMAINENDPSUBPROC NEARRETSUBENDP过程也可以调用自己,称为递归调用。,60,4.2.5 程序结束伪指令,程序结束伪指令告诉汇编程序MASM源程序到此结束,并附带说明程序从哪开始执行。格式:END 标号END为伪操作符,标号为程序开始执行的指令的符号地址。如果程序包含多个模块,只有主程序模块的结束伪指令END后可以加标号,其他程序模块的END后不能指定标号。,61,4.2.6其他较常见伪指令简介,程序开始伪指令NAME格式:NAME 模块名 功能:定义本程序模块的名字,告诉汇编程序MASM:源程序从这开始。,62,2.标题定义伪指令TITLE 格式:TITLE 标题字符串 功能:打印源程序清单时,标题字符串作为每一页的标题。标题字符串对程序模块的功能有说明作用,最多可有60个字符。如程序中没有NAME伪指令,则汇编程序将标题字符串中的前6个字符作为模块名。如果程序中既无NAME也无TITLE伪指令,源程序文件名就作为模块名。,63,ORG伪指令格式:ORG 表达式功能:指定后面的指令或数据从表达式指出的地址(偏移地址)开始存放。,64,4.3 DOS系统功能调用,DOS操作系统为用户提供的系统功能调用有两种,一种称为BIOS功能调用,也叫低级调用,调用它们可以驱动磁盘、控制显示器输出、驱动打印机和管理时钟;另一种称为DOS功能调用,也叫高级调用,调用它们可以管理内存、管理设备、管理文件和目录。微机系统中21H号中断被称为DOS系统功能调用,它的内部提供了八十多个功能子程序,可以实现字符输入、字符显示和打印、磁盘读写、文件建立打开关闭、文件读写等功能,基本上满足了普通程序员的编程需要。为了调用方便,系统对这些功能子程序顺序编号,称为功能号。调用的步骤如下:把要调用的功能号送AH寄存器 根据调用要求设置入口参数 INT 21H,65,1.输入单个字符从键盘输入单个字符可以使用1、7、8号功能。1号功能接收键盘输入的字符并保存在AL中,同时显示在屏幕上。7、8号功能接收键盘输入的字符保存在AL中但不显示。它们都不需要入口参数。例如:MOV AH,1INT21H这两条指令执行后,光标在屏幕上闪动,等待键盘按键。一旦有键按下,其ASCII码存入AL中,字符显示在屏幕上。,66,2.输入字符串从键盘输入字符串存入指定的内存区域。入口参数为DS:DX使用0A号功能前首先要定义一个数据区,要求数据区的的第一个字节含有允许输入的最大字符个数(包括回车符),第二个字节用于存放实际输入的字符个数,从第三个字节开始作为字符串存储空间。如果计划最多输入10个字符,数据区的定义方法如下:BUFF DB 10,0,10 DUP(?),67,BUFF数据区允许输入的最大字符个数为10个,若实际输入的字符个数(包括回车符)超过10个,则后面的字符由于没有存储空间而被丢弃,且喇叭会发出嘟嘟声报警,直到键入回车符。BUFF数据区的第二个字节初始化为0,0A号功能执行时会把实际键入的字符数(不包括回车符)置入其中。如果实际键入的字符数不足10个,字符存储空间还有空余,空余的空间置0。一般在定义数据区时,会比计划输入的字符数多一些。调用0A号功能的方法如下:MOV DX,OFFSET BUFF MOV AH,0AH INT 21H,68,【例4-4】从键盘上输入字符串WELCOME,DATA SEGMENT BUFF DB 10,0,10 DUP(?);定义数据区DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUFF MOV AH,0AH;功能号送AH INT 21H;功能调用 MOV AH,4CH INT 21HCODE ENDS END START,69,3.显示单个字符入口参数:DL,将待显示字符的ASCII码送DL寄存器。例如在屏幕上显示大写字母B,可以用下面的3条指令实现:MOV DL,B;待显示字符的ASCII码送DLMOV AH,2;功能号送AHINT 21H;功能调用,70,4.显示字符串将字符串显示在屏幕上。入口参数:DS:DX,字符串必须以$结尾。【例4-5】在屏幕上显示字符串。,71,DATA SEGMENTSTRING DB WELCOME TO JILIN UNIVERSITY,$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRING;设置入口参数MOV AH,09H;功能号送AHINT 21H;功能调用MOV AH,4CHINT 21HCODEENDSEND START注意:9号功能要求字符串在数据段DS中,调用之前应将字符串首地址送至DX。,72,5.返回操作系统4CH号功能调用使程序正常结束并返回操作系统,调用方法如下:MOV AH,4CH INT 21H21H号中断内包含有丰富的系统功能调用,如果想查看更多的系统功能调用,可以参考附录。,73,4.4 汇编语言程序设计基础,4.4.1 汇编语言程序设计步骤(1)分析问题确定算法(2)画出程序流程图(3)编写程序(4)上机调试程序将源程序汇编,剔除语法错误,生成目标代码文件;将目标代码文件链接生成可执行文件,利用调试工具(如DEBUG等)对可执行文件进行调试,经过调试确定程序的正确性。,74,4.4.2 顺序程序设计,【例4-6】编写计算SA*B-C的程序,A、B、C是无符号字节变量,S是字变量。DATA SEGMENT A DB 38;定义数据 B DB 54C DB 16 S DW?;为运算结果保留存储空间DATA ENDS,75,CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A MOV BL,B MUL BL;A*B,结果存在AX中 MOV BL,C MOV BH,0 SUB AX,BX;AX-C,结果在AX中 MOV S,AX;保存计算结果 MOV AH,4CH INT 21H;返回操作系统CODE ENDS ENDSTART,76,【例4-7】在内存中从TABLE单元开始的连续16个单元中,存放着015的平方值(平方表),查表求任意数X(0X15)的平方值,将结果保存在RESULT中。DATA SEGMENTTABLE DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225 X DB 11RESULT DB?;定义结果存放单元DATA ENDS,77,STACK SEGMENT STACK STACKDW 100 DUP(?);定义堆栈空间STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA;初始化数据段MOV DS,AXMOV AX,STACK;初始化堆栈MOV SS,AXLEA BX,TABLE;设置平方表的基地址MOV AH,0MOV AL,X;取待查数 ADD BX,AX;计算在表中具体地址 MOV AL,BX MOV RESULT,AL;X的平方数存入RESULTMOV AH,4CHINT 21HCODE ENDS END START,78,4.4.3 分支程序设计,分支程序结构分为简单分支结构和多分支结构两种形式简单分支程序设计一般用条件转移指令实现简单分支程序设计。条件成立就转移到程序段1执行,否则按原顺序执行指令。,79,【例4-8】在数据段中DATA单元和DATA+1单元各存有一个无符号数,比较两数的大小,大的存入DATA单元,小的存入DATA+1单元。程序段如下:,MOV AL,DATACMPAL,DATA+1;比较JNCCHANGE;DATADATA+1,转移到CHANGEMOVBL,DATA+1;条件不成立顺序执行MOV DATA,BL;交换MOVDATA+1,ALCHANGE:.,80,2.多分支程序设计 汇编语言语句功能简单,多分支程序是简单分支的罗列。,81,【例4-9】在提示信息PLEASE INPUT CHARACTER:后从键盘输入字符,如果输入的是ESC键,则结束程序;如果输入的是小写字母则显示;如果是大写字母,则转换为小写字母显示。,82,DATASEGMENTMESSAGE DB 0DH,0AH,PLEASE INPUT CHARACTER:,0DH,0AH,$DATAENDSSTACKSEGMENT STACK STACKDW100 DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOV SS,AXMAS:MOVDX,OFFSET MESSAGE MOVAH,9 INT21H,83,AGAIN:MOVAH,1INT21HCMPAL,1BHJEEXIT;是ESC,转移到EXITCMPAL,61HJCLOW0;是大写字母,转移到LOW0CMPAL,7BHJCLOW1;是小写字母,转移到LOW1 JMP MAS LOW0:ADDAL,20H;加上20H转换为小写字母的ASCII LOW1:MOVDL,ALMOVAH,2INT 21HJMP AGAINEXIT:MOVAH,4CHINT 21H CODEENDSENDSTART,84,4.4.4 循环程序设计,循环程序结构由循环初始化、循环体和循环控制三部分组成。循环程序结构有两种:先执行后判断和先判断后执行。,85,循环初始化,用来设置循环初始值,如设置循环计数器初值、设置地址指针首地址和初始数据等。循环体,是循环的主体,包括循环要完成的具体操作和修改循环参数,如地址指针修改、计数值的修改。循环控制,测试循环条件,判断是否继续循环,使循环能在有限的次数后结束。在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。循环控制的方法有很多,如标记控制循环,开关量控制循环,逻辑尺控制循环等,在不同的场合使用不同的方法。,86,【例4-10】在数据段中从BUFF单元开始存放100个字节类型的无符号数,编写程序找出其中最大的数并存入MAX单元中。DATA SEGMENT BUFF DB 100DUP(?);定义100个数据 MAX DB?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,87,MOV CX,99;设置循环次数 LEA SI,BUFF;数据首地址送SI MOV AL,SI;取第一个数 INC SICON:CMP AL,SI;与第二个数比较大小 JNC NEXT;若ALSI,则跳转NEXT处 MOV AL,SI;AL SI,替换ALNEXT:INC SI;修改地址指针 LOOP CON;测试循环条件CX=0?MOV MAX,AL MOV AH,4CHINT 21HCODE ENDS END START,88,【例4-11】在数据段中从BUFF单元开始存放100个字节类型的无符号数,将它们按从大到小的顺序排序。排序有多种算法,这里使用起泡法。从第一个数开始依次对相邻的两个数进行比较,100个数需要比较99次,所以程序需要设计一个99次的循环。在这个循环里每次比较时如果前边的数小于后面的数,这两个数交换位置。这99次的循环结束后,最小的数已经交换到了最后,还剩99个数要用同样的比较方法找到最小的数并放到最后,这只要再设计一个98次的循环就可以了。以此类推这个过程需要99轮。,89,90,用起泡算法排序需要设计两重循环,内循环完成数的比较和交换,初始内循环计数值为N-1次,之后每次进入内循环计数值减1;外循环需要N-1次,从外循环进入内循环时注意地址指针初始化和内循环次数的设置。下面的程序在内循环中设置了交换标志,从外循环进入内循环时检查交换标志,如果标志不为0说明前一个内循环里至少有两数据的顺序不合要求,需要再执行一次内循环;如果标志为0,说明所有数据的排序结束。,91,LEN EQU 100DATA SEGMENTBUFF DB 100 dup(?);定义100个数据CHANGE DB 0;设置交换标志DATAENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA BX,BUFF;BX作数据的地址指针 LEA DI,CHANGE;DI作交换标志,92,MOVDX,LEN-1;DX保存循环次数SORT:MOV SI,BX;内循环初始化,设置地址指针MOV CX,DX;设置计数值,等于参加比较的数据数量 MOV BYTE PTRDI,0;设定交换的标志GOON:MOV AL,SI;内循环开始 INCSI CMPAL,SI;前一个数和后一个数比较 JNC NEXT;前大后小,转NEXT不交换 MOV BYTE PTRDI,1;前小后大,置交换标志 MOV AH,SI MOV SI,AL;交换 MOV SI-1,AHNEXT:LOOP GOON;内循环结束,93,DEC DXJZ NEXT1;外循环计数值为0,程序结束 CMP BYTE PTRDI,0;如果内循环中没有交换,程序结束 JNZ SORT;开始下一轮内循环NEXT1:MOV AH,4CHINT21H CODE ENDS END START循环可以有多重结构,多重循环要注意各重循环的控制条件,并且每次从外循环进入内循环时,内循环的初始条件要重新设置。,94,4.4.5 过程设计,过程又称为子程序。子程序使程序结构模块化,程序更加清晰、易读易懂。如果在一个程序的多个地方或多个程序中都用到相同功能的程序段,这时常采用子程序设计方法。(1)过程定义过程定义就是子程序定义,由伪指令完成。例如计算S=12+22+N2的子程序:,95,GOPROC FAR;过程定义MOVDX,0MOV BL,1;BL表示自然数MOV AL,BLCC:MULBL;AL*BL结果存在AX中ADDDX,AX;当 N50时,不会产生进位INC BLMOV AL,BLLOOPCC;CX为计数器RET;过程返回GOENDP;过程定义结束这个子程序可以称为平方和子程序,CX是入口参数,调用之前应该预置CX=N。DX为出口参数,N个数的平方和存在DX中。,96,(2)过程调用和返回过程调用通过CALL指令实现,调用时注意子程序的属性,NEAR属性的子程序必须和调用程序在同一个段;FAR属性的子程序可以随意。CALL指令执行时将当前IP或CS和IP压入栈堆中,然后将子程序的首地址赋给IP或CS和IP,CPU开始执行子程序。RET指令执行时弹出栈中的数据,修改IP或CS和IP的内容,从而实现返回调用程序的目的。在子程序中对堆栈的使用应该特别小心。,97,例如调用平方和子程序求20个数的平方和:DATASEGMENTCONEQU 20SUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOVCX,CON;设置子程序的入口参数CXCALLGO;调用子程序MOVSUM,DX;保存出口参数MOV AX,4C00HINT 21HCODEENDSEND S

    注意事项

    本文(微机原理与接口技术.ppt)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开