《微型计算机原理及应用-伪指令.ppt》由会员分享,可在线阅读,更多相关《微型计算机原理及应用-伪指令.ppt(28页珍藏版)》请在金锄头文库上搜索。
1、微型计算机原理及应用主 讲:李春雷() 学 时:64电子信息教研室中原工学院第十二讲回顾及本讲重点n回顾n汇编语言概述n汇编语言的基本语法n本讲重点n伪指令语句格式n宏指令语句格式7.3 伪指令n符号定义伪指令(赋值语句)n名字EQU表达式n名字表达式该语句把表达式的值赋给符号名,在同一程序中,用EQU语句赋值的符号名不能被重新赋值,但用“”号赋值的符号名可以被重新赋值。同一个标号不能被两次赋值,除非先清除标号的原值。与EQU相对应的清除指令:PURGE PURGE ABC ;清除对ABC的赋值7.3 伪指令n数据定义伪指令DB、DW、DD、DQ、DT用来定义存储单元的符号名,并初始化该单元或
2、该单元开始的若干连续单元。初始化可以采用确定值,也可以采用不确定值。nDB (Define Byte)格式:符号名 DB 表达式的值或项表中的每一项定义为一个字节数,它们从符号地址开始按字节连续存放,直到表中数据项结束(地址递增方向)。表达式的值或或项应小于8位2进制数表示的最大值。例如:FIRST DB 3, 18, 25H, ABCSECOND DB ?7.3 伪指令nDW(Define word)格式: 符号名 DW 表达式的值或项表中的每一项都是两个字节数,应小于16位2进制数表示的最大值。例如: DON DW 10 DUP(?) ;在内存中留出10个空单元,其中每个项都是2个字节。7
3、.3 伪指令nDD:定义双字nDQ:定义4个字nDT:定义10个字例如: N1 DD 2.5, 3.2E+2DD可以用来定义有小数点的十进制数或用科学计数法表示的数据。小数在汇编时被译成四字节浮点数,尾数在低地址一端,阶码在高地址一端。DQ和DT也允许浮点数形式。 COUNT DT ? ;在内存中留出1个空单元。7.3 伪指令n举例S1 DB ABCDEFS2 DB A, B, C, D, E, FS3 DW AB, CD, EFS4 DD AB, CD, EF7.3 伪指令n带DUP的表达式DUP 是定义重复数据操作符例: DB1 DB 10H DUP(?) DB2 DB 10H DUP(A
4、BCD) DB3 DB 2H DUP(0,2,?)第一个语句表示保留10H个字节;第二个语句是重复10H个字符串ABCD,共占用40H个字节;第三个语句是重复2H个数字串和空单元。7.3 伪指令n注意数据定义与引用时,要保证数据类型正确性。举例: 数据定义: D1 DB 3 DUP(12H) 引用: MOV AX, D1 ;引用错误 MOV AX, WORD PTR D1 ;正确7.3 伪指令n存储单元类型定义伪指令BYTE、WORD、DWORD在指令中与PTR运算符结合起来使用。例如: MOV BYTE PTRDI, 00 MOV WORD PTR1000, 00 INC WORD PTRD
5、I JMP DWORD PTR2000H7.3 伪指令n段定义伪指令SEGMENT、ENDS、ASSUME、ORGnSEGMENT、ENDS成对出现,定义段。格式: 段名 SEGMENT 段的内容 段名 ENDS段名为用户自定义的标号,可以为任何有效的标识符。例如: DATA_SEG SEGMENT . DATA_SEG ENDS7.3 伪指令nASSUME:用于指定用户定义的哪一个段为数据段、代码段或堆栈段。对DS、SS只知道段基址,而实际值要在程序中使用传送命令来具体赋值。例如: ASSUME CS:CODE_SEG, DS:DATA_SEG该指令指出CODE_SEG的段地址在CS中,DA
6、TA_SEG的段地址在DS中,但并没有把段地址装入相应的段寄存器。因此除了CS以外(CS通过在启动代码段时由段间转移装入),将段地址装入相应寄存器的工作必须通过MOV传送指令完成。7.3 伪指令n例:CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG,SS:STACK:SEGSTART: MOV AX,DATA_SEG MOV DS,AX MOV AX, STACK_SEG MOV SS,AX CODE_SEG ENDS7.3 伪指令n例:实现两个16位二进制数的相乘DATA SEGMENT M1 DW 00FFH M2 DW 00FFH P1 DW
7、 ? P2 DW ?DATA ENDSSTACK SEMENT ST DB 100 DUP(?) TOP EQU LENGTH STSTACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX数据段,包括数据定义堆栈段代码段7.3 伪指令MOV AX, TOPMOV SP, AXMOV BX,OFFSET M1MOV AX,BXMOV DX,00MOV BX,OFFSET M2MUL BXMOV BX,OFFSET P1MOV BX,
8、AXMOV BX, OFFSET P2MOV BX,DXHLT CODE ENDSEND START代码段7.3 伪指令n过程定义伪指令PROC、ENDP、NEAR、FARnPROC、ENDP成对出现,用于定义过程,即子过程。格式: 过程名 RPOC NEAR(或FAR) 过程的内容 过程名 ENDP过程名为用户自定义的标号,定义过程是为实现子过程调用而设的。调用格式为: CALL 过程名过程由RET指令返回。可以设置多个返回点。7.3 伪指令n过程调用分为段内调用和段间调用段内调用和段间调用由被调用子程序头部的FAR或NEAR伪指令指出,NEAR可以省略。段内调用和段间调用的返回指令助记符都
9、是RET,但执行的操作不同,段内调用时汇编程序对RET产生指令编码C3H,实现段内返回;段间调用时汇编程序对RET产生指令编码CBH,实现段间返回。7.3 伪指令n模块开始/结束伪指令n模块开始伪指令格式: NAME 模块名指明程序模块的开始,并指出模块名。若该伪指令默认,则取TITLE语句中的页标题前6个字符;若没有TITLE语句,则取源程序文件名为模块名。n模块结束伪指令格式: END启动标号或过程名该伪指令告诉汇编程序源文件结束。7.3 伪指令n连接伪指令PUBLIC、EXTRN、INCLUDE、GROUPn公用符号伪指令格式: PUBLIC符号名1,符号名2, PUBLIC伪指令说明的
10、自定义符号名可由其他程序模块引用,没有说明的符号名不能被其他模块引用。符号名可以是变量名、标号、过程名或符号常量等。n引用符号伪指令格式: EXTRN符号名1:类型,符号名2:类型本模块引用其他模块定义的符号名必须用EXTRN进行说明,否则不能引用。7.3 伪指令n插入伪指令(或称包含伪指令)格式: INCLUDE模块名在本模块汇编时,把另一模块插入该伪指令处一起汇编,被插入的模块可以是不完整的。n合段伪指令(或称组合伪指令)格式: 组名GROUP段名1,段名2,段名3,把其后指定的段组合在一个64KB的物理段中,组名和段名都是自定义符,但不可重名。7.4 宏指令为了简化汇编语言源程序的书写,
11、引入“宏指令”,有效地缩短了源程序的长度,使源程序易读,也减少了由于重复书写而引起的错误。n与过程区别n宏调用语句由宏汇编程序MASM86中的宏处理程序来识别,并完成相应的处理;而调用过程的CALL语句由CPU来执行。n过程调用能有效地缩短目标代码的长度,节省内存空间。n宏调用有较快的执行速度。7.4 宏指令n同一条宏指令在各次调用过程中可完成不同的操作;一个“过程”在各次调用中只能完成完全相同的功能。结论:当需要多次执行的程序段比较长,对速度要求不很高,并且不要求修改参数的情况下,宜采用过程调用方式;若要求多次执行的程序段比较短,或希望在各次调用中能修改某些参数时,则宜采用宏调用方式。7.4
12、 宏指令n宏指令使用步骤n宏定义:对各个宏指令进行定义,并分别起名字;n宏调用:在需要的地方,通过宏指令名来调用;n宏扩展:由宏汇编程序用宏定义中的指令来代替宏调用中的宏指令名。7.4 宏指令n宏定义伪指令(MACRO/ENDM)格式:宏指令名 MACRO 参数,参数, (宏定义体) ENDM 7.4 宏指令n举例:定义两个数相加的宏DECADD1MACRO OPR1,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 假如有如下调用: DECADD1 DL,BUFFER DECADD1 AREA1,AREA27.4 宏指令汇编时进行宏扩展,得到
13、以下指令:DECADD1 DL,BUFFER 扩展为:MOV AL,DL ADD AL,BUFFER DAA MOV DL,ALDECADD1 AREA1,AREA2扩展为: MOV AL,AREA1 ADD AL,AREA2 DAA MOV AREA1,AL 宏扩展后,原来宏定义体中的指令前面加上了符号“+”,以示区别。 作业n下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。VAR1 DB10,2VAR2DW5DUP(?),0VAR3DBHOW ARE YOU?,$VAR4DD-1,1,0作业n数据定义语句如下所示: FIRST DB 90H,5FH,6EH,69H SECOND DB 5 DUP(?) THIRD DB 5 DUP(?) FORTH DB 5 DUP(?)自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:(1)编一段程序将这个数左移两位、右移两位后存放到自SECOND开始的单元(注意保留移出部分。(2)编一段程序将这个数求补以后存放到自FORTH开始的单元。n试编程序将内存从40000H到4BFFFH的每个单元中均写入55H,并再逐个单元读出比较,看写入的与读出的是否一致。若全对,则将AL置7EH;只要有错,则将AL置81H。