250 likes | 332 Views
第四章8086汇编语言基础. 4.1 汇编语言的简介. 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 汇编程序设计的过程是与其他高级语言程序设计大致相同. 汇编语言源程序格式. 完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列
E N D
4.1 汇编语言的简介 • 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数 • 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序 • 在有些应用领域,汇编语言的作用是不容置疑和无可替代的 • 汇编程序设计的过程是与其他高级语言程序设计大致相同
汇编语言源程序格式 • 完整的汇编语言源程序由段组成 • 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 • 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 • 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 • 通常,程序还需要一个堆栈段 • 源程序由语句序列构成
汇编语言源语句格式 ⑴执行性语句——执行性语句用于表达处理器指令(也称为硬指令),汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体 标号:硬指令助记符 操作数,操作数;注释 ⑵说明性语句——说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等 名字 伪指令助记符参数,参数,…… ;注释
硬指令与伪指令 • 硬指令(Instruction)——使CPU产生动作、并在程序执行时才处理的指令 硬指令就是第2章学习的处理器指令,与具体的处理器有关、与汇编程序无关 • 伪指令(Directive)——不产生CPU动作、在程序执行前由汇编程序处理的说明性指令 伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令 • 硬指令和伪指令采用易于记忆的符合表达,这就是助记符
4.2 汇编语言的标记 • 标号是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔 • 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号 • 标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写 • 一个源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字
保留字(Reserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有: • 硬指令助记符——例如:MOV、ADD • 伪指令助记符——例如:DB、DW • 操作符——例如:OFFSET、PTR • 寄存器名——例如:AX、CS • 预定义符号——例如:@data • 汇编语言大小写不敏感
处理器指令的操作数可以是立即数、寄存器和存储单元处理器指令的操作数可以是立即数、寄存器和存储单元 • 伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔 • 语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性 • 必要时,一个语句行也可以由分号开始作为阶段性注释 • 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理
语句的4个组成部分要用分隔符分开 • 标号后用冒号,注释前用分号 • 操作数之间和参数之间使用逗号分隔 • 其他部分通常采用空格或制表符 • 多个空格和制表符的作用与一个相同 • MASM支持续行符 “\”
4.2 表 达 式 常量表示一个固定的数值,它又分 成多种形式 • 常数 • 字符串 • 符合常量 • 数值表达式
1.常数 • 指由10、16、2和8进制形式表达的数值,各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数
2.字符串 • 字符串常量是用单引号或双引号括起来的单个字符或多个字符 • 其数值是每个字符对应的ASCII码值 • 例如: ‘d’(等于64H) ‘AB’(等于4142H) ‘Hello, Assembly !’
3.符号变量 • 符号常量使用标识符表达一个数值 • MASM提供等价机制,用来为常量定义符号名 • 符号定义伪指令有“等价EQU”和“等号=”: 符号名 EQU数值表达式 符号名 EQU <字符串> ;MASM 5.x不支持 符号名 = 数值表达式 • EQU用于数值等价时不能重复定义符号名,但“=”允许有重复赋值。例如: X = 7 ;等效于:X qeu 7 X = X+5 ;“X EQU X+5”是错误的
4.数值表达式 • 数值表达式一般是指由运算符连接的各种常量所构成的表达式 • 汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量 • 表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定 • 汇编语言支持多种运算符(表3.4) • 我们经常使用的是加减乘除(+ - * / ) • 例如: mov ax,3*4+5 ;等价于:mov ax,17
变量 • 变量实质上是指内存单元的数据,虽然内存单元地址不变,但其中存放的数据可以改变 • 变量需要事先定义才能使用 • 变量定义(Define)伪指令为变量申请固定长度为单位的存储空间,并可以同时将相应的存储单元初始化 • 定义后的变量可以利用变量名等方法引用其中的数据,即变量的数值
地址操作符 • 地址操作符取得名字或标号的段地址和偏移地址
类型操作符 • 类型操作符对名字或标号的类型属性进行设置 类型名 PTR 名字/标号 • 其中可以是BYTE、WORD、DWORD(依次表示字节、字、双字)等,或者是NEAR、FAR(分别表示近、远),还可以是由结构、记录等定义的类型 • 对变量: • LENGTHOF操作符获知某变量名指向多少个数据项 • SIZEOF操作符获知它共占用多少字节空间
关系操作符 • ASM—86的关系运算符有: • 相等(EQ) • 不等(NE) • 小于(LT) • 大于(GT) • 小于等于(LE) • 大于等于(GE)
算术运算符 • 算术运算符有: 1. 加(+) 2. 减(-) 3. 乘(*) 4. 除(/) 5. 取余(MOD) 6. 右移(SHR) 7. 左移(SHL)
属性运算符 ASM—86的属性运算符有: 一、PTR 格式:类型 PTR 地址表达式 功能:临时指定由地址表达式所确定的 存储单元的类型属性。 二、SHORT 当指令“JMP目标地址”中的目标地址与该指令下一条指令之间的距离在-128~+127直接单元 范围内的时,可以用SHORT运算符来告诉汇编程序 将JMP指令会变成两个字节的代码:第一字节为操作码第二字节为相对位移量(补码)。 三、THIS 格式:THIS 类型 功能:指定变量或标号的类型。 四、段跨越前缀 格式:段寄存器:地址表达式或段名:地址表达式 功能:用来改变地址表达式的段属性。 五、关于方括号[]
关于方括号 在8086汇编语言中,方括号[]用于表示一个 地址,如[BX],[BP+2]、[DI+X1]等。使用规则 如下: 1、只有BX、BP、DI、SI寄存器可以出现在方 括号内。 2、常数和数值表达式不能单独出现在方括号内。 3、BX和BP不得同时出现在同一方括号内。 4、方括号中的寄存器之间仅能进行加法。
分离运算符 分离运算符有HIGH和LOW它们可用在字类型的操作数之前,以截取该字的高位字节或低位字节。如指令“MOV AH,HIGH 0ABCDH”等效于“MOV AH,0ABH”。
4.3 语句 汇编语言中有两类语句:指令性语句和指示性语句。 一、指令性语句: 标号;指令助记符 操作数;注释 二、指示性语句: 名称 伪指令 操作数;注释
4.4 伪 指 令 ASM—86的伪指令有20条,是向汇编程序发出的命令,常用的伪指令有: 段定义伪指令SEGMENT/ENDS,ORG,ASSUME 过程定义伪指令PROC/ENDP 定义访问外部标识符伪指令EXTRN、PUBLIC 源程序终结伪指令END 数据/存储器定义伪指令DB、DW、DD 符号定义伪指令EQU 给存储单元命名伪指令LABEL 确定变量/标号类型伪指令BYTE、WORD、DWORD、NEAR、FAR。 这些指令的功能我们在以后的学习过程中逐渐介绍。
4.4 小 结 本章主要内容小结和基本要求: (1)汇编语言是面向机器的语言,是机器语言的符号表示。 (2)汇编语言程序的语句可分为两类:指令性语言和指示性语言。 (3)本章重点掌握源程序中语句书写的格式及功能,同时,还要知道数据定义语所定义的数据在内存中的存放地址。