《微机04第四章:汇编程序设计.ppt》由会员分享,可在线阅读,更多相关《微机04第四章:汇编程序设计.ppt(54页珍藏版)》请在三一办公上搜索。
1、第四章 汇编语言程序设计,南理工紫金学院帅辉明,汇编语言数据和表达式伪指令语法程序设计顺序、分支、循环、子程序DOS功能调用,本章重点,机器语言:由0、1代码所组成的语言。面向机器,同一组代码对不同的计算机表示不同的含义。汇编语言:由助记符表示的语言。面向机器。高级语言:用一些接近人们书写习惯的英语和数学表达式形式的句子编写程序。这种语言不面向机器,而是面向过程、面向对象。,4.1 程序设计语言概述,高级语言,C、C+、PASCAL语言如:Turbo C、VC+、DELPHI、GNU GCC,汇编语言,机器语言,高级语言,虚拟机,C#、JAVA,.NET、JVM,各种语言的关系,1.数据(1)
2、常数表示汇编过程中已经有确定数值的量,主要用于做指令中的立即数、寻址中的位移量,或在伪指令语句中给变量赋值。数值常数:由二、八、十和十六进制表达的数 字符串常数:用(或“”)括起来的一串ASCII码字符,等效为一组数值常数,4.2 8086汇编语言介绍,0101B3247O2873D23ABH,12AB=31H、32H、41H、42H,内存单元的数据,变量值在程序运行期间可以改变。需要事先定义,通过变量名引用。变量名表示变量的首地址。在数据段或附加段用数据定义伪指令定义。变量的属性段:变量所在段基址偏移量:变量在段内的偏移量类型:变量的字节数,DB、DW、DD,(2)变量,在指令前面,代表指令
3、所在存储单元的地址。通常作为程序中转移、调用、循环指令的转移目标地址。定义方式 标识符:标号的属性:段:变量所在段基址偏移量:变量在段内的偏移量距离:NEAR段内标号、FAR段外标号,(3)标号,2、表达式,由常数、变量或标号、运算符连接而成分类:数字表达式、地址表达式(1)运算符,注意与算术运算指令和逻辑运算指令的区别,ANDDX,PORT AND 0FFH,MOV AX,VALUE MOD 7;VALUE=50MOV AL,NOT 0FHMOV AX,0FH EQ 1111B,举例:,MOV AX,1,MOV AL,F0H,关系成立结果全为1否则全为0MOV AX,FFFFH,对存储单元的
4、操作,(2)数值返回运算符,SEG返回变量/标号的段基址OFFSET返回变量/标号的段内偏移举例:MOVAX,SEG K1MOV BX,SEG ARRAYMOVBX,OFFSET ARRAY变量K1所在段的段基址为0915H变量ARRAY所在段的段基址为0947H,偏移为0100H,运算符SEG和OFFSET,=MOVAX,0915H=MOV BX,0947H=MOVBX,0100H,运算符TYPE,LENGTH返回数组元素的个数若变量用重复数据操作符DUP定义,则返回最外层DUP的值若变量无DUP说明则返回1SIZE返回数组变量所占的总字节数=LENGTH*TYPE,运算符LENGTH和SI
5、ZE,K1DB10H DUP(0)K2DB“ABCDEF”TYPE K1=TYPE K2=LENGTHK1=LENGTH K2=SIZE K1=SIZE K2=,举例:,1,10,1*10=10,1,1,1*1=1,(3)属性运算符,(4)运算符优先级,指令语句伪指令语句宏指令语句,3.伪指令,执行语句。经过汇编产生可供计算机硬件执行的机器目标代码。,说明语句。如:程序有几个段,段的名称,是否需要预留存储空间等。不直接产生目标代码。,指令语句+伪指令语句。替代源程序中一段有独立功能的程序,汇编时产生相应的目标代码。,定义变量,并关联变量名和存储单元地址。定义格式:变量名 类型 数据项表类型:D
6、B DW DD DQ DT数据表项:变量的长度、数组元素个数、变量的初值,(1)变量定义伪指令,DBYTE DB-5H一个字节变量,值为-5HDWORD DW 6*3一个字变量,值为18DDWORD DD 1234H一个双字变量,值为1234H,数据定义例数值初值,DBYTE,DWORD,DDWORD,STRING1 DB AB一个字节变量,值为ASTRING2 DW AB一个字变量,值为ABSTRING3 DD AB一个双字变量,值为AB,数据定义例字符串,STRING1,STRING2,STRING3,伪指令:DUP,重复赋值格式:重复次数 DUP(操作数,.,操作数)SUBBDW1000
7、 DUP(?)包含1000数组元素值不确定SDKPDB2 DUP(0,2 DUP(1)包含2个数组元素每个元素由2部分构成,0和另一个数组B数组B包含2个元素,值为1,数据定义例数组(1),BUFFDB16 DUP(Welcome)包含16个元素每个元素的值为WelcomeLINGDB4 DUP(0,1)包含4个元素每个元素的数据为0和1,数据定义例数组(2),数组共占16*7个字节!,数组共占4*2个字节!,数组实际所占空间和用SIZE求得数值不一定相同!,赋值伪指令:EQU定义格式:符号名 EQU 表达式等号伪指令:定义格式:符号名 表达式特点:都不直接产生机器指令区别:赋值伪指令不可以重
8、名,(2)符号定义伪指令,COUNT=5;常数NUM=13+5-4;数值表达式NUM=NUM+1ADR1 EQUDS:BP+4;地址表达式CREGEQUCX;寄存器名CBDEQUDAA;指令名L1EQUSUBSTART;标号名WOEQUWORD PTR DBYTE;变量名,举例:,把源程序划分成若干逻辑段,便于汇编程序生产相应代码,便于连接程序生产可执行程序。一个汇编语言源程序可以包含若干个逻辑段(代码段、数据段、附加段或堆栈段),段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。,(3)段定义伪指令,段名 SEGMENT 定位类型
9、组合类型类别名段名 ENDS定位类型:表示对该段起始边界的要求组合类型:段与段之间如果连接和定位类别名:用于分类排序,逻辑段定义格式,STACK SEGMENT STACK.STACK ENDSDATA SEGMENT.DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK.CODE ENDS,格式:ORG 表达式功能:表明从表达式所指地址开始存放程序或数据举例:DATASEGMENT BUFF1DB23,56H,EOF ORG2000H BUFF2DBSTRINGDATAENDS,(4)设置起始地址伪指令,表示整个源程序结束,停止汇编。定义格
10、式:END 标号注意:与第一条指令的标号相同;必须是最后一条语句;若有多个END语句,只有第一个有效。,(5)汇编结束伪指令,说明段寄存器和用户编写的段的对应关系,表示出用户编写的段属于系统规定的哪个段一般设在代码段中定义格式:ASSUME 段寄存器名:段名,段寄存器名:段名,(6)段寄存器设定伪指令,注意:该语句仅仅说明段寄存器和段的对应关系,但不等于段基址已经装入了段寄存器,3.3 汇编语言程序设计,汇编程序的结构框架,DATA SEGMENTDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA;定义过程START:MOVAX,DATA MOVDS,AX
11、 MOVAH,4CH INT21HCODE ENDSEND START,段寄存器定义,过程:具有一定功能的子程序,CALL调用定义格式:过程名PROC距离类型ret过程名ENDP注意:过程和段可以互相嵌套,但不可交叉覆盖每个过程一定有返回指令RET,可能有多个最后一条指令必须是RET,(7)过程定义伪指令,名字 操作码 操作数 注释 START:MOV AX,30H;AX30H名字以字母开头,由字母、数字、特殊字符(?、*、_、$、等)组成,不超过31字符不能与保留字相同任选,多数指令不用,伪指令用指令语句名字用“:”分界,伪指令语句用空格分界标号名、变量名、常量名、过程名、段名等,4、汇编语
12、言语句结构,操作码必不可少的核心,规定了所要执行的操作,由指令或伪指令助记符组成操作数参与操作的数据或地址,可以有多种表达形式,之间用,隔开注释;后面的字符串,1、程序设计的基本步骤分析题目与确定算法合理分配存储空间和存储器编制程序流程图编写源程序调试源程序,4.3 汇编语言程序设计,2、顺序结构,例4-15把BUF开始的两个字节单元中的压缩BCD数相加,结果存入字节单元RES中BCD码:为了让计算机能识别十进制数例如:通常十进制数49在计算机中为31H,不方便程序员观察和记忆,用BCD码存放则直接为49H,buf db 89h,34hres dw?LEA BX,BUF;BX为BUF的有效地址
13、MOV AL,BUF;BUF中的第一个字节ADD AL,BX+1;BX+1 为BUF中的第二个字节DAAMOV RES,AX,例4-18 求数X的绝对值,并送值回原处STACKSEGMENT STACKDW256DUP(?)STACKENDSDATASEGMENTXADRDW3456H,8192HDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,3、分支结构,START:MOV AX,DATAMOV DS,AXMOV AX,XADRAND AX,AXJNS DONENEG AXMOV XADR,AXDONE:MOV AH,4CHINT 21H
14、CODEENDSEND START,例4-20求某数据区内负数的个数 设数据区第一个单元存放数据个数,第二单元开始存放数据,最后一个单元存放结果。STACK SEGMENT STACKDW64 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:CODE,4、循环结构,START:MOVDI,3000H;设置数据区首地址MOVCL,DI;设置循环次数(即数据个数)(设置初值)XORCH,CH;CH清0MOV BL,CH;BL统计负数个数,初值为0INCDI;指向第一个元素(循环条件改变)A1:MOVAL,DITESTAL,80H;测试数
15、据首位=1?JEA2;ZF=1,数据首位=0INCBL;负数个数+1A2:INCDI;指向下一个元素LOOP A1MOVDI,BL;存放统计结果,注意:主程序与子程序之间的参数传递保护和恢复主程序中寄存器的现场数据主程序与子程序之间的参数传递方式寄存器传递参数堆栈传递参数指定存储单元传递参数,5、子程序设计,例4-23 求2个32位数的和。(利用堆栈传递参数)CODESEGMENTASSUME CS:CODE,DS:CODE,SS:CODEORG 100H;以下指令从偏移为0100H处开始START:JMPMAINADDT1DW1200H,1200H;数据定义ADDT2DW2100H,2100
16、HSUMDW2DUP(?)MAIN:MOVAX,CODEMOV DS,AX,MOVCX,0002;定义调用次数MOVSI,0;定义数据指针CLC;CF0REPEAT:MOVAX,ADDT1;取当前数XPUSHAX;压入堆栈MOVAX,ADDT2SI;取当前数YPUSHAX;压入堆栈CALLADDITION;调用加法子程序MOVSUMSI,AX;送当次运算结果INCSIINCSI;指向下一个数据LOOPREPEAT,MOVAX,4C00H;结束调用INT21HADDITIONPROC NEARMOVBP,SP;指向栈顶MOVAX,BP+2;取第一个加数ADCAX,BP+4;取第二个加数RET4;
17、弹出两个加数ADDITIONENDPCODE ENDSENDSTART,DOS系统功能调用和BIOS中断调用1常用DOS系统功能调用DOS系统功能调用即DOS为用户提供的一组例行子程序,其调用和返回不是用CALL和RET,而是用INT n和IRET。这些子程序可分为以下几个方面:磁盘的读写及控制管理。内存管理基本输入/输出管理(如键盘、打印机、显示器)其他管理(如日期、时间)所有这些子程序按顺序编号(调用号),分别为075H。调用方法:子程序入口参数送相应寄存器 调用功能号送AH INT 21H,(1)1号功能调用(键盘输入并显示)MOV AH,1 INT 21H 功能:扫描键盘,等待输入,若
18、有键盘按下,则将键值读入并判断是否为Ctrl+Break键,若是,退出;若不是,则将键值(字符的ASCII码)送AL,同时在CRT上显示该字符。(2)2号功能调用(显示一个字符)MOV AH,2 MOV DL,待显字符ASCII码 INT 21H,(3)9号功能调用(字符串显示)MOV DX,待显示字符串首地址 MOV AH,9 INT 21H 功能:将以$为结束标志的字符串在屏幕上显示。说明:(1)执行前要在DS数据段定义一个字符串,该字符串必须在$结尾。(2)若字符串无$结尾,则在其尾部加一$;若字符串中间有$,则只能采用2号功能调用逐个字符输出。,(4)10号功能调用(字符串输入)MOV
19、 AH,10 MOV DX,待存数据区首地址 INT 21H 功能:从键盘上接收字符串送到内存数据中。注意:数据区的定义形式:BUF DB 50;数据区长度 DB?;实际输入字符的个数 DB 50 DUP(?);存放输入的字符 如果输入的字符数大于数据区所定义的字符个数,就会发出“嘟嘟”声。,(5)4CH号功能调用(返回操作系统)MOV AH,4CH INT 21H 功能:结束当前正在执行的程序,返回操作系统,屏幕显示操作系统提示符。2BIOS中断调用 驻留在ROM中的BIOS提供了系统加电自检、引导装入I/O设备的处理程序及接口控制等功能模块来处理所有的系统中断。与DOS系统功能调用类似,用
20、户可以直接用指令设置参数,然后中断调用BIOS中的程序。,下面介绍几条常用的中断调用。(1)键盘中断调用(INT 16H)软中断INT 16H有多个功能,其中常用的是0、1、2号功能0号:MOV AH,0 INT 16H功能:从键盘读字符,并将其ASCII码送AL。扫描码送AH。与DOS的1、8号功能类似。1号:MOV AH,1 INT 16H功能:判断是否有键按下。有键按下,ZF=0,且AL,AH同上。无键按下,ZF=1。与DOS的6号、0B号功能类似。,例:按任意键,程序退出执行。DOS功能调用(11号功能):MOV AH,0BH INT 21H CMP AL,0FFH JZ STOP;有
21、键按下,AL=0FFH STOP:MOV AH,4CH INT 21H,DOS功能调用(6号功能):MOV AH,06H MOV DL,0FFH INT 21H JNZ STOP;有键按下,ZF=0 STOP:MOV AH,4CH INT 21HBIOS中断调用(INT 16H):MOV AH,1 INT 16H JNZ STOP;有键按下,ZF=0 STOP:MOV AH,4CH INT 21H,(2)显示器中断调用(INT 10H)INT 10H的功能调用可以进行屏幕设置。共有16种功能号,其中的0E号功能与DOS的2号功能类似。例:在当前光标位置显示人处字符“7”,并使光标进1。MOV AH,0EH MOV AL,37H INT 10H DOS调用可实现相同的功能:MOV AH,2 MOV DL,37H INT 21H,