《微机计算原理》PPT课件.ppt_第1页
《微机计算原理》PPT课件.ppt_第2页
《微机计算原理》PPT课件.ppt_第3页
《微机计算原理》PPT课件.ppt_第4页
《微机计算原理》PPT课件.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章 汇编语言及汇编程序,7.1 宏汇编语言的基本语法 7.2 伪指令 7.3 宏指令 7.4 系统功能调用 7.5 汇编程序的功能及汇编过程 7.6 汇编语言程序设计,7.1 概述,汇编语言程序的上机处理过程,主要的汇编程序:MASM,【例7.1】 设计要求: 在源程序中设置数据段、堆栈段及代码段。 在数据段中定义8个字节数据,把这些数据转换成十六进制数的ASCII码存在上述数据之后, 然后在屏幕上显示这些数据。显示数据用DOS功能2号调用,每个数据用空格分隔。 (2) 程序流程: 程序流程如图7.6和图7.7所示。,图7.6,图7.7,NAME EX1 DAT SEGMENT PARA DAT A1 DB 12H,34H,56H,78H,9AH DB 0BCH,0DEH,0F0H B1=$-A1 ;求出$到A1所占的字节数 B2=B1*2 A2 DB B2 DUP(?) ;定义B2个内存空间 DAT ENDS 注:$:当前数据指针,是一个偏移地址值; 未用内存数据定义伪指令定义的变量不占内存空间,因而B1、B2不占内存空间,,例7.1程序运行结果显示:12 34 56 78 9A BC DE F0,(3) 程序清单:二进制数对十六进制数转换及显示主程序:,1、 常量,二进制 xxxxxxxxB 01000101B 八进制 xxxO 或xxxQ 721O或721Q 十进制 xxxx或xxxxD 1991或1991D 十六进制 xxxxH 0F1D4H 字符串 xxx AB 常出现在指令和伪指令中,7.1.1 常量、变量和标号,7.1 宏汇编语言的基本语法,常量,在程序中,常数主要出现在: (1) 指令语句中源操作数中作立即数,它应与目的操作数的位数相一致,可以是8位或16位,例如: MOV AX, 0A5F1H (2) 在指令语句的基址加变址的寻址方式中作位移量,例如: MOV BX,SI+32H (3) 在数据定义伪指令中,例如: DB 12H ; 定义一个字节数据 DW 1234H ; 定义一个字数据 DD 12345678H ; 定义一个双字数据 DB A B C D ; 定义4个字节的字符串数据,2、标号(作为操作数的标号),指令存放单元的符号地址,是转移/调用/循环指令的操作数 标号的三种属性: 段 SEG 偏移量 OFFSET 距离 NEAR/FAR,标号,2.标号的定义 标号只在代码段中定义和使用,定义的方式有两种: (1)书写在符号指令前,用:定义,为NEAR类型, NEAR型标号只能在段内使用! 例: ABC:MOV AL,SI ;定义近标号CYCLE (2)用PROCENDP伪指令定义过程名 例:ABC PROC FAR ;定义过程名ABC为FAR型标号 ABC ENDP,在汇编中都使用变量和地址表达式来表示存储器的地址。 变量是存储器中的数据或数据区的符号表示。 变量名是数据的地址或数据区的首地址。 地址表达式由变量、标号、寄存器、常量和运算符组成。寄存器只能是16位的SI、DI、BX、BP和32位的通用寄存器 ,且寄存器必须位于 中。,3. 变量,(1)变量和地址表达式,如: SEG W ;取变量W的段基址,如: OFFSET W ;取变量W的偏移地址,(2)变量的属性,变量的类型有:字节(byte),字(word),双字(dword),数据存放规律 字节数据-一个字节单元存放 字数据-二个字节单元存放 双字数据-四个字节单元存放 规定: (1)“低对低,高对高” (2)低位字节的地址为字的地址,(3)变量存储区中数据的存放,变量名 DB 表达式, ;定义字节变量 变量名 DW 表达式, ;定义字变量 变量名 DD 表达式, ;定义双字变量 变量名 DQ 表达式, ;定义四字变量,数据定义伪指令指明了变量的类型 表达式确定变量的初值。表达式有如下6种:,(4)变量的定义,变量,(1)表达式为常量或数值表达式存入数值 如:W1 DW 1 (2)表达式为ASCII字符串 存入ASCII值 如:W2 DW AB ;用DW定义时,串长不可大于2 B2 DB AB$ ;用DB定义时,串长可大于2 (3)表达式为重复子句 格式:N DUP(表达式) 如:B3 DB 2 DUP(0) B4 DB 2 DUP(5,A),变量的定义,(4)地址表达式(只适用DW、DD和DF3个伪指令) 格式:变量名 DW 地址表达式 ;取其偏移地址来初 ;始化变量 变量名 DD 地址表达式 ;取16位偏移地址和段 ;基址来初始化其变量 变量名 DF 地址表达式 ;取32位偏移地址和段 ;基址来初始化其变量 (5)由以上表达式组成的序列,之间用 ,分隔 B5 DB 1,2,3,变量、标号以及由其组成的地址表达式均有类型属性。地址表达式的类型属性由其中的变量或标号(一个地址表达式不可能同时含有变量和标号)决定。不含变量或标号,仅含寄存器的地址表达式没有类型属性。可以使用PTR算符临时变更原地址表达式的类型属性,或者明确没有类型属性的地址表达式的类型,而仍保持它们原来的段基址和偏移地址属性不变。 格式: 类型 PTR 地址表达式 如:BYTE PTR BX+5 ;明确类型 WORD PTR B2 ;临时变更,5. 地址表达式类型的变更,7.1.2 表达式与运算符,表达式由操作数和运算符组成,在汇编的时,一个表达式得到一个值 操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量) 运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符,注:表达式中的运算符是一种伪操作,也是由汇编程 序来完成的,不要将它与指令混淆了,1. 算术运算符 +,-,*,/是加减乘除运算符。 MOD是除法取余运算符。例如,32 MOD 52。 SHL是左移操作符。例如,21H SHL 284H。 SHR是右移操作符。,2. 逻辑运算符 AND是逻辑“与”操作符。例如,24H AND 0FH04H。 OR是逻辑“或”操作符。例如,24H OR 0FH2FH。 XOR是“异或”操作符。例如,24H XOR 0FH2BH。 NOT是逻辑“非”操作符。例如,NOT 24H0DBH。,3. 关系运算符 关系运算是逻辑判定式的,当为“真”时结果取0FFFFH,当为“假”时结果取0。关系运算是数值型的。 EQ等于。例如,已赋给符号PP为25,则25 EQ PP0FFFFH。 EQ,NE,LT,LE,GT,GE,4. 分析运算符,SEG 变量/标号 (求段基址) OFFSET 变量/标号(求偏移地址) MOV SI, OFFSET S1 (LEA SI,S1) MOV DI, OFFSET S2 (LEA DI,S2) TYPE 变量/标号(P159 表 7-1) 变量返回类型:1:字节、2:字、4:双字 标号返回类型:-1: NEAR、-2: FAR SIZE 符号名(求为符号名分配的字节数,为符号名定义的数据项必须是由DUP( )定义的) LENGTH 符号名,5. 组合运算符(改变、建立符号名的新类型),(1)定义符号为新类型 格式:类型 PTR 符号名 MOV AX,WORD PTR D1 (2)指定新类型 格式:THIS 类型 LABC EQU THIS BYTE(新类型) LABD DW 4321H,2255H MOV AL,LABC ;AL=21H MOV AX,LABD ;AX=4321H,分离运算符,(1)LOW 取低字节 格式:LOW 表达式 (2)HIGH 取高字节 格式:HIGH 表达式 P160 例:设SSY=2050H MOV AL,LOW 3080H; AL=80H MOV AH,HIGH SSY; AH=20H MOV CL,LOW 3A4BH; CL=4BH,7.2 伪指令( Directive ) 不由CPU 来执行而由汇编(MASM)来识别的 指令称为伪指令,伪指令没有对应的机器指令,其格式为 标号 伪指令 操作数 ;注释,1、符号定义伪指令 EQU、= 表达式的值赋给符号名 注意: 该语句把表达式的值赋给符号名,在同一程序中,用EQU语句赋值的符号名不能被重新赋值,但用“”号赋值的符号名可以被重新赋值。 该定义不占内存空间。,7.2 伪指令( Directive ),注意: 表达式或数据项表多于一项时,项与项之间用逗号“,”或空格分隔,表达式或数据项重复书写时,可用重复格式简写。 定义重复数据操作符DUP必须与DB、DW、DD、DQ配合使用。,2、内存数据定义伪指令:DB、DW、DD、DQ DB:表达式值或项表中的每一项是一个字节数,它们从符号名地址 开始按字节连续存放 例,B1 DB 20H DUP(?) B2 DB 2 DUP(3 DUP(ABC),括号内是重复的内容,7.2 伪指令,3. 段定义伪指令 存储器在逻辑上是分段的,各段的定义由伪指令实现。 格式: 段名SEGMENT定位方式连接方式类别名 段名ENDS 段定义伪指令为程序的汇编和连接说明了段名、分段的各种属性以 及分段的开始和结束。段名是自定义符,开始的段名与结束的段名 必须相同。段的长度不超过64KB。SEGMENT后面的参数是可选项。 (P163),4. 段寄存器说明伪指令 格式: ASSUME段寄存器:段定义名1,段寄存器:段定义名2, 该伪指令告诉汇编程序在汇编时,段寄存器CS:,DS:,SS:和ES:应具有的符号段基址,以便汇编指令时确定段和建立错误信息。但是段寄存器实际值(CS除外)还要由传送指令在执行程序时赋值。,5、过程(子程序)定义伪指令 格式:过程名PROC NEAR(FAR) . . 过程名ENDP (P162),8 定位伪指令 ORG 100H 该指令后面的一条指令语句或数据区定义命令从偏移地址为100H处开始存放。,12、记录伪指令: (1)记录定义伪指令: RECORD (2)记录存储单元分配及赋值 13、结构伪指令 STRUC ENDS,11. 连接伪指令 连接伪指令主要解决多模块的连接问题,对一个大程序来说, 往往要分模块编程,分模块调试,最后再系统连接与调试。 连接伪指令为多模块连接进行说明。 (1) 公用符号伪指令 格式: PUBLIC符号名1,符号名2, 本模块用PUBLIC伪指令说明的自定义符号名可由其他程序模块 引用,没有说明的符号名不能被其他模块引用。符号名可以是变 量名、标号、过程名或符号常量等。 (2) 引用符号伪指令 格式: EXTRN符号名1:类型,符号名2:类型 在本模块引用的在其他模块定义的符号名必须用EXTRN进行说明, 否则不能引用。此外还应注意,所引用的外模块定义的符号名还 应是用PUBLIC伪指令说明过的。 (3) 插入伪指令(或称包含伪指令) 格式: INCLUDE模块名 在本模块汇编时,把另一模块插入该伪指令处一起汇编,被插入的 模块可以是不完整的。,DS:0000DS:000AH,DAT SEGMENT ARRAY1 EQU 100AH ARRAY2 DB 12H,34H TABLE1 DW ? TABLE2 DB 2 DUP(DEF) B1=$-TABLE1 DAT ENDS MOV AX, ARRAY1 LEA SI, TABLE1 MOV SI, AX,填写DS:0000-DS:000AH内存,并求B1的值。,练习:,7.4 系统功能调用,1、MS-DOS系统中的内部子程序 2、对汇编语言编程者来说是独立中断子程序,用软中断指令调用,它们的入口地址已由系统置入中断入口地址表中。 3、INT 21H 称为系统功能调用,共有88个功能号 4、使用格式 (1)入口参数 指定寄存器(无参数的不用此句) (2)功能号 AH (3)INT 21H 5、重点掌握 1、0AH、2、9、4CH 号,调用格式: MOV AH,1 INT 21H 入口:无入口参数 出口:键入字符ASCII码值在AL中,回显该字符。,常用功能调用,(1)1号功能调用键入并显示一个字符,调用格式: MOV DL,待显示字符的ASCII MOV AH,2 INT 21H 入口:输出字符的ASCII 送 DL 出口:无出口参数 例:显示字符 B MOV AH,2 MOV DL,B INT 21H,(2)2号功能调用显示器显示一个字符,7.4 系统功能调用,调用格式: MOV DX,OFFSET BUF MOV AH,0AH INT 21H 入口:DS:DX置输入数据区首址,第一单元置允许键入的字符数(含回车符) 出口:键入的实际字符数在第二单元中,键入的字符从第三单元开始存放,(3)0A号功能调用键盘输入字符串,7.4 系统功能调用,调用格式: MOV DX,待显示字符串的首偏移地址 MOV AH,9 INT 21H 入口:DS:DX置字符串首地址,字符串以结束 出口:无出口参数,(4)9号功能调用显示器显示字符串,7.4 系统功能调用,例:显示 AZ 26个字符 方法一:用2号功能调用,单个字符依次输出 方法二:定义一个存储区,存放26个字符,并以$结束,用9号功能调用输出字符串 OBUF DB ABCDXYZ$ MOV DX,OFFSET OBUF MOV AH,9 INT 21H,7.4 系统功能调用,调用格式: MOV AH,4CH INT 21H 入口:无入口参数 出口:执行结果是结束当前正在执行的程序,并返回操作系统。,(5)4CH号功能调用返回操作系统,注意: 1.汇编中的“回车”操作仅将光标移至本行行首,故一般在10号功能调用后要输出一个换行0AH,将光标移至下一行的行首 2. 2号、9号、10号功能调用均会破坏AL中的内容,故为了防止AL中内容被破坏,在调用前应先保护AL,调用后再恢复,7.4 系统功能调用,7.5 汇编程序的功能及汇编过程(1),1. 编辑汇编语言程序 a. 先通过附件进入DOS状态 C:; b . D: CD MASM ;进入D盘MASM子目录 D:MASM; c.EDIT ABC.ASM (ABC.ASM为文件名,用户可自己取名,但后缀必须为ASM) d. 键入程序 2汇编(MASM)源程序:MASM ABC; (生成ABC.OBJ 文件) 3程序连接 :LINK ABC;(生成ABC.EXE 文件),7.5汇编程序的功能及汇编过程(2),4执行程序:ABC (注:本例无显示结果的程序段,因而无法看到结果,要想看结果,必须使用DEBUG程序; 5调试程序 a. DEBUG ABC.EXE;(将ABC.EXE文件调入内存并进入DEBUG状态 -) b .- U (显示程序,程序从IP=0000处开始) c. - G (运行程序ABC.EXE,运行完后回到DEBUG状态 -) d. 查看程序结果: - U0000 (显示程序,并从程序的第4句知数据段的段地址,例如0B4E - D4C28:0 0B4E:0000 7A 0A 07,7.6汇编语言源程序设计 8086汇编语言源程序的结构,DATA SEGMENT . DATA ENDS STACK SEGMENT STACK . STACK ENDS CODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODE START: CODE ENDS END START,数据段,堆栈段,代码段,8086的16位段模式的格式如下: stack segment stack stack dw 32 dup(0) stack ends data segment data ends code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax ret begin endp code ends end begin,宏汇编源程序的格式,【例7.1】 设计要求: 在源程序中设置数据段、堆栈段及代码段。 在数据段中定义8个字节数据,把这些数据转换成十六进制数的ASCII码存在上述数据之后, 然后在屏幕上显示这些数据。显示数据用DOS功能2号调用,每个数据用空格分隔。 (2) 程序流程: 程序流程如图7.6和图7.7所示。,图7.6,图7.7,NAME EX1 DAT SEGMENT PARA DAT A1 DB 12H,34H,56H,78H,9AH DB 0BCH,0DEH,0F0H B1=$-A1 ;求出$到A1所占的字节数 B2=B1*2 A2 DB B2 DUP(?) ;定义B2个内存空间 DAT ENDS 注:$:当前数据指针,是一个偏移地址值; 未用内存数据定义伪指令定义的变量不占内存空间,因而B1、B2不占内存空间,,例7.1程序运行结果显示:12 34 56 78 9A BC DE F0,(3) 程序清单:二进制数对十六进制数转换及显示主程序:,STAC SEGMENT PARA STACK STA STA1 DW 100 DUP(?) STAC ENDS,CODE SEGMENT PARA CODE ASSUME CS:CODE,DS:DAT ASSUME SS:STAC,ES:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV ES,AX,;执行后返回所需指令,;赋段及偏移地址,LEA SI,A1 LEA DI,A2 28: MOV CX,B1 ;要转换的字节数 G1: MOV BL,2 ;每字节转换2次 MOV AL,SI MOV BH,AL ;取出的数先暂存于BH PUSH CX MOV CL,4 ;先取出高4位 ROR AL,CL POP CX,G2: AND AL,0FH DAA ADD AL,0F0H ADC AL,40H MOV DI,AL INC DI MOV AL,BH ;取回暂存数据准备取低4位 DEC BL JNZ G2 ;一个字节未转换完2次则转G2 INC SI LOOP G1,MOV SI,OFFSET A1+1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论