宏汇编语言
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通常,方式选择伪指令放在程序的头部,作为源程序 的第一条语句。不设置方式选择伪指令与设置 .8086 是等 价的。
1、方式选择伪指令
方式选择伪指令的格式和功能: .8086 .286或 .286C .286P .386或 .386C .386P .486或 .486C .486P .586或 .586C .586P ; 只汇编8086、8088指令; ; 只汇编8086、8088及80286实模式指令; ; 只汇编8086、8088及80286全部指令 ; ; 同.286,且汇编80386实模式指令; ; 同.286P,且汇编80386全部指令; ; 同.386,且汇编80486实模式指令; ; 同.386P,且汇编80486全部指令 ; ; 同.486,且汇编80586实模式指令; ; 同.486P,且汇编80586全部指令。
2、段定义语句
(3) 段长度 段长度是80386以后汇编语言新增加的段参数,只有高版 本的汇编器才识别。 ① USE 16 :表示该逻辑段长度最大64KB,单元偏移
地址16位,访问该逻辑段采用16位寻址方式。
② USE 32 :表示该逻辑段长度可以超过64KB,单元 偏移地址32位,访问该逻辑段采用32位寻址方式。 运行实地址模式下的程序若访问高于64KB的单元(偏移 地址大于FFFFH),必然引起系统异常中断,导致死机。
2、段定义语句
(1) 定位参数 定位参数通知链接程序,逻辑段的目标代码在存储器中如 何存放。 ① BYTE字节地址:表明该逻辑段的目标代码可以从任意地 址开始依次存放(因为存储器是以字节为基本单位组织的); ② WORD字地址:表示该逻辑段的目标代码,从偶地址开始 依次存放; ③ PARA(或者缺省)节地址:表示该逻辑段的目标代码, 从一个能被16整除的地址开始依次存放; ④ PAGE页地址:表示该逻辑段的目标代码,从一个能被256 整除的地址开始依次存放。
2、段定义语句
定位参数,链接参数,‘分类名’ 为段定义语句的3个属性参数,可以选用1~3个,也可以 全部省略。 属性参数的功能: 为源程序的汇编、链接提供必要的信息。 在大型程序开发中,常采用模块化方法。每个模块都有自 己的数据段、代码段等。各个模块独立编辑、汇编,最后链接 起来成为一个完整功能的执行文件。 定位参数、链接参数是用于说明模块如何定位,彼此之间 如何链接等。
2、段定义语句
(2) 链接参数 链接又称组合,链接参数通知链接程序如何将不同模块中 的同名逻辑段组合成一个段。 ① PUBLIC ② MEMORY ③ COMMON ④ STACK ⑤ AT表达式 ⑥ 缺省:表明该段是一个独立的逻辑段,链接程序对于 不同模块中,链接参数缺省的同名段,不进行组合。
应用举例
.486 DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS CODE BEG: ; 方式定义 ; 定义数据段
CS
LAST:
CODE
SEGMENT USE16 ; 定义代码段 ASSUME CS:CODE, DS:DATA ; 说明段约定 MOV AX, DATA ; BEG为启动地址 MOV DS, AX MOV CX, 10 MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH, 4CH INT 21H ; 返回DOS ENDS END BEG ; 汇编结束
2、段定义语句
链接程序要求,最终生成EXE文件的汇编源程序,必须有 堆栈段,否则链接时发出警告信息: Warning no stack segment 但是这行信息仅仅是提醒用户注意,并不代表程序错误。
注意: 模块化程序设计中才会用到链接参数。 注意: 链接程序对于不同模块中的同名段进行链接时,对于有 BYTE属性的段,总是紧接着前一段存放,不留空闲单元。 对于有WORD属性的段,也是紧接前一段存放,最多留出 一个空闲单元。
通知汇编程序,源程序到此结束,且说明用BEGIN作标号 的指令是程序的启动指令(即第一条被执行的指令)。
DOS装载可执行文件(EXE文件)时,自动把标号BEGIN 所在段的段基址赋给CS,把BEGIN所在单元的偏移量赋给IP, 从而使CPU自动从BEGIN开始的那条指令依次执行程序。 注意:在单一模块的源程序中,以及在模块化程序的主模 块中必须用此格式作为源程序的最后一条语句。
2、段定义语句
功能: 段定义语句是逻辑段的定界语句,源程序中每一个逻辑段 都必须用段定义语句定界。 格式: 段名 SEGMENT 定位参数 链接参数 ‘分类名’ 段长 度 段体
段名
ENDS
2、段定义语句
SEGMENT / ENDS 是一对段定义语句,一个逻辑段从 SEGMENT 语句开 始,到ENDS 语句结束。 段名 命名规则和变量名及标号名一样,段名并不能直接表示 段体的性质,但为了阅读方便,习惯上总是根据段体的性质 起一个适当的段名。 通常用DATA做为数据段的段名,用STACK做为堆栈段 的段名,用CODE做为代码段的段名。
汇编语言程序设计
第五章 宏汇编语言
第五章 宏汇编语言
5.1 宏汇编语言基本语句
5.1 宏汇编语言基本语句
一个完整的源程序在结构上必须做到:
用方式选择伪指令说明执行该程序的微处理器 类型; 用段定义语句定义每一个逻辑段; 用过程定义语句定义每一个子程序; 用ASSUME语句说明段约定; 用汇编结束语句说明源程序结束; 程序在完成预定功能之后,应能安全返回 DOS。
5、汇编结束语句
格式2: END 功能: 通知汇编程序,源程序到此结束。在模块化程序的 子模块中,必须用此格式作为源程序的最后一条语句。 结束语句有三种: 段结束(SEGMENT / ENDS) 过程结束(PROC / ENDP)
汇编结束(END)
6、
返回DOS语句
程序在完成预定任务之后,必须返回DOS。返回DOS 最常用的方法是使用DOS系统4CH功能调用,即连续执行 以下3条(或2条)指令:
4、过程定义语句
所谓“过程”,即“子程序”。子程序必须用过程定义 语句定界,用RET作为返回指令。 PROC开始,ENDP结束。 格式: 过程名 PROC 属性参数 …… 过程的实体 …… RET 过程名 ENDP
5、汇编结束语句
格式1: 例如: 功能: END END 程序的启动地址标号 BEGIN
;定义堆栈段
;定义代码段 ;说明段约定 ;BEG为启动地址标号
;返回DOS ;源程序结束
3、段约定语句
格式: ASSUME 段寄存器:段名,……,段寄存器:段名 功能: 使用ASSUME语句通知汇编程序,列表中的逻辑 段使用哪一个段寄存器。 说明:
① ASSUME语句是非执行语句,要求放在代码段之中、 执行寻址操作之前。习惯上,把ASSUME语句作为代码段的 第一条语句; ② ASSUME语句,仅仅是约定了对某个逻辑段进行寻 址操作时使用哪一个段寄存器,并未真正对段寄存器赋值。 段寄存器的初值必须在程序中用指令设置。
方式选择伪指令的格式和功能
.486 ;方式定义 DATA SEGMENT USE16 ;定义数据段 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS CODE SEGMENT USE16 ;定义代码段 ASSUME CS:CODE,DS:DATA ;说明段约定 BEG: MOV AX,DATA ;BEG为启动地址 MOV DS,AX MOV CX,10 LAST: MOV AH,9 MOV DX,OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H ;返回DOS CODE ENDS END BEG ;汇编结束
编辑程序:按照要求使用编辑软件编写汇编程序源代码。 可以使用你所熟悉的文本编辑软件,但源程序文本文件 中不能有格式控制字符(可能不可见),除注释部分,不能 使用中文。 汇编程序:将.ASM的源程序代码翻译成初步的机器码, 能够发现程序中的语法错误。 链接程序:根据参数,将汇编程序生成的机器码文件, 链接成为真正的可执行文件。
MESG
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ 0DH 0AH ‘$’ …...
DS
应用举例
稍作修改:显示6行Hello world! .486 DATA SEGMENT USE16 MESG DB 'Hello world!',0DH,0AH,'$' DATA ENDS STACK SEGMENT PARA STACK 'STACK' USE16 DB 100 DUP(?) STACK ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA, SS:STACK BEG: MOV AX, DATA MOV DS, AX MOV CX, 6 LAST: MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS ENDBEG ;定义数据段
1、方式选择伪指令
功能: 80586指令集是在 8086、8088、80286、80386、80486 基础上发展起来的,指令集向前兼容,但后续CPU的指令 集往往包含早期CPU没有的指令。 在使用高版本汇编程序时,必须通知汇编程序,当前 的源程序指令是哪一种CPU指令,经过汇编链接之后生成 的目标程序在哪一种CPU机型上运行。
MOV MOV INT
AH,4CH AL,返回码 ; 不准备组织批处理文件,此条可省 21H
采用此系统调用,将CPU控制权交回DOS操作系统。
应用举例
.486
DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP(?) STACK ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA, SS:STACK BEG: MOV AX, DATA MOV DS, AX MOV CX, 10 LAST: MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH, 4CH INT 21H CODE ENDS END BEG
CS
MESG
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ 0DH 0AH ‘$’ …...
DS
宏汇编程序的构成
上述程序段中包括了: 1. 方式选择伪指令; 2. 段定义语句; 3. 段约定语句; 4. 过程定义语句; 5. 汇编结束语句; 6. 返回DOS语句。 这类语句是与程序结构密切相关的基本语句,用来说 明MPU类型、段结构与寻址方式的段约定、目标块的定位 和源程序结束。
段定义语句小结
1、 段定义语句共有4个属性参数,在定义时每一个参数都 有多种选择; 2、 模块化程序中才有必要考虑各模块之间同名段的定位 方式和链接方式,对于单一模块的程序不需要考虑这些问题; 3、 单一模块的程序,如果有堆栈段的话,堆栈段的链接 属性应为STACK(因为只有STACK属性才表示该段是堆栈 段),分类名应为’STACK’,且不能省略。其它的逻辑段, 前3个属性参数都选用缺省方式; 4、 不同模块中,链接方式相同的同名段,如果有‘分类 名’的话,‘分类名’必须相同; 5、 DOS环境下运行的程序选用USE16做段长度。
; 方式定义 ; 定义数据段
; 定义堆栈段
; 定义代码段 ; 说明段约定 ; BEG为启动地址标号
; 返回DOS ; 汇编结束
第五章 宏汇编语言
5.2 宏汇编语言开发过程
5.2 宏汇编语言的开发过程
编辑程序 UltraEdit EditPlus NotePad等 生成 .ASM 文件 汇编程序 TASM 生成 .OBJ 文件 链接程序TLINK 生成 .EXE 文件
1、方式选择伪指令
方式选择伪指令的格式和功能: .8086 .286或 .286C .286P .386或 .386C .386P .486或 .486C .486P .586或 .586C .586P ; 只汇编8086、8088指令; ; 只汇编8086、8088及80286实模式指令; ; 只汇编8086、8088及80286全部指令 ; ; 同.286,且汇编80386实模式指令; ; 同.286P,且汇编80386全部指令; ; 同.386,且汇编80486实模式指令; ; 同.386P,且汇编80486全部指令 ; ; 同.486,且汇编80586实模式指令; ; 同.486P,且汇编80586全部指令。
2、段定义语句
(3) 段长度 段长度是80386以后汇编语言新增加的段参数,只有高版 本的汇编器才识别。 ① USE 16 :表示该逻辑段长度最大64KB,单元偏移
地址16位,访问该逻辑段采用16位寻址方式。
② USE 32 :表示该逻辑段长度可以超过64KB,单元 偏移地址32位,访问该逻辑段采用32位寻址方式。 运行实地址模式下的程序若访问高于64KB的单元(偏移 地址大于FFFFH),必然引起系统异常中断,导致死机。
2、段定义语句
(1) 定位参数 定位参数通知链接程序,逻辑段的目标代码在存储器中如 何存放。 ① BYTE字节地址:表明该逻辑段的目标代码可以从任意地 址开始依次存放(因为存储器是以字节为基本单位组织的); ② WORD字地址:表示该逻辑段的目标代码,从偶地址开始 依次存放; ③ PARA(或者缺省)节地址:表示该逻辑段的目标代码, 从一个能被16整除的地址开始依次存放; ④ PAGE页地址:表示该逻辑段的目标代码,从一个能被256 整除的地址开始依次存放。
2、段定义语句
定位参数,链接参数,‘分类名’ 为段定义语句的3个属性参数,可以选用1~3个,也可以 全部省略。 属性参数的功能: 为源程序的汇编、链接提供必要的信息。 在大型程序开发中,常采用模块化方法。每个模块都有自 己的数据段、代码段等。各个模块独立编辑、汇编,最后链接 起来成为一个完整功能的执行文件。 定位参数、链接参数是用于说明模块如何定位,彼此之间 如何链接等。
2、段定义语句
(2) 链接参数 链接又称组合,链接参数通知链接程序如何将不同模块中 的同名逻辑段组合成一个段。 ① PUBLIC ② MEMORY ③ COMMON ④ STACK ⑤ AT表达式 ⑥ 缺省:表明该段是一个独立的逻辑段,链接程序对于 不同模块中,链接参数缺省的同名段,不进行组合。
应用举例
.486 DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS CODE BEG: ; 方式定义 ; 定义数据段
CS
LAST:
CODE
SEGMENT USE16 ; 定义代码段 ASSUME CS:CODE, DS:DATA ; 说明段约定 MOV AX, DATA ; BEG为启动地址 MOV DS, AX MOV CX, 10 MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH, 4CH INT 21H ; 返回DOS ENDS END BEG ; 汇编结束
2、段定义语句
链接程序要求,最终生成EXE文件的汇编源程序,必须有 堆栈段,否则链接时发出警告信息: Warning no stack segment 但是这行信息仅仅是提醒用户注意,并不代表程序错误。
注意: 模块化程序设计中才会用到链接参数。 注意: 链接程序对于不同模块中的同名段进行链接时,对于有 BYTE属性的段,总是紧接着前一段存放,不留空闲单元。 对于有WORD属性的段,也是紧接前一段存放,最多留出 一个空闲单元。
通知汇编程序,源程序到此结束,且说明用BEGIN作标号 的指令是程序的启动指令(即第一条被执行的指令)。
DOS装载可执行文件(EXE文件)时,自动把标号BEGIN 所在段的段基址赋给CS,把BEGIN所在单元的偏移量赋给IP, 从而使CPU自动从BEGIN开始的那条指令依次执行程序。 注意:在单一模块的源程序中,以及在模块化程序的主模 块中必须用此格式作为源程序的最后一条语句。
2、段定义语句
功能: 段定义语句是逻辑段的定界语句,源程序中每一个逻辑段 都必须用段定义语句定界。 格式: 段名 SEGMENT 定位参数 链接参数 ‘分类名’ 段长 度 段体
段名
ENDS
2、段定义语句
SEGMENT / ENDS 是一对段定义语句,一个逻辑段从 SEGMENT 语句开 始,到ENDS 语句结束。 段名 命名规则和变量名及标号名一样,段名并不能直接表示 段体的性质,但为了阅读方便,习惯上总是根据段体的性质 起一个适当的段名。 通常用DATA做为数据段的段名,用STACK做为堆栈段 的段名,用CODE做为代码段的段名。
汇编语言程序设计
第五章 宏汇编语言
第五章 宏汇编语言
5.1 宏汇编语言基本语句
5.1 宏汇编语言基本语句
一个完整的源程序在结构上必须做到:
用方式选择伪指令说明执行该程序的微处理器 类型; 用段定义语句定义每一个逻辑段; 用过程定义语句定义每一个子程序; 用ASSUME语句说明段约定; 用汇编结束语句说明源程序结束; 程序在完成预定功能之后,应能安全返回 DOS。
5、汇编结束语句
格式2: END 功能: 通知汇编程序,源程序到此结束。在模块化程序的 子模块中,必须用此格式作为源程序的最后一条语句。 结束语句有三种: 段结束(SEGMENT / ENDS) 过程结束(PROC / ENDP)
汇编结束(END)
6、
返回DOS语句
程序在完成预定任务之后,必须返回DOS。返回DOS 最常用的方法是使用DOS系统4CH功能调用,即连续执行 以下3条(或2条)指令:
4、过程定义语句
所谓“过程”,即“子程序”。子程序必须用过程定义 语句定界,用RET作为返回指令。 PROC开始,ENDP结束。 格式: 过程名 PROC 属性参数 …… 过程的实体 …… RET 过程名 ENDP
5、汇编结束语句
格式1: 例如: 功能: END END 程序的启动地址标号 BEGIN
;定义堆栈段
;定义代码段 ;说明段约定 ;BEG为启动地址标号
;返回DOS ;源程序结束
3、段约定语句
格式: ASSUME 段寄存器:段名,……,段寄存器:段名 功能: 使用ASSUME语句通知汇编程序,列表中的逻辑 段使用哪一个段寄存器。 说明:
① ASSUME语句是非执行语句,要求放在代码段之中、 执行寻址操作之前。习惯上,把ASSUME语句作为代码段的 第一条语句; ② ASSUME语句,仅仅是约定了对某个逻辑段进行寻 址操作时使用哪一个段寄存器,并未真正对段寄存器赋值。 段寄存器的初值必须在程序中用指令设置。
方式选择伪指令的格式和功能
.486 ;方式定义 DATA SEGMENT USE16 ;定义数据段 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS CODE SEGMENT USE16 ;定义代码段 ASSUME CS:CODE,DS:DATA ;说明段约定 BEG: MOV AX,DATA ;BEG为启动地址 MOV DS,AX MOV CX,10 LAST: MOV AH,9 MOV DX,OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H ;返回DOS CODE ENDS END BEG ;汇编结束
编辑程序:按照要求使用编辑软件编写汇编程序源代码。 可以使用你所熟悉的文本编辑软件,但源程序文本文件 中不能有格式控制字符(可能不可见),除注释部分,不能 使用中文。 汇编程序:将.ASM的源程序代码翻译成初步的机器码, 能够发现程序中的语法错误。 链接程序:根据参数,将汇编程序生成的机器码文件, 链接成为真正的可执行文件。
MESG
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ 0DH 0AH ‘$’ …...
DS
应用举例
稍作修改:显示6行Hello world! .486 DATA SEGMENT USE16 MESG DB 'Hello world!',0DH,0AH,'$' DATA ENDS STACK SEGMENT PARA STACK 'STACK' USE16 DB 100 DUP(?) STACK ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA, SS:STACK BEG: MOV AX, DATA MOV DS, AX MOV CX, 6 LAST: MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS ENDBEG ;定义数据段
1、方式选择伪指令
功能: 80586指令集是在 8086、8088、80286、80386、80486 基础上发展起来的,指令集向前兼容,但后续CPU的指令 集往往包含早期CPU没有的指令。 在使用高版本汇编程序时,必须通知汇编程序,当前 的源程序指令是哪一种CPU指令,经过汇编链接之后生成 的目标程序在哪一种CPU机型上运行。
MOV MOV INT
AH,4CH AL,返回码 ; 不准备组织批处理文件,此条可省 21H
采用此系统调用,将CPU控制权交回DOS操作系统。
应用举例
.486
DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP(?) STACK ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA, SS:STACK BEG: MOV AX, DATA MOV DS, AX MOV CX, 10 LAST: MOV AH, 9 MOV DX, OFFSET MESG INT 21H LOOP LAST MOV AH, 4CH INT 21H CODE ENDS END BEG
CS
MESG
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ 0DH 0AH ‘$’ …...
DS
宏汇编程序的构成
上述程序段中包括了: 1. 方式选择伪指令; 2. 段定义语句; 3. 段约定语句; 4. 过程定义语句; 5. 汇编结束语句; 6. 返回DOS语句。 这类语句是与程序结构密切相关的基本语句,用来说 明MPU类型、段结构与寻址方式的段约定、目标块的定位 和源程序结束。
段定义语句小结
1、 段定义语句共有4个属性参数,在定义时每一个参数都 有多种选择; 2、 模块化程序中才有必要考虑各模块之间同名段的定位 方式和链接方式,对于单一模块的程序不需要考虑这些问题; 3、 单一模块的程序,如果有堆栈段的话,堆栈段的链接 属性应为STACK(因为只有STACK属性才表示该段是堆栈 段),分类名应为’STACK’,且不能省略。其它的逻辑段, 前3个属性参数都选用缺省方式; 4、 不同模块中,链接方式相同的同名段,如果有‘分类 名’的话,‘分类名’必须相同; 5、 DOS环境下运行的程序选用USE16做段长度。
; 方式定义 ; 定义数据段
; 定义堆栈段
; 定义代码段 ; 说明段约定 ; BEG为启动地址标号
; 返回DOS ; 汇编结束
第五章 宏汇编语言
5.2 宏汇编语言开发过程
5.2 宏汇编语言的开发过程
编辑程序 UltraEdit EditPlus NotePad等 生成 .ASM 文件 汇编程序 TASM 生成 .OBJ 文件 链接程序TLINK 生成 .EXE 文件