ASM-51 宏汇编使用手册
A51与ASM51基本相同
ASM-51 宏汇编主要用来开发Inter8051系列单片机,它具有宏处理,数据处理,列表处理和条件处理等多种功能。源程序的编写完全采用 Inter标准助记符和行格式。在编写程序过程中,可借助于文本编辑(Windows的记事本)或文字处理软件Word等编辑,经ASM-51汇编后生成列表输出文件(.LST)和目标代码文件(.HEX)。 此目标代码文件(.HEX)可直接用CZS-51或MedWin、Keil、Debug8051进行模拟/调试,或直接用于硬件仿真器上运行。当然,这也是要烧写到单片机ROM中的代码。
1、宏汇编语言的基本语法
1.1 宏汇编的特点
ASM-51宏汇编完全支持Inter助记符的汇编语言,它含有宏语句,英文大小写字母,变量名,标号等不受限制,有二,十,十六进制和串参数类型,有汇编控制指令和多层条件语句,程序逻辑分段, 还有模块化程序设计的连接功能,汇编速度快等特点。
1.2 汇编处理过程
(1) 用行编辑EDLIN或文字处理软件WS或全屏幕编辑软件PE等,编辑宏汇编语言源程序,它的文件扩展名为.ASM。
(2) 用ASM-51宏汇编程序对上述源程序文件进行汇编,产生扩展名为.LST的列表输出文件和扩展名为.HEX的目标代码文件(.HEX)。 列表输出文件包含源程序语句所汇编成的代码,以及有关的地址,语句和符号表等。目标代码文件包含源程序语句所汇编成的代码,不包含任何符号信息或助记符。 进行模拟/调试,或直接用于硬件仿真器上运行。
1.3 语句
汇编语言可分为两类语句:指令性语句和指示性语句。
(1)指令性语句
这一类语句是指在汇编过程中能生成指令代码的语句(如 MOV ,DEC等)。其格式为: [标号:] [指令助记符] [操作数] [;注释]
其中方括号[ ]中为选择项。下同。
(2)指示性语句
这一类语句即通常所说的伪指令,它指示汇编程序后面的指示性语句如何产生代码。
ASM-51宏汇编完全支持Inter助记符的汇编语言,因此汇编程序的格式,指令完全与8051汇编语言一样,这里不再介绍它们的指令系统。
1.4 常量与数值运算
(1) 常量及其表示
常量,就是在汇编时已经确定的值。在汇编语言中,常量主要用作指令性语句中的直接操作数,也可用于存储器操作的组成部分(如位移量),或者为伪指令中的变量输初值。 为便于程序设计,常量有多种表示形式:二、十、十六进制数和字符串等,它们的格式各不相同,并采用不同的基数标记加以区分。表--1列出其格式。
数据形式 |
格 式 |
取值范围 |
例 如 |
备 注 |
2进制 |
********B |
0,1 |
10011100B |
|
10进制 |
****** |
0,1,2...9 |
45723 |
缺省基数标记 |
16进制 |
****H |
0,1...E,F |
0CDE3H |
最前面一个字符应是0--9 |
ASCII |
‘**‘ |
ASCII |
‘AD‘ |
只有DB命令中使用 |
常量以数值形式直接写在汇编语言的语句中称为字面常量, 若预先为它定义一个符号名,然后在语句中用符号名来表示该常量称符号常量。使用符号常量的优点可改善程序的可读性,它的定义需要使用伪操作命令"EQU"或“=“。
(2) 数值运算
宏汇编中,所有参数值均被认为是整数,并以16位的形式存放,表示的范围是0---65535,所有算术操作均对整数以补码形式运算。
(1) 基本运算
汇编语言对常量允许进行算术运算,逻辑运算,分离运算等三种类型的运算。如表--2所示。
运 算 操作 含义 以ADD为例(说明:R1为符号常量) + 加操作 算 - 减操作 ADD A,R1-2EH * 乘操作 ADD A,R1*0E3H 术 / 除操作 MOD 模除 AND 与操作 ADD A,R1 AND 10000101B 逻 OR 或操作 ADD A,R1 OR 00110000B 辑 XOR 异或操作 ADD A,R1 XOR 36H NOT 非操作 ADD A,NOT 45H 分 HIGH 高字节分离 ADD A,HIGH 05E2H 离 LOW 低字节分离 ADD A,LOW 77F0H
(2) 综合运算
综合运算规则 1:计算表达式时,所有的运算全部从左到右顺序进行,遇到操作数就进行运算,不考虑优先关系,括号有助于视觉理解,但不改变表达式的计算顺序。
例如: R1 SET NOT(0C5FH OR 000CH) 其结果应为 0F3ACH。
综合运算规则 2:当两个操作数之间没有参数相隔时, 第二个操作符优先于第一个操作符计算。
例如: R1 SET NOT 10011010B 其结果应为 65H。
1.5 程序分段
8051系列的处理器的结构,把内存分成五个独立的内存段,即代码段(段名CSEG),数据段(段名DSEG),外部段(段名XSEG),功能段(段名FSEG)和位段(段名BSEG)等。各个段在源程序中的次序可以任意,段的数目可以根据需要确定,原则上不受限制。程序中的所有段都必须用段名开头,段结束语句ENDS结束。
1.6 源文件
源文件是由汇编语言代码和汇编程序指令组成的 ASCII 字符文件,扩展名为.ASM。源文件的每一语句行,最多有四个域。每一行的长度不超过80个字符, 且以“回车“键结束。
1.7 列表输出文件和目标代码文件
(1) 目标代码文件(.HEX)
目标代码文件(.HEX)是ASCII文件,它只包含由各种程序语句所生成的代码,而不包含任何信息或助记符。该文件是能够在处理器上运行的实际机器指令码。
目标代码文件格式如下:
:cc aaaa tt dd aa dd ss <CR>
计数器 记录地址 数据类型 代码的字节 和校验 回车
目标代码文件(.HEX)的每一行以一个冒号开始,后面跟着的数字和符号分别表示十六进制数据的计数器(cc),记录第一个数据字节的16位地址(aaaa),目标记录的数据类型(tt),代码的实际字节(dd),计数器从第一个数据字节到最后的所有字节值累加和的相反数即和校验(ss)等等。
(2)列表输出文件(.LST)
列表输出文件也是个ASCII文件,它由源程序和目标代码文件组成, 可作为程序文档也可被打印。
列表输出文件是分页显示、打印的,其长度由缺省值或伪指令$PAGE决定。 每页一开始指出汇编程序的类型,版本以及页号等。
2、伪操作指令
汇编语言中的指示性语句(伪指令),不象指令性语句会产生目标代码, 它主要是用来“控制指挥“汇编程序如何把指令性语句翻译成目标代码。除本身伪指令申请分配一部分存贮空间作数据区和堆栈区外,不产生任何目标代码。
按照它们的功能,大致分成七类:符号定义伪操作、段定义伪操作、数据定义崐伪操作、列表伪操作、条件伪操作、宏处理伪操作以及其它操作等。如表--3所示。
序号 分 类 伪 操 作 指 令
1 符号定义伪操作 EQU,=,DATA,BYTE,WORD,BIT,SET
2 段定义伪操作 ORG,END,CSEG,DSEG,XSEG,FSEG,ENDS
3 数据定义伪操作 DB,DW,DS
4 列表伪操作 $TITLE,$SUBTTL,$PAGE,$LIST,$NOLIST,$NOCODE
5 条件伪操作 IF,ELSE,ENDIF
6 宏处理伪操作 MACRO,ENDM
7 其 它 ALTNAME,INCLUDE
2.1 符号定义伪操作
符号定义伪操作及其格式:符号名 符号定义名 常量或表达式
其中符号定义名可以为EQU,=,DATA,BYTE,WORD,BIT,SET等。下面就是这些符号定义伪操作的用法及说明。如表--4所示。
符号定义名 |
用法 |
说明 |
EQU |
为常量,符号名等定义符号化常量名 |
符号名不能重名定义 |
= |
为常量,符号名等定义符号化常量名 |
符号名不能重名定义 |
DATA |
用来为一个字节类型的符号定值 |
符号名不能重名定义 |
BYTE |
用来为一个字节类型的符号定值 |
符号名不能重名定义 |
WORD |
用来为一个字类型的符号定值 |
符号名不能重名定义 8051中没有字操作 |
BIT |
用来定义一个字位类型 |
|
SET |
用来定义整数类型的符号名 |
符号名可重名定义 |
DATA与BYTE的区别:DATA与BYTE是相类似的伪指令。当程序运行到DATA伪指令定义的符号名时,该符号名将被显示,而由BYTE定义的符号名不被显示。
2.2 段定义伪操作
(1) ORG 用于设置或改变程序计数器的值。
其格式为: ORG 常数或表达式
例如: ORG 0008H
ORG $+5
其中$表示程序计数器的当前值。
(2) END 表示源代码结束。
其格式为: END 常数或表达式
汇编程序遇到END语句即停止运行。 若程序中没有END,则在汇编源程序时显出错
(3) 8051系列的处理器把内存结构分成五个段,代码段CSEG,数据段DSEG,外部段XSEG,功能段FSEG和位段BSEG等,其用法及区别如 表--5所示。
在汇编以上各段所定义的符号时,系统根据符号所在不同段,赋与不同类型的字母,如表--6所示。
2.3 数据定义伪操作
数据定义伪操作格式: [ 标号: ] 数据定义名 [ 表达式1,表达式2,。。。 ]
其中数据定义名可为DB,DW,DS等。如表--7所示,数据定义伪操作的含义及说明。
表--5 段定义伪操作
段 用 法 及 区 别
代码段(CSEG) 包含由处理器所执行的程序。段名可缺省。有目标代码生成。
数据段(DESG) 由内部工作寄存器的处理器的RAM组成。用来对程序使用的数据地址赋符号名,大多以ORG,DATA,BYTE,WORD,EDNS等组成。无目标码生成。
外部段(XSEG) 由外部工作寄存区和RAM组成。使用方法同数据段。无目标码生成。
功能段(FSEG) 由特殊寄存器位置组成(如:输入/输出部件,计时器,中断控制和连续的寄存器部件接口等)。无目标代码生成。
位 段(BSEG) 由一些独立的位组成,可以用布尔函数实现。 该段地址被解释为位地址。无目标代码生成。
表--6 程序分段的类型符号
段 标号(Label) 字节型操作数(Byte) 字型操作数(Word)
代码段CSEG L D W
数据段DSEG D D W
外部段XSEG X X E
功能段FSEG F F G
位 段BSEG B B B
说明:
(1)在不同的段中类型符号不同;
(2)字节型操作数(Byte)一般通过DATA指令赋给符号; 字型操作数一般通过WORD指令赋给符号;
(3)如果各段中用BYTE赋值,则在各段中符号全以S表示;在SIM51模拟/调试中的符号区显示功能中,对BYTE赋值的将被跳过。
(4)在各段中,位类型可以用BIT指令赋给。
表--7 数据定义伪操作
数据定义名 含 义 说 明
DB 用于定义一个字节包含的值 表达式不是字符串时,每个表达式赋给一个字节,是字符串时,用单引号 “ ‘ “ 作为分隔符。
DW 用于定义一个字(16位) 每个表达式占16位。 如果表达式中的存贮内容为字符串,只取最后两个字符。若字符串只有一个字符,高字节置“0“。
DS 定义一个存贮区 通常用在代码段中,作为程序的一部分。若用在数据段,外部段,则作为位置标志使用。
表--8 列表伪操作
伪指令 含义及格式 说明
$TITLE 给源程序指定一个标题,格式: $TITLE [标题行] 标题不加 “ “,其最大长度60个字符。若标题行省略, 原来定义的标题行作废。
$SUBTTL 给源程序指定一个副标题,格式: $SUBTTL [副标题行] 副标题不加 “ “,其最大长度60字符。若副标题行省略,原来定义的副标题行作废。
$PAGE 用于形成或定义新的一页或行数 汇编时页长为66行(适合于格式: $PAGE [表达式] 标准打印纸)。表达式最大为65535, 最小为12,表达式缺省,则从新的一页开始。
$LIST 使源程序汇编时,产生程序清单,格式: $LIST 汇编时无此指令照样产生清单。
$NOLIST 使源程序汇编时不产生程序清单,格式: $NOLIST
$NOCODE 源程序汇编时,条件汇编程序值,格式: $NOCODE 没有此指令汇编时,不论其值是为假的不产生清单。真、假的条件都不产生目标码。
2.4 列表伪操作
如表--8所示,列表伪操作的含义,格式及说明。
2.5 条件伪操作
条件伪操作格式:
IF 表达式
[ 程序块1 ]
[ ELSE ]
[ 程序块2 ]
ENDIF
当IF指令中的表达式为真时,被汇编的代码段是程序块1;当IF指令中的表达式为假时,被汇编的代码段是程序块2。在一个条件结构中,仅有一个代码段被汇编,其它的则被忽略。
2.6 宏处理操作
在源程序中,如果有一段程序需要多次使用,为使程序不重复书写这段程序,可用宏定义把所需要重复出现的程序块定义成宏指令,此后在宏指令出现的地方,宏汇编程序总是自动地把它们替换成相应的代码段。
(1) 宏指令格式
[ 宏指令名 ] MACRO [形式参数,。。。]
代码段
ENDM
在宏定义中,使用了“形式参数“,它们引用宏指令时被给出的一些名字或数值(实在参数)所替换。使用形式参数给宏指令带来了很大的灵活性。
(2)宏调用格式
[ 宏指令名 ] [实在参数,。。。]
注意:
1、当有两个以上的实参数时,它们之间要用逗号,空格或列表符隔开。
2、实参数项将对应替换宏指令中形式参数。如果形式参数为标号时,则在宏调用中,实参也应为标号,且要求实参是唯一的。如果宏定义中有自己的标号,则在宏调用时,汇编程序自动地把标号变成唯一的标号。
2.7 其他
(1) 替换名 ALTNAME
功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中。
格式: ALTNAME 保留字 自定义名
注意: 自定义名与保留字之间首字符必须相同。
(2) 附加文件的链结 INCLUDE
功能: 利用此伪指令可将一个源文件插入到当前源文件中一起汇编,最终成为一个完整的源程序。
格式: INCLUDE [ 驱动器名: ] [ 路径名 ] 文件名
注意:1、文件名中若没有扩展名,则系统默认是。ASM(该文件必须是能打开的)。
2、被插入的源程序中不能包含END伪指令,否则汇编会停止运行。被链接文件的每一行,在程序清单中以“I“开头。
3、链接伪指令可有8级嵌套, 若要求嵌套的多, 则要修改 DOS 中的CONFIG.SYS文件的FILES参数。
3、宏汇编运行
3.1 系统运行环境
ASM-51宏汇编要在IBM-PC及其兼容机上运行(至少128K字节的RAM);具有一个软驱动器或硬驱动器,采用ANSI标准终端(包括键盘,显示控制器,打印机,至少一个RS-232异步通讯接口)。软件有PC-DOS,MS-DOS 2。0 以上版本,ASM_51系统。
3.2 宏汇编程序的运行
以 8051 宏汇编为例,在DOS系统的提示符下键入
A> ASM51 文件名。ASM <CR>
等错误的个数出现后 ,键入 <CR> 变返回到DOS提示符下。8051的宏汇编与此相似。
4、汇编的使用
使用ASM-51宏汇编是将8051源程序汇编生成列表输出文件和目标代码文件,供模拟/调试时使用。我们使用的宏汇编完全采用Inter标准助记符和行格式,因此在编写源程序时,可以使用宏汇编中的伪指令, 以增加源程序的运行速度和可读性。也可以直接用 Inter 标准助记符来编写源程序。再经过ASM-51宏汇编进行汇编,便可得到列表输出文件和目标代码文件。
汇编的格式如下:
> ASM51 文件名。ASM [ 可选项 ]
其中可选项为: /L, /H, /S, /P, /N
/L 表示源程序汇编后不生成列表册输出文件(.LST),只显示在屏幕上。
/H 表示源程序汇编后不生成目标代码文件(.HEX)。
/S 表示源程序汇编后不生成符号表。
/P 表示源程序汇编后生成符号表。
/N 表示源程序汇编后,程序是连续的显示。
如果没有选择项,则表示产生列表输出文件和目标代码文件,且在LST文件后面列出符号表。 生成的目标代码便可以进行模拟/调试,如果在模拟/调试中发现错误,则源程序要经过修改,重新汇编,然后再进行模拟/调试,直到完全正确。
若程序汇编过程中有错误,则给出出错信息(出错信息见附录)。 生成的目标代码可以进行模拟/调试/烧写。
附录 ASM-51 汇编出错信息表
1 Address Out of Range 一个被计值的目标地址超出了当前语句的范围。
2 Badly Formed Argument 数字规定的类型中有非法数字存在。
3 Illefal Equale 有不允许的类型约定。
4 Label Name Conflicts With Symbol Name 在程序中有两个符号相同。
5 Label Address Changed On Pass 2。 源程序在此错误之前,还有一些错误。
6 Missing Argument in Expression 表达式中算术运算符后面没有操作数。
7 Missing END Statrment 汇编的源程序结尾未发现END语句。
8 Multiply Defined Label 源程序中定义了两个标号。
9 Unbalanced Parentheses 表达式中多余或缺少括号。
10 Undefined Symbol 语句中的符号名可能拼错或未被定义。
11 Unrecognized Statemen or Undefined Argument 未定义参数的指令或代码。
12 Value Out of Range 有一个非法的值来说明一个有着可能值限制的语句。
ASM-51 宏汇编使用手册的更多相关文章
- 宏汇编软件MASM51的使用
单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...
- Windows 通用应用尝试开发 “51单片机汇编”总结
一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几 ...
- Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结
一.前言 昨天更新了10天前上架到windows8.1平台和windowsphone平台的通用应用“51单片机汇编”,总要是添加了动态磁贴以及ListView的Groupstyle应用.下面主要主要复 ...
- 学 Win32 汇编[34] - 宏汇编(1)
从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解. 宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ.textequ 或 = 来代替, ...
- iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册
宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...
- 伟福与Keil的比较--51汇编提高篇
[写在前面] 本文适合有一定汇编水平的人(了解大半的汇编语句,能区分全角与半角符号,能够独立编写流水灯.数码管等程序),传授51单片机的汇编语言经验.如果您发现不少指令不知道意思,请从网上搜索入门教程 ...
- 汇编3栈帧,参数传递,串操作,混合汇编,x64,asm文件
基础知识2 选择结构 通过判断 + 条件跳转指令来实现 循环结构 通过判断 + 条件跳转指令来实现(会有一个向上跳转的语句) 函数调用约定 C调用约定: 由外部平衡栈 标准调用约定 : 由函数内部平衡 ...
- C语言ASM汇编内嵌语法【转】
转自:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作G ...
- C语言ASM汇编内嵌语法
转载:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html C语言ASM汇编内嵌语法 .3 GCC Inline ASM G ...
随机推荐
- Android视图框架
Android视图框架 Android的UI系统是android应用系统框架最核心,最基础的内容! 1. Android视图系统.层次关系 Android应用设计和Web应用设计类似,也分前端和后端设 ...
- 教你正确地利用Netty建立连接池
一.问题描述 Netty是最近非常流行的高性能异步通讯框架,相对于Java原生的NIO接口,Netty封装后的异步通讯机制要简单很多. 但是小K最近发现并不是所有开发人员在使用的过程中都了解其内部实现 ...
- 关于C/C++函数指针声明的理解
[前言] 由于最近对函数指针的理解比较模糊,所有又重新学习了一把关于函数指针的知识,参考了很多书籍和网上的文章.现在本人进行一下分享和总结.本文的其实只是整理和总结别人现有的文章,作为备用参考文档. ...
- <Win32_9>有意思的程序——抓取屏幕
Win32学了一段时间了,跟着杨老师的脚步,准备学习MFC,因此最近几天在复习C++,于是发现有将近一周没写博文了…… 今天来写一个较为简单.但是比较有意思的东西 不知大家在理发店理发的时候注意到一个 ...
- Python读取txt文件
Python读取txt文件,有两种方式: (1)逐行读取 data=open("data.txt") line=data.readline() while line: print ...
- iOS获取设备唯一编号,就算删除app从新安装也不变的方法
第三方开源代码 https://github.com/soffes/SAMKeychain 使用方法 //获取设备信息32 位字符串 -(NSString *)getDeviceString{ NSS ...
- 性能优化之NSDateFormatter
为什么要优化NSDateFormatter? 优化方式有哪些? 为什么要优化NSDateFormatter? 首先,过度的创建NSDateFormatter用于NSDate与NSString之间转换, ...
- H面试程序(10): 字符串包含问题
题目描述:判断第二个字符串中的元素是否都能在第一个字符串中找到: 注意:和字符串的字串的问题有所区别,如第一个字符串为 abcdefg,第二个字符串为 aaabc,第二个字串还是包含于第一个字符串 ...
- DES加解密算法Qt实现
算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...
- (第三章)Java内存模型(下)
一.happens-before happens-before是JMM最核心的概念.对于Java程序员来说,理解happens-before是理解JMM的关键. 1.1 JMM的设计 从JMM设计者的 ...