汇编伪指令和编译出错说明

合集下载

汇编伪指令和编译出错说明

汇编伪指令和编译出错说明

汇编伪指令和编译出错说明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)指示性语句这一类语句即通常所说的伪指令,它指示汇编程序后面的指示性语句如何产生代码。

汇编程序MASM错误信息

汇编程序MASM错误信息

汇编程序MASM 5.0编译出错信息表-中文说明用MASM 5.0对汇编程序进行汇编的时候,如果检查出某行语句有错误,就会在屏幕上给出出错信息,若指定了列表文件(.LST),MASM 5.0也会在列表文件中给出错误信息。

MASM5.0出错信息格式: WARNING/ERROR错误信息码:错误描述信息错误描述信息码由五个字符组成,第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出错类别:2为致命错误,4为严肃警告,5为建议性警告,最后三位为错误编号。

下面的手册中给出了错误编号、错误描述以及中文解释说明,方便大家查阅,包括MASM 5.0常见编译错误。

000 Block nesting error嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局001 Extra characters on line一语句行有多余字符,可能是语句中给出的参数太多002 Internal error-Register already defined这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request 表与Microsoft公司联系003 Unkown type specifer未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等004 Redefinition of symbol符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误005 Symbol is multidefined符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误006 Phase error between passes两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误007 Already had ELSE clause已有ELSE语句.在一个条件块里使用多于一个的ELSE语句008 Must be in conditional block没有在条件块里.通常是有ENDIF或ELSE语句,而无IF 语句009 Symbol not defined符号未定义,在程序中引用了未定义的标识符010 Syntax error语法错误.不是汇编程序所能识别的一个语句011 Type illegal in context指定非法类型.例如对一个过程指定BYTE类型,而不是NEAR或FAR012 Group name must be unique组名应是唯一的.作为组名的符号作为其他符号使用013 Must be declared during pass 1必须在第一遍扫描期间定义.在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误.014 Illegal public declaration一个标识符被非法的指定为PUBLIC类型015 Symbol already defferent kind重新定义一个符号为不同种类符号.例如一个段名重新被当作变量名定义使用016 Reserved word used as symbol把汇编语言规定的保留字作标识符使用017 Forward reference illegal非法的向前引用.在第一遍扫描期间,引用一个未定义符号.018 Operand must be register操作数位置上应是寄存器,但出现了标识符019 Wrong type of register使用寄存器出错020 Operand must be segment or group应该给出一个段名或组名.例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等021 Symbol has no segment不知道标识符的段属性022 Operand must be type specifier操作数应给出类型说明,如NEAR,FAR,BYTE等023 Symbol alread defined locally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识024 Segment paraneters are changed段参数被改变.如同一标识符定义在不同段内025 Improper align/combin type段定义时的定位类型/组合类型使用出错026 Reference to multidefined symbol指令引用了多重定义的标识符027 Operand expected需要一个操作数,只有操作符028 Operator expected需要一个操作符,但只有操作数029 Divdsion by 0 or overflow除以0或溢出030 Negative shift count运算符SHL或SHR的移位表达式值为负数031 Operand type must match操作数类型不匹配.双操作数指令的两个操作数长度不一致,一个是字节,一个是字032 Illegal use of external外部符号使用出错033 Must be record field name应为记录字段名.在记录字段名位置上出现另外的符号034 Must be record name or field name应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号035 Operand must have size应指明操作数的长度(如BYTE,WORD等).通常使用PTR运算即可改正036 Must be variable,label,or constant应该是变量名,标号,或常数的位置上出现了其他信息037 Must be stucture field name应该为结构字段名.在结构字段名位置上出现了另外的符号038 Lefe operand must segment操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:"MOV AX,DA1:DA2".DA1位置上应使用某段寄存器名039 One operand must constant操作数必须是常数.040 Operand must be in same segment or one constant—运算符用错.例如"MOV AL,—VAR",其中VAR是变量名,应有一常数参加运算.又如两个不同段的变量名相减出错041 Normal type operand expected要求给出一个正常的操作数.042 Constant expected要求给出一个常数.043 Operand must have segment运算符SEG用错.044 Must be associated with data在必须与数据段有关的位置上出现了代码段有关的项045 Must be associated with code在必须与代码段有关的位置上出现了数据段有关的项046 Multiple base registers同时使用了多个基址寄存器.如"MOV AX ,[SI][BP]"047 Multiple index registers同时使用了多个变址寄存器.如"MOV AX ,[SI][DI]"048 Must be index or base register指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器.049 Illegal use of register非法使用寄存器出错050 Value is out of range数值太大,超过允许值.例如:"MOV AL ,100H"051 Operand not in current CS ASSUME segment操作数不在当前代码段内.通常指转移指令的目标地址不在当前CS段内052 Improper operand type操作数类型使用不当.例如:"MOV VAR1,VAR2".两个操作数均为存储器操作数,不能汇编出目标代码053 Jump out of range by %ld byte条件转移指令跳转范围超过-128~ 127个字节.出错厂,信息同时给出超过的字节数054 Index displacement must be constant变址寻址的位移量必须是常数055 Illegal register value非法的寄存器值.目标代码中表达寄存器的值超过7056 Immediate mode illegal不允许使用立即数寻址.例如"MOV DS,CODE"其中CODE是段名,不能把段名作为立即数传送给段寄存器DS057 Illegal size for operand使用操作数大小(字节数)出错.例如:使用双字的存储器操作数058 Byte register illegal要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器059 Illegal uer of CS register指令中错误使用了段寄存器CS.如:"MOV CS,AX"CS不能做目的操作数060 Must be accumulator register要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必须使用累加器AX或AL 061 Improper uer of segment register不允许使用段寄存器的位置上使用了段寄存器.如"SHL DS,1"062 Missing or unreachable CS试图跳转去执行一个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联063 Operand combination illegal双操作数指令中两个操作数组合出错064 Near JMP/CALL to different CS试图用NEAR属性的转移指令跳转到不在当前段的一个地址065 Label cannot have segment override段前缀使用出错066 Must have instuction agter prefix在重复前缀REP,REPE,REPNE后面必须有指令067 Cannot override ES for destination串操作指令中目的操作数不能用其他段寄存器替代ES068 Cannot address with srgment register指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联069 Must be in segment block指令语句没有在段内070 Cannot use EVEN or ALIGN with byte alignment在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令071 Forward needs override or FAR转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定072 Illegal value for DUP count操作符DUP前的重复次数是非法的或未定义073 Symbol id already external在模块内试图定义的符号,它已在外部符号伪指令中说明074 DUP nesting too deep操作数DUP的嵌套太深075 Illegak use of undefinde operand( )不定操作符" "使用不当.例如"DB 10H DUP( 2)"076 Too many valer for struc or record initialization在定义结构变量或记录变量时,初始值太多077 Angle brackets requored around initialized list定义结构体变量时,初始值未用尖括号()括起来078 Directive illegal structure在结构体定义中的伪指令使用不当.结构定义中的伪指令语句仅二种:分号(;)开始的注释语句和用DB,DW等数据定义伪指令语句079 Override with DUP illegal在结构变量初始值表中使用DUP操作符出错080 Field cannot be overridden在定义结构变量语句中试图对一个不允许修改的字段设置初值081 Override id of wrong type在定义结构变量语句中设置初值时类型出错083 Circular chain of EQU aliases用等值语句定义的符号名,最后又返回指向它自己.如: A EQU B B EQU A084 Cannot emulate cooprocessor opcode仿真器不能支持的8087协处理器操作码085 End of file,not END directive源程序文件无END文件086 Data emitted with no segment语句数据没有在段内087 Forced error---pass1用.ERR1伪指令强制形成的错误088 Forced error---pass2用.ERR2伪指令强制形成的错误089 Forced error用.ERR伪指令强制形成的错误090 Forced error---expression true(0)用.ERRZ伪指令强制形成的错误091 Forced error---pression false(not 0)用.ERRZ伪指令强制形成的错误092 Forced error---symbol not defined用.ERRNDEF伪指令强制形成的错误093 Forced error---symbol defined用.ERRDEF伪指令强制形成的错误094 Forced error---string blank用.ERRB伪指令强制形成的错误095 Forced error---string not blank用.ERRNB伪指令强制形成的错误096 Forced error---string identical用.ERRIDN伪指令强制形成的错误097 Forced error---string different用.ERRDIF伪指令强制形成的错误098 Wrong length for override value结构域的重新设置太大以致不能适合这个域099 Line too long expanding symbol:EQU使用EQU伪指令定义的等式太长100 Impure memory reference不合适的处理器参考,当/P选项和特权指令有效时(用.286或.386),数据存到代码段101 Missing data;zero assumed缺少操作数,假定是0。

51单片机汇编指令及伪指令小结

51单片机汇编指令及伪指令小结

51单片机汇编指令及伪指令小结51单片机汇编指令及伪指令小结51单片机是一种广泛应用的基于汇编语言的微控制器。

它的汇编指令集非常丰富,包括了基本的数据处理、逻辑运算、分支跳转、数据存储和输入输出等指令。

汇编指令的灵活运用可以实现各种复杂的功能,因此掌握51单片机的汇编指令是开发嵌入式系统的重要基础。

1. 基本数据处理指令51单片机汇编指令集包括了一系列基本的数据处理指令,如加法(add)、减法(sub)、乘法(mul)、除法(div)等。

这些指令用于实现对数据的基本运算操作。

2. 逻辑运算指令逻辑运算指令用于实现各种逻辑运算,如与(and)、或(or)、非(not)、异或(xor)等。

这些指令通常用于处理数据的开关控制、状态判断等功能。

3. 分支跳转指令分支跳转指令用于实现程序的流程控制。

常用的分支跳转指令包括无条件跳转(jmp)、条件跳转(jz、jnz、jc、jnc等)、循环跳转(loop)等。

这些指令可以根据条件和需求设置程序的执行流程,实现各种循环、分支等功能。

4. 数据存储指令数据存储指令用于实现数据的存储和加载操作。

常用的存储指令包括将数据存储到寄存器或内存中(mov)、将数据从寄存器或内存中加载(ld)等。

这些指令通过对数据的存储和加载,实现对数据的读写操作。

5. 输入输出指令输入输出指令用于实现与外设的数据通信。

常用的输入输出指令包括从端口输入(instr)、输出到端口(outstr)等。

这些指令通过与外部设备的数据交互,实现嵌入式系统与外设的连接。

除了以上的基本指令外,51单片机还提供了一些伪指令,用于程序的组织和调试。

这些伪指令包括宏指令、条件编译指令、调试指令等。

1. 宏指令宏指令是一种通过宏展开的方式来扩展汇编代码的指令。

它通过提前定义一些宏,并在代码中使用这些宏来生成更复杂的汇编代码。

宏指令的好处是可以简化代码的书写,使得程序的逻辑更清晰。

2. 条件编译指令条件编译指令用于根据编译时的条件来选择性地编译代码。

《汇编语言》学习笔记6——伪指令

《汇编语言》学习笔记6——伪指令

《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。

它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。

但程序中没伪指令,则系统就⽆法完成编译。

2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。

⼀般的,段名和段的意义⼀致,便于识别。

2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。

3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。

2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。

在连接时,类别标识相同的段放在连续的存储区中。

(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。

汇编语言程序常见错误分析

汇编语言程序常见错误分析

根据上表所反映的情况,笔者作了如下数据统计及分析:1、能正常登录的网站注249个,占调查总体样本容量的68.06%,不能登录的占31.94%,说明甘肃旅游网站的硬件建设依然存在较多问题,或者网站的所有方申请了域名后由于某种原因而放弃了其使用权。

2、在能统计出网站设计建设方的29个网站中,企业/组织自主开发的网站4个,占13.79%;委托其他企业/组织开发的网站25个,占86.21%。

说明甘肃旅游企业或组织缺乏技术,自主开发能力低。

3、能正常登录且能统计主页栏目数网站(45个)的主页栏目数平均值为9.71,这在一定程度上反映出甘肃旅游网站内容较为单一,这可能也是影响浏览量的一个因素。

4、有外文(含中文繁体)版注3网页的网站14个,占能正常登录的网站总数的28.57%,没有建设外文网业的比重较大(71.43%)。

说明甘肃旅游企业/组织的对外意识淡薄。

由于语言障碍,致使甘肃数量众多的优质旅游资源不能直接通过网络来吸引更多的国外游客,这也在一定程度上影响了国际客源地市场的来甘旅游量。

5、有在线预定(包括酒店、机/车票、线路预定等)功能的网站29个,占能正常登录网站总数的59.18%。

说明甘肃旅游企业/组织已经具备了在线交易的意识。

有在线支付功能的网站4个,占有在线预定功能网站总数的13.79%。

说明甘肃旅游网站实际能进行在线交易的很少,绝大部分只是简单的介绍旅游知识和旅游线路等,以信息公布为主要内容,对实现供需双方网上信息即时交换和网上交易等功能不全,不能真正发挥出电子商务网站的作用。

甘肃旅游电子商务仍处于较低发展层次。

6、值得一提的是,兰州雁滩宾馆的网站(yantanhotel.com),只有英文版,而没有中文版,链接的全是外国酒店,且与本酒店经营业务毫无联系。

白银区旅游网(byqtour.com)、崇信旅游网(chongxintour.com)的页面全是英文而无中文,且与旅游毫无联系。

打开甘肃旅游(xoxo113.8u8.com)网站,看到的却是推荐网民注册免费邮箱的信息。

汇编常见伪指令

汇编常见伪指令

汇编常见伪指令汇编常见伪指令转⾃:⼀、与宏有关的伪指令在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。

9.3.1 局部标号伪指令LOCAL在宏定义体中,如果存在标号,则该标号要⽤伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于⼀次引⽤该宏时,汇编程序在进⾏宏扩展后将会给出:标号重复定义的错误。

伪指令LOCAL的⼀般格式如下:LOCAL 标号1, 标号2, ……伪指令LOCAL必须是伪指令MACRO后的第⼀条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。

汇编程序在每次进⾏宏扩展时,总是把由LOCAL说明的标号⽤⼀个唯⼀的符号(从??0000到??FFFF)来代替,从⽽避免标号重定义的错误。

例9.7 编写求⼀个求绝对值的宏。

解:⽅法1:ABSMACROword1CMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展后所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE next 1 NEG BX 1 next:… ABS AL 1 CMP AL, 0 1 JGE next 1 NEG AL 1 next:在上述程序⽚段中,显然标号next定义了⼆次,所以,汇编程序将显⽰“标号重复定义”的错误信息。

为了避免这种情况的发⽣,我们需要⽤下⾯的⽅法来定义该宏。

⽅法2:ABSMACROword1LOCALnextCMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展时所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE ??0000 1 NEG BX 1 ??0000:… ABS AL 1 CMP AL, 0 1 JGE ??0001 1 NEG AL 1 ??0001:在上述程序⽚段中,宏体内部的局部标号next分别⽤符号??0000和??0001来对应它的⼆次引⽤。

8086汇编语言伪指令

8086汇编语言伪指令

一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。

例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。

伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。

高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。

与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。

2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。

二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。

数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。

例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。

第6章 ARM汇编伪指令与伪操作

第6章 ARM汇编伪指令与伪操作

LCLA variable
LCLL variable
LCLS variable
其中:
variable
所说明的局部变量名称。
TM
23
23
全局变量定义GBLA、GBLL及GBLS 语法格式
GBLA variable
GBLL variable
GBLS variable
TM
5
5
伪指令语句: LDR R0, =0x0AA00;R0<—0x0AA00 汇编后: MOV R0, #43520
TM
6
6
2.中等范围地址读取伪指令ADRL 它将基于PC相对偏移的地址值或基于寄存器
相对偏移的地址值读取到寄存器中。
ADRL{cond} register , = expression
TM
20
20
2. GNU ARM开发工具
GNU是“GNU‘s Not Unix”的递归缩写。在1983年 9月27日由Richard Stallman公开发起GNU计划, 它的目标是创建一套完全自由的操作系统。
GNU格式ARM汇编语言程序主要是面对在ARM平 台上移植嵌入式Linux操作系统,GNU组织开发的 基于ARM平台的编译工具有主要由GNU的汇编器 as,交叉汇编器gcc和连接器ld组成。
TM
21
21
6.3 ARM汇编伪操作
ARM公司推出的开发工具所支持的汇编伪操 作包括符号定义伪操作、数据定义伪操作、 汇编信息报告控制伪操作、汇编代码控制伪 操作、文件包含伪操作、指令集类型标识伪 操作以及其他功能伪操作。
TM
22
22
符号定义伪操作_表6-1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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列出其格式。

表--1数据形式格式取值范围例如备注2进制 ********B 0,1 10011100B10进制 ****** 0,1,2...9 45723 缺省基数标记16进制 ****H 0,1...E,F 0CDE3H 最前面一个字符应是0--9ASCII '**' ASCII 'AD' 只有DB命令中使用常量以数值形式直接写在汇编语言的语句中称为字面常量,若预先为它定义一个符号名,然后在语句中用符号名来表示该常量称符号常量。

使用符号常量的优点可改善程序的可读性,它的定义需要使用伪操作命令"EQU"或“=“。

(2) 数值运算宏汇编中,所有参数值均被认为是整数,并以16位的形式存放,表示的范围是0---65535,所有算术操作均对整数以补码形式运算。

(1) 基本运算汇编语言对常量允许进行算术运算,逻辑运算,分离运算等三种类型的运算。

如表--2所示。

表--2 基本运算运算操作含义以ADD为例算 + 加操作 ADD A,R1+36- 减操作 ADD A,R1-2EH* 乘操作 ADD A,R1*0E3H术 / 除操作 ADD A,R1/23MOD 模除 ADD A,R1 MOD 12SHR 右移 ADD A,R1 SHR 3SHL 左移 ADD A,R1 SHL 2逻 AND 与操作 ADD A,R1 AND 10000101BOR 或操作 ADD A,R1 OR 00110000BXOR 异或操作 ADD A,R1 XOR 36H辑 NOT 非操作 ADD A, NOT 45H分 HIGH 高字节分离 ADD A, HIGH 05E2H离 LOW 低字节分离 ADD A, LOW 77F0H说明: R1为符号常量。

(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所示。

表--3 伪操作指令序号分类伪操作指令1 符号定义伪操作 EQU,=,DATA,BYTE,WORD,BIT,SET2 段定义伪操作 ORG,END,CSEG,DSEG,XSEG,FSEG,ENDS3 数据定义伪操作 DB,DW,DS4 列表伪操作 $TITLE,$SUBTTL,$PAGE,$LIST,$NOLIST,$NOCODE5 条件伪操作 IF,ELSE,ENDIF6 宏处理伪操作 MACRO,ENDM7 其它 ALTNAME,INCLUDE2、1 符号定义伪操作符号定义伪操作及其格式: 符号名符号定义名常量或表达式其中符号定义名可以为EQU,=,DA TA,BYTE,WORD,BIT,SET等。

下面就是这些符号定义伪操作的用法及说明。

如表--4所示。

表--4 符号定义伪操作符号定义名用法说明EQU 为常量,符号名等定义符号化常量名符号名不能重名定义= 为常量,符号名等定义符号化常量名符号名不能重名定义DATA 用来为一个字节类型的符号定值符号名不能重名定义BYTE 用来为一个字节类型的符号定值符号名不能重名定义WORD 用来为一个字类型的符号定值符号名不能重名定义8051中没有字操作BIT 用来定义一个字位类型SET 用来定义整数类型的符号名符号名可重名定义DATA与BYTE的区别: DA TA与BYTE是相类似的伪指令。

当程序运行到DA TA伪指令定义的符号名时,该符号名将被显示;而由BYTE定义的符号名不被显示。

2、2 段定义伪操作(1) ORG 用于设臵或改变程序计数器的值。

其格式为: ORG 常数或表达式例如: ORG 0008HORG $+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,DA TA,BYTE,WORD,EDNS等组成。

无目标码生成。

外部段(XSEG) 由外部工作寄存区和RAM组成。

使用方法同数据段。

无目标码生成。

功能段(FSEG) 由特殊寄存器位臵组成(如:输入/输出部件,计时器,中断控制和连续的寄存器部件接口等)。

无目标代码生成。

位段(BSEG) 由一些独立的位组成,可以用布尔函数实现。

该段地址被解释为位地址。

无目标代码生成。

表--6 程序分段的类型符号段标号(Label) 字节型操作数(Byte) 字型操作数(Word)代码段CSEG LDW数据段DSEG DDW外部段XSEG XXE功能段FSEG FFG位段BSEG BBB说明: (1)在不同的段中类型符号不同;(2)字节型操作数(Byte)一般通过DA TA指令赋给符号; 字型操作数一般通过WORD指令赋给符号;(3)如果各段中用BYTE赋值,则在各段中符号全以S表示;在SIM51模拟/调试中的符号区显示功能中,对BYTE赋值的将被跳过。

(4)在各段中,位类型可以用BIT指令赋给。

相关文档
最新文档