课件:第章汇编语言程序设计.ppt_第1页
课件:第章汇编语言程序设计.ppt_第2页
课件:第章汇编语言程序设计.ppt_第3页
课件:第章汇编语言程序设计.ppt_第4页
课件:第章汇编语言程序设计.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

微机原理及接口 教 学 课 件,第 5 章 汇编语言程序设计,微机原理及接口 教 学 课 件,主 要 内 容 5.1 汇编语言程序格式 5.2 伪指令 5.3 汇编语言程序设计 5.4 DOS和BIOS功能调用,汇编语言的特点,汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程是与其他高级语言程序设计大致相同,汇编语言 源程序,汇编程序,可执行指令 和伪指令,DEBUG、 ASM、 MASM,机器语言,汇编语言的特点,汇编语言源程序示例:,DATA SEGMENT M1 DW 00FFH M2 DW 00FFH P1 DW ? P2 DW ? DATA ENDS STACK SEGMENT ST DB 100 DUP (?) TOP EQU LENGTH ST STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP,MOV BX,OFFSET M1 MOV AX,BX MOV DX,00H MOV BX,OFFSET M2 MUL WORD PTR BX MOV BX,OFFSET P1 MOV BX,AX MOV BX,OFFSET P2 MOV BX,DX HLT MOV AH,4CH INT 21H CODE ENDS END START,5.1 汇编语言源程序格式,完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 通常,程序还需要一个堆栈段 整个程序以END结束,源程序由语句序列构成,一、汇编语言的语句格式,执行性语句执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体 标号: 硬指令助记符 操作数 ; 注释 说明性语句说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等 名字 伪指令助记符 参数 ;注释,1、标号、名字与标识符,标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号 标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写 一个源程序中,每个标识符的定义是唯一的,且不能是汇编系统所采用的保留字,名字和标号的属性,名字和标号是用户自定义的标识符。名字用于伪指令,标号用于硬指令。名字和标号一经使用便具有两类属性: 逻辑地址属性名字和标号对应存储单元的逻辑地址,含段地址和偏移地址; 类型属性 变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等; 标号、段名、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间调用 汇编程序提供有关操作符,以便获取这些属性值,保留字,保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有: 硬指令助记符例如:MOV、ADD 伪指令助记符例如:DB、DW 操作符例如:OFFSET、PTR 寄存器名例如:AX、CS 预定义符号例如:data,汇编语言对大小写不敏感,2、(硬)指令和伪指令,指令是目标机器所能执行的代码,为目标cpu所执行 使CPU产生动作、并在程序执行时才处理的指令,硬指令就是第4章学习的处理器指令,与具体的处理器有关、与汇编程序无关 伪指令是汇编程序所执行的一些操作,为交叉汇编机器所执行 不产生CPU动作、在程序执行前由汇编程序处理的说明性指令,伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令,3、操作数和参数,处理器指令中的操作数可以是立即数、寄存器和存储单元 伪指令中的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔 汇编语言程序中,指令参数有数值型(主要形式是常数和数值表达式)和地址型(主要形式是标号和名字,包括变量名、段名、过程名等)。 例如,硬指令的操作数有立即数、寄存器和存储单元;其中,立即数就要用数值型参数表达,存储单元就应该用地址型参数(存储器操作数)表达。,1) 常量,常量表示一个固定的数值,它又分成多种形式 常数 字符串 符号常量 数值表达式, 常数,指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数, 字符串,字符串常量是用单引号或双引号括起来的单个字符或多个字符 其数值是每个字符对应的ASCII码值 例如: d(等于64H) AB(等于4142H) Hello, Assembly !, 符号常量,符号常量使用标识符表达一个数值 MASM提供等价机制,用来为常量定义符号名 符号定义伪指令有等价“EQU”和等号“”: 符号名 EQU 数值表达式 符号名 EQU ;MASM 5.x不支持 符号名 数值表达式 EQU用于数值等价时不能重复定义符号名,但“”允许重复赋值。例如: X = 7 ;等效于:X equ 7 X = X+5 ;“X EQU X+5”是错误的,符号定义实例:,符号定义 DosWriteChar equ 2 CR = 13 CallDOS equ 符号应用(左边的程序段等价右侧的符号形式) mov ah,2 mov ah, DosWriteChar mov dl,13 mov dl, CR int 21h CallDOS, 数值表达式,数值表达式一般是指由运算符连接的各种常量所构成的表达式 汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量 表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定 汇编语言支持多种运算符 我们经常使用的是加减乘除( * / ) 例如: mov ax,3*4+5 ;等价于:mov ax,17,2 )变量,变量实质上是指可以读写的内存单元,虽然内存单元地址不变,但其中存放的数据可以改变 变量需要事先定义才能使用 变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化 定义后的变量可以通过变量名等方法引用(读写)其中的数据,即变量中的数值, 变量的定义,变量定义的汇编语言格式为: 变量名 变量定义伪指令 初值表 变量名为用户自定义的标识符,有时变量名也可以缺省 变量定义伪指令有DB、DW、DD等 初值表是用逗号分隔的参数,主要由常量、数值表达式或“?”组成。其中“?”表示未赋初值 多个存储单元如果初值相同,可以用复制操作符DUP进行定义: 重复次数 DUP(重复参数) 表示初值表首元素的逻辑地址,常称为符号地址。, 变量名,变量名是用户自定义的标识符,用来表示可读写数据的首地址,或初值表的首地址。 这个用符号表示的地址,常称为符号地址。 一个变量可以没有变量名,在这种情况下,汇编程序将直接为初值表分配空间,即该变量没有符号地址。 设置变量名是为了方便存取它指示的存储单元。, 初值表,初值表一般指用户定义的多个数据(用逗号分隔)或 内存空间 主要由数值常数、表达式或?、DUP等组成 ?表示初值不确定,即未赋初值; DUP表示重复初值。 DUP的格式为: 重复次数 DUP (重复参数),4、注释,语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性 必要时,一个语句行也可以由分号开始作为阶段性注释 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理,5、分隔符,语句的4个组成部分要用分隔符分开 标号后用冒号,注释前用分号 操作数之间和参数之间使用逗号分隔 其他部分通常采用空格或制表符 多个空格和制表符的作用与一个相同 MASM支持续行符 “”,二、表达式用运算符,1、算术运算符,实现加、减、乘、除、取余的算术运算。 mov ax, 3*4+5 ;等价于 mov ax,17 其中MOD也称为取模,它产生除法之后的余数,如: 19 mod 7 = 5 + 和- 运算符还可以用于地址表达式。 除加、减外,其他运算符的参数必须是整数。,2、逻辑运算符,实现按位相与、相或、异或、求反的逻辑运算。 or al,03h AND 45h ;等价于 or al,01h,3、移位运算符,实现对数值的左移、右移的逻辑操作;移入低位或高位的是0。其格式为: 数值表达式 SHL/SHR 移位次数 mov al,0101b SHL (2*2) ;等价于 mov al,01010000b,4、关系运算符,用于比较和测试符号数值 MASM用0FFFFH(补码-1)表示条件为真,用0000H表示条件为假。 运算符包括:EQ NE GT LT GE LE 例:mov bx, (PORT LT 5) AND 20H ) OR (PORT GE 5) AND 30H ) ;当PORT5时,汇编结果为mov bx,30H ;否则,汇编结果为mov bx,00H,5、高低分离符,取数值的高半部分或低半部分。 HIGH、LOW从一个字数值或符号常量中得到高、低字节 mov ah, HIGH 8765h ;等价于mov ah,87h 从MASM 6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分 dd_value equ 0ffff1234h ;定义一个符号常量 mov ax, LOWWORD dd_value ;等价于mov ax,1234h,6、地址操作符,地址操作符取得名字或标号的段地址和偏移地址,7、类型操作符,类型操作符对名字或标号的类型属性进行设置 类型操作符包括: PTR / THIS / SHORT TYPE / LENGTH / SIZE,1)PTR 操作符,类型名 PTR 名字/标号 PTR 操作符使名字或标号具有指定的类型,其中: 类型名可以是: BYTE / WORD / DWORD / FWORD / QWORD / TBYTE; NEAR/FAR; 由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。 mov al,byte ptr w_var ;w_var是一个字变量 jmp far ptr n_label ;n_label是一个标号 使用PTR操作符,可以临时改变名字或标号的类型。,2)THIS 操作符,THIS 类型名 用THIS说明的操作数,在汇编时,具有当前逻辑地址和指定的类型: b_var equ THIS byte ;字节变量b_var, w_var dw 10 dup (0) ;字变量w_var,两变量地址相同f_jump equ THIS far ;f_jump为段间转移地址(f_jump label far) LABEL伪指令的功能等同于“EQU THIS”。,3)SHORT操作符,SHORT 标名 指定标号作为-128+127字节范围内的短转移,如果标号实际上超出了这个范围,则出错。 jmp short n_jump,4)TYPE 操作符,TYPE 名字/标名 返回与名字或标号类型相关的数值 对字节、字和双字变量分别返回1、2和4; 对短、近和远转移分别返回ff01h、ff02h和ff05h。 mov ax, TYPE w_var ;汇编结果为mov ax,2 mov ax, TYPE n_jump ;汇编结果为 mov ax,0ff02h(near标号) 操作符SIZE返回整个变量占用的字节数 操作符LENGTH返回整个变量的数据项数(即元素数),2019/8/5,36,可编辑,8. 运算符的优先级,1 () LENGTH SIZE WIDTH MASK 2 PTR OFFSET SEG TPYE THIS : 3 HIGE LOW 4 * / MOD SHL SHR 5 + - 6 EQ NE GT LT GE LE 7 NOT 8 AND 9 OR XOR 10 SHORT,5.2 伪指令,一、符号定义伪指令,1、EQU(等值语句) 将表达式值赋予名字,一经定义不能重复。 例如: CR EQU 0DH ;常数 A EQU ASC - TABLE ;变量(事先已定义) STR EQU 64 1024 ;数值表达式 ADR EQU ES:BP + DI + 5 ;地址表达式,功能同 EQU ,但可重新定义一个符号。 例如: COUNT = 100 同 COUNT EQU 100 CONNT = 57 COUNT重新定义,2、等号语句 =,二、内存数据(变量)定义伪指令,定义一个变量的类型,给内存单元赋初值,或者分配、预留内存单元 分为以下几类: DB 定义字节伪指令 DW 定义字伪指令 DD 定义双字伪指令 DF 定义3 字伪指令 DQ 定义4 字伪指令 DT 定义10字节伪指令,1、定义字节变量(Define Byte),DB 伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值 初值表中每个数据一定是字节量,存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也可以是字符串常数,定义字节变量实例:,;数据段 X db a,-5 db 2 dup(100),? Y db ABC,字节变量的应用,X db a, -5 db 2 dup(100), ? Y db ABC mov al,X ;此处X表示它的第1个数据,故ALa dec X+1 ;对X为始的第2个数据减1,故成为6 mov Y,al ;现在Y这个字符串成为 aBC,符号地址,变量初值,初值表,2、定义字变量(Define Word),DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值 初值表中每个数据是字量,一个字单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数,定义字变量实例:,;数据段 count dw 8000h,?,AB maxint equ 64h number dw maxint array dw maxint dup(0),字变量和字常量的应用,字变量和字常量的定义: WNUM EQU 5678H ;定义WNUM为常量 COUNT DW 20H ;定义COUNT为变量,假设它在数据段 ;的偏移地址为10H,20H为其中存放的 ;初始化数据 字变量和字常量的应用: MOV AX,BX+SI+WNUM MOV AX,BX+SI+5678H MOV AX,COUNT MOV AX,0010H LEA BX,COUNT LEA BX,0010H MOV BX,OFFSET COUNT MOV BX,0010H,3、定义双字变量(Define Double word),DD 伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量: 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 vardd DD 0,?,12345678h farpoint DD 00400078h,4、其他数据单元定义伪指令,定义3字伪指令DF用于为一个或多个6字节变量分配空间及初始化。 6字节常用在32位CPU中表示一个48位远指针(16位段选择器 : 32位偏移地址)。 定义4字伪指令DQ用于为一个或多个8字节变量分配空间及初始化。 8字节变量可以表达一个64位整数。 定义10字节伪指令DT用于为一个或多个10字节变量分配空间及初始化。 10字节变量可以表达长双精度(long double)浮点数。,5. 变量的应用,变量具有存储单元的逻辑地址属性 程序代码中 通过变量名可直接存取其所指向的首个数据 X db a, -5 mov al, X ;X a 通过变量名加减位移量可存取以改变量地址为基地址的前/后数据 mov al, X+1 ;X -5,变量的定义示例:,;数据段 bvar1 db 100, 01100100b, 64h, d ;字节变量:不同进制表达同一个数值,内存中有4个64H minint = 5 ;符号常量:minint 数值为 5,不占内存空间 bvar2 db -1,minint,minint+5 ;内存中数值依次为 FFH, 5, 0AH db ? , 2 dup(20h) ;预留一个字节空间,重复定义了2个数值 20H wvar1 dw 2010h, 4*4 ;字变量:两个数据是 2010H、0010H,共占4个字节 wvar2 dw ? ;wvar2是没有初值的字变量,变量的定义示例(续):,dvar dd 12347777h,87651111h,? ;双字变量:2个双字数据,一个双字空间 abc db a,b,c,? ;定义字符,实际是字节变量 maxint equ 0ah ;符号常量:maxint10 string db ABCDEFGHIJ ;定义字符串:使用字节定义DB伪指令 crlfs db 13,10,$ ;回车符0DH、换行符0AH和美元符$24H array1 dw maxint dup(0) ;10个初值为0的字量,可以认为是数组 array db 2 dup(2,3,2 dup(4) ;6个字节内容依次为:02 03 04 04 02 03 04 04,三、定位伪指令,汇编程序按照指令的先后顺序一个接着一个分配存储空间,按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置(包括偏移地址) 定位伪指令ORG控制数据或代码所在的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如: ORG 100h ;从100H处安排数据或程序 ORG $+10 ;偏移地址加10,即跳过10个字节空间 汇编语言程序中,符号“$”表示当前偏移地址值,四、段定义伪指令,段名 segment 定位 组合 段字 类别名 . ;语句序列 段名 ends,完整段定义由SEGMENT和ENDS这一对伪指令实现,前者定义一个逻辑段的开始,后者表示一个段的结束。 段定义指令后的 4 个关键字用于确定段的各种属性, 堆栈段要采用 stack 组合类型, 代码段应具有code类别,其他为可选属性参数。 如果不指定,则采用默认参数;但如果指定,注意要按照上面的属性顺序。,完整段定义格式示例:,stack segment stack dw 512 dup(?) ;设置堆栈 stack ends data segment . ;在数据段定义数据 data ends code segment code assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax . ;在代码段填入指令序列 mov ax,4c00h int 21h code ends end start,1、段定位(align)属性,指定逻辑段在主存储器中的边界,可为: BYTE 从下一个可用的字节地址(xxxx xxxxb)开始段 WORD 从下一个可用的偶数地址(xxxx xxx0b)开始段 DWORD 从下一个可用的模4地址(xxxxxx00b)开始段 PARA 从下一个可用的模16地址(xxxx 0000b)开始段 PAGE 从下一个可用的模256地址(0000 0000b)开始段 简化段定义伪指令的代码段和数据段默认采用WORD定位,堆栈段默认采用PARA定位。 完整段定义伪指令的默认定位属性是PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始。,2、段组合(combine)属性,指定多个逻辑段之间的关系,可为: PRIVATE本段与其他段没有逻辑关系,不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式。 PUBLIC连接程序把本段与所有同名同类型的其他段相邻连接,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。这是简化段定义伪指令默认的段组合。 STACK本段是堆栈的一部分,连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合。 还有“COMMON”和“AT 表达式”,这两者不常使用。,3、段字(use)属性,为支持32位段而设置的属性。 对于16位x86 CPU来说,它默认是16位段,即USE16。 在汇编32位x86 CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定标准的16位段。 编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。,4、段类别(class)属性,当连接程序组织段时,将所有的同类别段相邻分配。 段类别可以是任意名称,但必须位于单引号中; 大多数MASM程序使用 code 代码段 data 数据段 stack 堆栈段 来分别指示代码段、数据段和堆栈段,以保持所有代码和数据的连续。,5、指定段寄存器伪指令,ASSUME 段寄存器:段名 ,段寄存器名:段名, .,通知 MASM 用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。 在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是 ASSUME 伪指令的主要功能。 ASSUME伪指令并不为段寄存器设定初值,连接程序LINK 将正确设置CS : IP 和 SS : SP。 由于数据段通常都需要,所以在样板源程序中,首先为DS 赋值;如果使用附加段,还要赋值ES。,6、段组伪指令,组名 GROUP 段名,段名,.,把多个同类段合并为一个64KB物理段,并用一个组名统一存取它。 定义段组后,段组内各段就统一为一个段地址,各段定义的变量和标号的偏移地址就相对于段组基地址计算。 offset操作符取变量和标号相对于段组的偏移地址,如果没有段组则取得相对于段的偏移地址。 offset后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址。,五、过程定义和子程序编写,汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下: 过程名 PROC NEAR|FAR ;过程体 过程名 ENDP 可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性 NEAR 属性(段内近调用)的过程只能被同一代码段的其他程序所调用 FAR 属性(段间远调用)的过程可以被相同或不同代码段的程序所调用,子程序编写注意事项,子程序要用过程定义伪指令声明 主程序执行CALL指令后调用子程序,子程序利用RET指令返回主程序 堆栈操作子程序中对堆栈操作(压入/弹出)要匹配使用,以保持堆栈的平衡 现场的保护和恢复子程序首部应保护要用到的寄存器(内容),子程序返回前需进行相应恢复 子程序的位置子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(即返回DOS的指令之后、结束汇编的END伪指令之前),也可以放在主程序开始执行之前的位置,SOFDLY PROC PUSH BX PUSH CX MOV BL , 10 DELAY: MOV CX , 2801 WAIT: LOOP WAIT DEC BL JNZ DELAY POP CX POP BX RET SOFDLY ENDP,例5.1:一个延迟100 ms 的子程序,程序开始,为了指明程序开始执行的位置,需要使用一个标号(例题中采用了start 标识符) 连接程序会根据程序起始点正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值 连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值 大多数程序需要数据段,程序的执行开始应是: start: mov ax,data ;data表示数据段的段地址 mov ds,ax ;设置DS,六、源程序结束伪指令,汇编结束表示通知汇编程序结束工作,即将源程序翻译成目标模块代码的过程结束。 源程序的最后必须有一条END伪指令 END 标号 可

温馨提示

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

评论

0/150

提交评论