880 likes | 1.04k Views
第四章 汇编语言程序格式. 4.1 汇编程序功能 4.2 伪操作 4.3 汇编语言程序格式 4.4 汇编语言程序的上机过程. 检查源程序,测出语法错误 产生目标程序、列表程序等 扩展宏指令. 4.1 汇编程序的功能. 连接目标文件、库件和其它目标文件. 翻译. 目标代码文件 . BOJ. 连接程序 LINK. 汇编语言 源文件( . ASM ). 汇编程序 ( MASM 或 ASM ). 列表文件 .LST. 交叉索引文件 .CRF. . EXE 文件. 编辑程序 输入. 可直接执行. EDIT 、 PE 、 ED…….
E N D
第四章 汇编语言程序格式 4.1 汇编程序功能 4.2 伪操作 4.3 汇编语言程序格式 4.4 汇编语言程序的上机过程
检查源程序,测出语法错误 • 产生目标程序、列表程序等 • 扩展宏指令 4.1 汇编程序的功能 连接目标文件、库件和其它目标文件 翻译 目标代码文件.BOJ 连接程序 LINK 汇编语言 源文件(.ASM) 汇编程序 (MASM或ASM) 列表文件.LST 交叉索引文件.CRF .EXE 文件 编辑程序 输入 可直接执行 EDIT、PE、ED……
汇编程序的功能: 汇编程序对源程序进行两遍扫视 1、检查源程序 2、测出源程序中的语法错误,并给出错误信息。 3、产生目标程序,也可给出列表程序和交叉索引程序 4、扩展宏指令
伪指令语句格式 , 标号名 伪指令 操作数 ;注释 常数 字符串 常量名 变量名 标号 专用符号(如BYTE、FAR…) 没有冒号! 常量名 变量名 过程名 结构名 记录名等 4.2 伪操作(伪指令) 完成处理器选择、定义程序模块、定 义数据、分配存储区、指示程序结束等
4.2.1 处理器选择伪操作 缺省值 . 8086 ;选择8086指令 . 286 ;选择80286指令 . 286P ;选择8086指令 . 386 ;选择保护方式下的80286指令 . 386P ;选择保护方式下的80386指令 . 486 ;选择80486指令 . 486P ;选择保护方式下的80486指令 . 586 ;选择Pentium指令系统 . 586P ;选择保护方式下的Pentium指令系统
注意: 开始的段名与结 束的段名必须相 同,段的长度不 能超过64KB, SEGMENT后面 的参数是可选的 4.2.2 段定义伪操作 1、完整的段定义伪指令 SEGMENT 段开始语句 段定义的一般格式: <段名> SEGMENT [定位类型][组合类型][使用类型][‘类别’] … 段结束语句 <段名> ENDS 例:一个简单的程序段 CODE SEGMENT …… MOV AX,0 …… CODE ENDS
① 定位类型(align_type) 定位类型指出了对当前段起始地址的要求,有4个选项 PAGE ——指定起始地址的低8位是0,即其值能被256整除(称页边界) PARA ——指定起始地址的低4为是0,即其值能被16整除(称段边界) WORD——指定起始地址的最低位是0,即其值能被2整除(称为字边界) BYTE ——指定起始地址是任意值 DWORD——其值能被4整除(双字边界) 缺省定位 定位类型是用来确定程序段与程序段之间的衔接,如BYTE 使得当前段紧接前一段,而PAGE可能导致最大的段间隔
② 组合类型(combine_type) 一个源程序至少有一个堆栈段 组合类型告诉连接程序本段可按某种方式连接 PUBLIC——告诉连接程序本段与其它同名同类别 的段连接起来,公用一个起始点。 STACK ——表示是堆栈段,组合类型同上。 NONE ——表示本段不与任何段连接。 COMMON—表示本段与同名同类别的段共用同一段地址, 即同名同类段相重叠。 MEMORY—本段连接时定位在所有段之上,即高地址处。 AT 表达式—表示本段定位在表达式值指定的段地址处。 隐含组合类型 返回
③ 使用类型(use_type) 缺省值 段长度不超过64KB USE16 使用16位寻址方式 USE32 使用32位寻址方式 段长度不超过 4GB
… SSEG SEGMENT PARA STACK DB 1024 DUP(?) SSEG ENDS ; DSEG SEGMENT PARA COMMON MESS DB ‘HELLO’,0DH,0AH,’$’ DSEG ENDS ; CSEG SEGMENT PARA PUBLIC … CSEG ENDS END START ③ ‘类别名’ 类别名是由程序员指定的字符串,没有给出类别时, 这个段的类别就为空。 例:某个源程序
CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG1,ES:DSEG2 MOV AX,DSEG1 MOV DS,AX MOV AX,DSEG2 MOV ES,AX … … CSEG ENDS … 例:DSEG1 SEGMENT VARW DW 12 … DSEG1 ENDS ; DSEG2 SEGMENT XXX DW 0 YYY DW 0 DSEG2 ENDS ; • 段寄存器说明伪指令ASSUME 格式:ASSUME 段寄存器:段定义名1[,段寄存器:段定义名2,…] 功能:告诉汇编程序在汇编时,段寄存器的符号基址
1、程序(模块)开始伪指令 格式:NAME 模块名 2、程序( 模块)结束伪指令 格式:END [启动标号] 功能:告诉汇编程序源文件结束,并给出执行程 序的入口地址 4.2.3 程序开始和结束伪指令
3、 列表伪指令 格式: TITLE 标题 ;为列表文件每页第一行定义标题 SUBTTL 小标题 ;为列表文件每页定义小标题,大标题之后 PAGE 行数,行字数;为列表文件定义每页行数,每行字符数。 缺省值是66行,80列 NAME、TITLE伪指令不是每个程序必须的, 视需要而选择
高 06 × 06 × VARW→ 24 0A 0D 低 COUNT→ 64 4.2.4 数据定义及存储器分配伪操作 1、DB定义字节伪指令 格式:[名字] DB <表达式或数据项表> 功能:表达式值或项表中的每一项是一个字节数, 它们从符号名地址开始按字节连续存放。 例:COUNT DB 100 DB 0DH,0AH,’$’ VARW DB ?,6,?,2*3 可以使用重复操作符DUP如: BUFFER DB 8 DUP(0)
高 × × 00 24 汇编后对应的存储区域分配情况 2F FLAG→ CD 低 2、 DW定义字伪指令 格式:[名字] DW <表达式或数据项表> 功能:表达式值或项表中的每一项是一个字数, 它们从符号名地址开始按字连续存放。 例:FLAG DW 2FCDH,24H DW ?
4、 DQ定义八字节伪指令(4字) 格式:[名字] DQ <表达式或数据项表> 功能:表达式值或项表中的每一项是八个字节数,它们 从符号名地址开始按八字节从低地址连续存放。 386以后 6、DF定义6字节伪指令 3、 DD定义四字节伪指令(双字) 格式:[名字] DD <表达式或数据项表> 功能:表达式值或项表中的每一项是四个字节数,它们 从符号名地址开始按四字节从低地址连续存放。 5、 DT定义10字节伪指令指令
00 00 FF AAA→ FD 03 02 高 03 02 ARRAY→ 汇编后的内存分配情况 → × × 01 00 WORD_D→ 10 低 DAT→ 0A 例: DAT DB 10,10H WORD_D DW 100H,? ARRAY DB 2 DUP(2,3) AAA DD 0FFFDH DUP可以嵌套如: ARRAY DB 100 DUP(0,2 DUP(1,2),3)
DB——1 DW——2 DD——4 DQ——8 DT——10 类型属性 语法错误 类型不匹配 MOV AX,DAT1 MOV BL,DAT2 • 变量的类型属性(type attribute) 符号地址(变量) 类型是字节BYTE DAT1 DB 1,5,? DAT2 DW 1234H,? …… 类型是字WORD
例: DAT1 DB 1,5,? DAT2 DW 1234H,? …… MOV AX,WORD PTR DAT1 MOV BL,BYTE PTR DAT2 • 属性操作符 BYTE、WORD DWORD、 NEAR、FAR等 1、PTR 格式: type PTR expression 功能:给已分配的存储器地址赋予另一种属性 ;(AX)=0501H ;(BL)=34H
4.2.5 表达式赋值伪指令EQU 表达式可以是常数、数值表达式、字符串、存储器符号等 1、赋值语句EQU 格式:<符号名> EQU <表达式> 功能:用符号来代表表达式的内容 例:COUNT EQU 100 ;符号COUNT代表常数100 BUFF EQU 4*COUNT ;BUFF代表400 HELLO EQU “How are you! ” ;HELLO代表How are you VARW EQU THIS WORD ;变量VARW的类型是字 注意:EQU赋值语句的符号名不能被重新赋值
例:ABCD = 100 YY = 20+300/4 ABCD = 2*ABCD+1 可以重新赋值 2、 =等号赋值语句 数值表达式 格式:<符号名> = <表达式> 功能:用符号来代表表达式的数值
高 × × × 满足条件后要执行的指令 例: JNE $+4 × × 4 × 06 74 低 × 4.2.6 地址计数器与对准伪指令 1、地址计数器 $ 汇编语言用符号“$”表示地址计数器的值
例2:“$”在伪指令中的应用 DAT SEGMENT DATA1 DB 1,2,3,4,5 CNT1 EQU $-DATA1 DATA2 DW 1,2,3,4,5 CNT2 EQU ($-DATA2)/2 DAT ENDS CNT1、CNT2的值分别为DATA1、DATA2中数据元素的个数
00 0023H 0022H 0021H 0020H 例: 06 DAT SEGMENT ORG 10H BUF DB 3,4 ORG 20H ARRY DW 5,6 DAT ENDS …… 00 ARRY→ 05 …… …… 04 0011H 0010H 03 BUF→ 2、ORG 伪指令 格式:ORG <数值表达式> 功能:把以下语句定义的内存数据或程序,从表达式 指定的起点开始连续存放。
00 高 05 00 04 00 DAT SEGMENT BUF DB 1,2 CONT DB 2 EVEN ARRY DW 3,4,5 DAT ENDS …… 例: ARRY→ 03 × CONT→ 02 02 低 01 BUF→ 3、EVEN对准伪指令 格式:EVEN 功能:使下一个字的地址从偶地址开始
后面可以不跟H 例:.RADIX 16 MOV AX,0FA4 MOV BX,100D … 后面必须跟D,表示 十进制数 4.2.7 基数控制伪指令 格式:.RADIX 表达式 功能:改变默认进制数
指令助记符 伪指令助记符 宏指令助记符 4.3 汇编语言程序格式 , 名字项 操作项 操作数项 ;注释项 标号: 变量 常数 寄存器 标号 变量 表达式 用来说明 某段程序 的功能或 说明某条 指令的功 能。
1、 算术操作符 +、-、*、/、MOD(除法取余) 算术操作符 可用于数字 表达式或地 址表达式 例: DAT SEGMENT ARRY DW 1,2,3,4,5 DEND DW ? DAT ENDS …… MOV CX,(DEND-ARRY)/2 MOV AX,100*4+5;AX=405 …… 表达式计算出了数组长度5 表达式:是由常数、寄存器、标号、变量和 一些操作符组成的式子 有五种操作符
3、 关系操作符 关系运算结果总是 一个数值若关系不 成立,则结果为0若 关系成立,则结果 为0FFFFH EQ、NE、LT、LE、GT、GE 例:MOV AX,1234H GT 1024H MOV AX,0FFFFH 按位运算 2、 逻辑与移位操作符 AND、OR、NOT、XOR SHL、SHR 只用于数字运算 例: 24H OR 0FH=2FH ORG 40H SHL 2 100H
例: ARRY DW 1,2,3 …… ADD SI,TYPE ARRY …… 汇编后 ADD SI,2 操作符 4、数值回送(Value_returning)操作符 DB为1 DW为2 DD为4 DQ为8 DT为10 变量如果 是标号 NEAR为-1 FAR为-2 TYPE、LENGTH、SIZE、OFFSET、SEG (1)TYPE 回送类型值 格式:TYPE expression 功能:汇编程序将变量的类型以字节数回送
(2) LENGTH 回送DUP分配给变量的单元数 格式:LENGTH Variable 功能:汇编程序将变量使用DUP的情况回送,没使用DUP 回送1 例: FEES DW 100 DUP(1,2) ARRY DW 1,2,3 …… MOV CX,LENGTH FEES MOV BX,LENGTH ARRY …… 汇编后 MOV CX,100 汇编后 MOV BX,1
(3)SIZE 回送分配给变量的字节数 格式:SIZE Variable 功能:汇编程序回送分配给变量的字节数 例: FEES DW 100 DUP(0) ARRY DW 1,2,3 …… MOV CX,SIZE FEES MOV BX,SIZE ARRY …… 汇编后 MOV CX,200 汇编后 MOV BX,2
(4)OFFSET 回送变量或标号的偏移地址值 格式:OFFSET Variable 或 label 功能:汇编程序将变量或标号的偏移地址以立即数回送 例: FEES DW 100 DUP(1,2) ARRY DW 1,2,3 …… MOV BX,OFFSET ARRY …… 相当于 LEA BX,ARRY
(5)SEG 回送变量或标号的段地址值 格式:SEG Variable 或 label 功能:汇编程序将变量或标号的段地址以立即数回送 例: DAT SEGMENT ARRY DW 1,2,3 DAT ENDS CSEG SEGMENT ASSUME DS:DAT,CS:CSEG MOV AX,DAT MOV DS,AX MOV BX,SEG ARRY …… ( BX)=(DS)
例: DAT1 DB 1,5,? DAT2 DW 1234H,? …… MOV AX,WORD PTR DAT1 MOV BL,BYTE PTR DAT2 5、属性操作符 PTR、段操作符、SHORT、THIS、HIGH、LOW、 HIGHWORD、LOWWORD BYTE、WORD DWORD、 NEAR、FAR等 (1) PTR 格式: type PTR expression 功能:给已分配的存储器地址赋予另一种属性 ;(AX)=0501H ;(BL)=34H
物理地址 (DS)*16+EA 例: MOV AX,[BX+SI] MOV AX,ES:[BX+SI] 物理地址: (ES)*16+有效地址 段操作符 (2) 段操作符 格式: 段寄存器名直接加在地址操作数前面以说明所在段 功能:用来表示一个变量、标号或地址表达式的段属性
(3)SHORT 格式: SHORT 标号 功能:用来修饰 JMP 指令中转向地址的属性,转向 地址在下一条指令地址的±127个字节范围内 例: …… JMP SHORT TAG …… TAG: …… ……
(4)THIS 指定新类型 格式: THIS attribute 或 type 功能:为某个符号名建立新类型,并 下一个地址单元的地址相同 × …… 例: FIRST EQU THIS BYTE TABLE DW 100 DUP(?) …… × 字变量 × 字节变量 × FIRST→ TABLE→ ×
(5)HIGH和LOW 分离操作符 格式: HIGH 表达式 功能:接收一个数或地址表达式的高位字节 格式: LOW 表达式 功能:接收一个数或地址表达式的低位字节 例: CONST EQU 0ABCDH MOV AL,HIGH CONST MOV AH,LOW CONST 汇编后 MOV AL,0ABH MOV AH,0CDH
例: CONST EQU 0ABCD1234H MOV AX,HIGHWORD CONST MOV BX,LOWWORD CONST 汇编后: MOV AX,0ABCDH MOV BX,1234H (6)HIGHWORD和LOWWORD 分离操作符 格式: HIGHWORD 表达式 功能:接收一个数或地址表达式的高位字 格式: LOWWORD 表达式 功能:接收一个数或地址表达式的低位字
汇编运算符的优先级 括号 LENGTH、SIZE PTR、OFFSET、SEG、TYPE、THIS、段操作符 HIGH、LOW *、/、MOD +、- EQ、NE、LT、LE、GT、GE NOT AND OR、XOR SHORT
4.4 汇编语言程序的上机过程 4.4.1 建立汇编语言的工作环境 EDIT.COM 或 PE.COM 或 …… ASM.EXE 或 MASM.EXE LINK.EXE DEBUG.COM EXE2BIN.EXE 宏汇编 小汇编 不支持 宏指令
EDIT 文件名.ASM↙ 文件扩展名 或文件类型 MOVS 4.4.2 建立ASM文件 例:请把40个字母a的字符串从源缓冲区传送 到目的缓冲区
4.4.3 用MASM程序产生OBJ文件 MASM 文件名↙ 或 MASM 文件名;↙ 4.4.4 用LINK程序产生EXE文件 LINK 文件名;↙ 4.4.5 程序的执行 文件名↙
说明: 地址:由段值和偏移两部分组成。如CS:100,段值可以省略 范围:有两种表示方法,一种是用起始地址和结束地址如CS:100 110, 另一种用起始地址和长度表示。如CS:100 L10 DEBUG程序命令(1) DEBUG中所写入的数, 直接就是十六进制数 • A命令(汇编命令) • 格式:A [ 地址] • 功能:从指定地址把编语言语句直接汇编入内存 2. D命令(显示命令) 格式:D [ 地址] 或 D [ 范围] 功能:从指定地址开始显示内存中40字节的内容, 或显示指定范围的内容
DEBUG程序命令(2) 没有指定,从当前IP开始 • G命令(执行命令) • 格式:G [=起始地址][断点地址表] • 功能:从当前地址或指定地址执行遇到断点停止执行 • R命令(寄存器命令) • 格式:R ;显示所有寄存器的内容 • R 寄存器名 ;显示并可修改寄存器的内容 • RF ;显示并可修改标志寄存器的内容 • Q命令(停止命令) • 格式:Q • 功能:退出DEBUG程序,不保存内存中调试的文件
DEBUG程序命令(3) • T命令(跟踪命令) • 格式:T [=地址][数值] • 功能:从当前地址或指定地址执行一条或指定的条数指令 • 并显示各寄存器的内容及下一条要执行的指令 • U命令(反汇编命令) • 格式:U [范围] 或 U [地址] • 功能:把指定范围的内容反汇编或从指定地址开始反汇 • 编16条
缺省方式,以源文件名为目标文件名,无列表文件;无交叉索引文件缺省方式,以源文件名为目标文件名,无列表文件;无交叉索引文件 2. 汇编程序 MASM 文件名;回车 如果有语法错误,用EDIT修改源文件 4. 执行程序 文件名 回车 如果执行程序有错,进入第5步 进入了DEBUG调试状态 3. 程序连接 5. 调试程序 LINK 文件名;回车 DEBUG 文件名. EXE 回车 上机步骤: 1. 编辑程序 在DOS方式下 EDIT 文件名.ASM 回车 输入程序 存盘
第五章 循环与分支程序设计 5.1 循环程序设计 5.2 分支程序设计 5.3 如何在实模式下发挥80386及 后继机型的优势
DOS系统功能调用 DOS 系统功能调用的方法: 1、在AH寄存器中存入所要调用功能的功能号 2、根据所调用功能的规定设置入口参数 3、用INT 21H 指令转入子程序入口 4、取出口参数归己用