汇编语言08
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12 12
DD1 10
12
PARA
DA2 13 DD2 20H
13
STA1 40H STA2 60H CODE
ASSUME伪指令:指定当前段
格式:
ASSUME
段寄存器名:段名,…..段寄存器名:
段名 例: ASSUME cs:CODE, ds:DATA
在程序运行过程中,可重新设置当前段, 也可以删除原有的设置
CODE SEGEMNT ASSUME CS:CODE,SS:STACK1
START: ……
…… CODE ENDS
END START
定位伪指令
汇编程序按照书写硬指令和伪指令的先 后顺序,一个接着一个分配存储空间, 按照段定义伪指令规定的边界定位属性 确定每个逻辑段的起始位置(包括偏移 地址)。 可以利用定位伪指令控制数据或代码所 在的偏移地址。 伪指令有:ORG,EVEN和ALIGN,它们可在 数据段使用,也可在代码段使用。
操作系统自动实现: STACK DB STACK SEGMENT STACK 200 DUP(?) ENDS
CODE ASSUME
SEGMENT CS:CODE,SS:STACK
3、CS与IP的装入
用结束伪指令:每个源 程序都必须以END伪指 令结束: 一般写在代码段之后。 END 起始地址(标号)
…… ;语句序列
段名 ENDS MEMORY 定位于所有段之上 表示本段定位在所有其它段的最高地址
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
USE16 / USE32 选择用16/32位cpu指令 缺省 USE 16
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
例1 程序经常需要用DOS的2号功能调用 显示一个字符,可以利用宏: dispchar macro char
; 定义宏,宏名dispchar,带有形参char
mov ah,2 mov dl,char ;; int 21h endm ; 宏定义结束
宏定义中使用参数
宏定义中的注释如果用两个分号分隔, 则在后面的宏展开中将不出现该注释。
2、设置标号距离属性的方法 1)隐含方式:在指令语句中使用标号后,其隐 含为NEAR属性 SUB1: MOV AL,30H ;SUB1具有NEAR属性 ;该方式定义的标号只能具备NEAR属性
2)用LABEL伪指令赋予标号距离属性 名称 LABEL 类型
标识符 标号 变量 NEAR/FAR BYTE/WORD
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
COMMON 覆盖段 产生一覆盖段,两个同名段起始地址相 同,用较长的段覆盖较短的段
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
STACK 堆栈段 把所有的同类别段连接在一起,段基值→SS, 且自动为SP初始化。在一个程序中一般应该有一 个堆栈段。
EVEN ;使它后面的数据或指令从偶地址开始 ALIGN n ;使它后面的数据或指令从n的整数倍地址开始
DATA
DD1
DATA
SEGMENT ORG 30H DB1 DB 12H,34H ORG $+20H STR DB ‘ABC’ CNT EQU $-STR EVEN DW1 DW 20H DUP(0) DATA ENDS …… CODE SEGMENT ASSUME CS:CODE,DS:DATA ORG 10H START:MOV AX,DATA MOV DS,AX …… CODE ENDS END START
CODE
SEGMENT PARA ‘DATA’ DB 10 DUP(12H) ENDS SEGMENT STACK ‘STACK0’ DW 20H DUP(?) ENDS SEGMENT PARA ‘DATA’ DB 20H DUP(13H) ENDS SEGMENT STACK ‘STACK0’ DW 30H DUP(?) ENDS SEGMENT …… ENDS
例2 例程序经常需要输出一段信息,该 程序段也可以定义成宏: dispmsg macro message mov ah,9 mov dx,offset message int 21h endm
Hale Waihona Puke Baidu
2 宏调用
宏定义之后就可以使用它,即宏调用。 宏调用遵循先定义后调用的原则,格式 为: 宏名 [实参表] 可见,宏调用的格式同一般指令一样, 在使用宏指令的位置写下宏名,后跟实 体参数;如果有多个参数,应按形参顺 序填入实参,用逗号分隔。
当前偏移地址: 在汇编语言程序中,符号“ $”表示当前偏移值。 ORG 参数 ;使它后面的数据或指令从参数指定的偏移地址 开始 ORG伪指令是将当前偏移地址指针指向参数表达 的偏移地址。 例:ORG 100h ;从100H处安排数据或程序 ORG $+10 ;使偏移地址加10,即跳过10个字节空间
3.6
过程定义伪指令
在汇编语言中,子程序(Subroutine) 要用过程(Procedure)伪指令定义。 过程声明由一对过程伪指令PROC和ENDP 完成,格式如下: 过程名 PROC [NEAR|FAR] …… ;过程体 过程名 ENDP 缺省是NEAR
3.7 条件汇编
IF 表达式 语句段1 ELSE 语句段2 ENDIF
例: CPU = 386 … IF (CPU =386) USER 32 ELSE USER 16 ENDIF
IF 表达式1 语句段1 ELSEIF 表达式2 语句段2 ELSEIF 表达式3 语句段3 … ENDIF
IF 表达式 IFE 表达式 IFDEF 符号 IFNDEF 符号 …
表达式的值不等于0 表达式的值等于0 符号已经定义 符号未定义
…… ;语句序列
段名 ENDS 当连接程序组织段时,将所有的同类别段相邻分配 段类别可以是任意名称,但必须位于单引号中
大多数MASM程序习惯使用 'code'、'data'和 'stack’来分别指名代码段、数据段和堆栈段,以 保持代码和数据的连续
DA1
DA1 DD1 DA1 STA1
STA1 DA2 DD2 DA2 STA2 STA2 CODE
汇编语言课件09 MASM语法(3)
宏汇编
宏(Macro)是汇编语言程序设计当中颇 具特色的一个方面,微软就称其汇编程序为 宏汇编程序(Macro Assembler,M ASM)。 利用宏的特性,可以使程序员编写的源程序 更加灵活方便、提高工作效率。
宏是具有宏名的一段汇编语句序列。 宏需要先定义,然后在程序中进行宏调 用。由于形式上类似其它指令,所以常 称其为宏指令。与伪指令主要指示如何 汇编不同,宏指令实际上是一段代码序 列的缩写;在汇编时,汇编程序用对应 的代码序列替代宏指令。因为是在汇编 过程中实现的宏展开,所以常称为宏汇 编。
该伪指令一般与指令语句/数据定义伪指 令连用,以补充或设置与值连用的标号/变 量的距离/类型属性
SUB1_FAR SUB1:
LABEL FAR MOV AL,30H
标识符SUB1_FAR、 SUB1均为指令的符号地址它 们具有相同的SEG 、OFFSET属性,但Distance属性 不同
段间转移/调用: SUB1_FAR 段内转移/调用: SUB1
JMP SUB1 JMP SUB_FAR ;都是合法的跳转指令,程序将无条件的 转到标号处执行,但处理不同。
JMP SUB1:程序将SUB1的偏移送IP JMP SUB_FAR :程序将SUB_FAR的偏移送IP,它的段地
址SEG送CS。
LABEL也可以用于变量前,以适合不同需要 D_BYTE LABEL BYTE D_WORD DW 20H DUP(?)
…… ;语句序列
段名 ENDS
组合部分为下列之一: NONE 独立段(缺省) PUBLIC 连续段 COMMON 覆盖段 STACK 堆栈段 AT 表达式 定位于表达式指定的地址处 MEMORY 定位于所有段之上
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
ASSUME ES:NOTHING ES的设置
;删除对
• ASSUME只说明了哪些段为当前段,具体的段基 值并没有装入
1、DS与ES的装入 用ASSUME将DS/ES与相应的段建立联系后,用数据 传送指令 MOV AX,段名 MOV DS/ES,AX ;装入DS或ES 2、SS与SP的装入 可以自己写一段代码,也可以由操作系统负责自动 给初始化。
汇编语言课件08 MASM语法(2)
段定义伪指令
—完整段定义伪指令 格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS 其中:[ ]部分可以没有
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
AT 表达式 定位于表达式指定的地址处 表示本段定位在表达式所指示的节的边界上 例如: AT 0930H 表示本段的物理地址从09300H开始
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
1 宏定义
宏定义由一对宏汇编伪指令 MACRO和ENDM来完 成,其格式如下: 宏名 MACRO [形参表] …… ;宏定义体 ENDM 其中,宏名是符合语法的标识符,同一源程序 中该名字定义唯一。宏定义体中不仅可以是硬 指令序列,还可以是伪指令语句序列。宏可以 带显式参数表。可选的形参表给出了宏定义中 用到的形式参数,每个形式参数之间用逗号分 隔。
在汇编时,宏指令被汇编程序用对应的 代码序列替代,称之为宏展开。汇编后 的列表文件中带“+”或“ 1”等数字的 语句为相应的宏定义体。 宏展开的具体过程是:当汇编程序扫描 源程序遇到已有定义的宏调用时,即用 相应的宏定义体取代源程序的宏指令, 同时用位置匹配的实参对形参进行取代。
实参与形参的个数可以不等,多余的实 参不予考虑,缺少的实参对相应的形参 做“空”处理(以空格取代);另外汇 编程序不对实参和形参进行类型检查, 完全是字符串的替代,至于宏展开后是 否有效则由汇编程序翻译时进行语法检 查。
段名 ENDS
NONE 独立段(缺省): 本段与其它段没有连接关系,这是完整段 定义伪指令默认的段组合方式
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]
…… ;语句序列
段名 ENDS
PUBLIC 连续段 在满足定位关系的前提下,连接程序把本段 与所有同名段相邻地连接在一起,形成新的逻 辑段。(可在程序的不同位置及不同的文件中 使用段定义语句定义一个逻辑段)
D_BYTE 均为变量名,它们具有相同的 D_WORD D_BYTE : BYTE 属性,但TYPE属性不同 D_WORD: WORD MOV MOV MOV MOV AX, D_WORD; AX,D_BYTE; AL, D_BYTE; AL, PTR BYTE 正确 错误 正确,也可以用: D_WORD SEG OFFSET
30H
30H 12 34 DB1
20H 41H 42H 43H 00 00 STR
cnt=3
DW1 40H
标号的属性
标号是汇编语言语句的一部分,是用户 自定义的标识符。 标号指向一条硬指令。
段属性(SEG) 偏移量属性(OFFSET) 距离属性(Distance类型):表示标号的转移特性 1、类型: NEAR:本标号只能被标号所在段的指令访问(段内转 移、调用) FAR:可被其它段的指令访问(段间调用、转移)
表示对逻辑段起始边界的选择,可为: PAGE 段从一个页边界开始 (XXX00H) PARA 段节边界开始(XXXX0H)
DWORD
WORD BYTE
段从一个4倍数地址开始
段从一个偶地址开始 段可以从任意单元开始
完整段定义伪指令的默认定位属性是PARA
格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’]