汇编伪指令和编译出错说明
汇编伪指令和编译出错说明
汇编伪指令和编译出错说明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 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单片机的汇编指令是开发嵌入式系统的重要基础。
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——伪指令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汇编语言伪指令
一、伪指令详解伪指令在百度百科中的定义为:伪指令(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汇编伪指令与伪操作
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
汇编程序MASM5.0编译出错信息表中文说明
汇编程序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用错.。
编写汇编语言常见错误分析
编写汇编语言常见错误分析一、汇编软件汇编失败原因分析:这里采用Keil C51软件包中的宏汇编器A51作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误会造成汇编失败,常见的汇编错误如下:1. 标号重复:常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。
2.标点符号以全角方式输入:汇编程序要求标点符号为半角方式,否则汇编失败。
可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。
3.数值#FFH 前遗漏0:根据要求应该在a~f前加0,写成#0FFH4.字母O和数字0搞混:有时候这两个字看上去完全相同,要注意哦~~5.标号后边遗漏':'6.标号使用了特殊字符:标号不能用指令助记符、伪指令、特殊功能寄存器名和8051在指令系统中用的“#”、“@”等,长度以2~6字符为宜,第一字母必须是英文字母。
比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。
7.AJMP跳转超过2K地址:AJMP属于短跳转命令,有2K地址范围的限制。
8.超过地址范围:JB P3.2,EXIT跳转超过-128~127个地址范围。
这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把JB P3.2,EXIT转换成JNB P3.2,LD01AJMP EXITLD01: AJMP EXIT9.字母I和数字1混淆:冒失鬼的常见问题。
10.创造发明不存在的汇编语言指令:在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。
11.符号“:”“;”最好用半角书写。
二、程序出错:1.寄存器重复调用:比如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。
2.硬件不熟悉:单片机一般采用下拉输出,往往端口输出0驱动外设工作,和常见的正逻辑相反,容易搞错。
汇编错误总结
汇编错误总结1、test.asm(54): error A2000: Block nesting error 、说明:此错误信息通常见于一个段定义起始段名和末尾段名不一致。
说明:此错误信息通常见于一个段定义起始段名和末尾段名不一致。
修改:检查段定义,使段名前后保持一致。
修改:检查段定义,使段名前后保持一致。
2、test.asm(5): error A2005: Symbol is multidefined: DATA说明:符号重复定义了。
说明:此错误信息提示 DATA 符号重复定义了。
修改:重新设置。
修改:将其中一个符号 DATA 重新设置。
3、test.asm(7): error A2009: Symbol not defined: B9H 、说明:行指令出错,查看该指令,说明:此错误信息为test.asm 中第 7 行指令出错,查看该指令,源操作数为十六进制数 B9H。
按规定以字母开始的十六进制数,应在其。
按规定以字母开始的十六进制数,以便汇编程序区分常数和符号。
前面加上数字 0 以便汇编程序区分常数和符号。
另一种出错的可能原因是程序中使用的符号变量没有定义。
能原因是程序中使用的符号变量没有定义。
修改:修改:以 0B9H 取代 B9H;使用伪指令定义变量。
;使用伪指令定义变量。
4、test.asm(11): error A2009: Symbol not defined: NO 、说明:说明:test.asm 中第 11 行指令 JLE no-count,符号中使用了中折线,中,符号中使用了中折线,折线在汇编中是作为减号,因此,没有定义。
折线在汇编中是作为减号,因此,汇编提示标号 NO 没有定义。
注意,汇编语言规定符号中可以使用下划线。
注意,汇编语言规定符号中可以使用下划线。
修改:修改:将 no-count 改为 no_count。
5、test.asm(28): error A2010: Syntax error 、说明:此错误信息提示源程序中第 28 行的指令语句的语法与任何可识别说明:的语法不匹配,出错。
汇编语言常见错误信息解释_2
汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息.如操作人员指定的列表文件名(即.LST),汇编程序亦将在列表文件中出错的下面给出出错信息,以便操作人员即时查找错误,给予更正.MASM5.0出错信息格式如下:源程序文件行:WARNING/ERROR错误信息码:错误描述信息其中,错误描述信息码由五个字符组成,第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出错类别:'2'为严重错误,'4'为严肃警告,'5'为建议性警告,最后三位为错误编号.错误编号错误描述Block nesting error嵌套出错.嵌套的过程,段,结构,宏指令或重复块等非正常结束.例如在嵌套语句中有外层的结束语句,而无内层的结束语局1Extra characters on line一语句行有多余字符,可能是语句中给出的参数太多2Internal error-Register already defined这是一个内部错误.如出现该错误,请记下发生错误的条件,并使用Product Assistance Request表与Microsoft公司联系3Unkown type specifer未知的类型说明符.例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等4Redefinition of symbol符号重定义.同一标识符在两个位置上定义.在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误5Symbol is multidefined符号多重定义.同一标识符在两个位置上定义.在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误6Phase error between passes两次扫描间的遍错.一个标号在二次扫描时得到不同的地址值,就会给出这种错误.若在启动MASM时使用/D 任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误7Already had ELSE clause已有ELSE语句.在一个条件块里使用多于一个的ELSE语句8Must be in conditional block没有在条件块里.通常是有ENDIF或ELSE语句,而无IF语句9Symbol not defined符号未定义,在程序中引用了未定义的标识符10Syntax error语法错误.不是汇编程序所能识别的一个语句11Type illegal in context指定非法类型.例如对一个过程指定BYTE类型,而不是NEAR或FAR12Group name must be unique组名应是唯一的.作为组名的符号作为其他符号使用13Must be declared during pass1必须在第一遍扫描期间定义.在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误.14Illegal public declaration一个标识符被非法的指定为PUBLIC类型15Symbol already defferent kind重新定义一个符号为不同种类符号.例如一个段名重新被当作变量名定义使用16Reserved word used as symbol把汇编语言规定的保留字作标识符使用17Forward reference illegal非法的向前引用.在第一遍扫描期间,引用一个未定义符号.18Operand must be register操作数位置上应是寄存器,但出现了标识符19Wrong type of register使用寄存器出错20Operand must be segment or group应该给出一个段名或组名.例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等21Symbol has no segment不知道标识符的段属性22Operand must be type specifier操作数应给出类型说明,如NEAR,FAR,BYTE等23Symbol alread defined locally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识24Segment paraneters are changed段参数被改变.如同一标识符定义在不同段内25Improper align/combin type段定义时的定位类型/组合类型使用出错26Reference to multidefined symbol指令引用了多重定义的标识符27Operand expected需要一个操作数,只有操作符28Operator expected需要一个操作符,但只有操作数29Divdsion by0or overflow除以0或溢出30Negative shift count运算符SHL或SHR的移位表达式值为负数31Operand type must match操作数类型不匹配.双操作数指令的两个操作数长度不一致,一个是字节,一个是字32Illegal use of external外部符号使用出错33Must be record field name应为记录字段名.在记录字段名位置上出现另外的符号34Must be record name or field name应为记录名或记录字段名.在记录名或记录字段名位置上出现另外的符号35Operand must be size应指明操作数的长度(如BYTE,WORD等).通常使用PTR运算即可改正36Must be variable,label,or constant应该是变量名,标号,或常数的位置上出现了其他信息37Must be stucture field name应该为结构字段名.在结构字段名位置上出现了另外的符号38Lefe operand must segment操作数的左边应该是段的信息.如设DA1,DA2均是变量名,下列语句就是错误的:\"MOV AX,DA1:DA2\".DA1位置上应使用某段寄存器名39One operand must constant操作数必须是常数.40Operand must be in same segment or one constant\"—\"运算符用错.例如\"MOV AL,—VAR\",其中VAR是变量名,应有一常数参加运算.又如两个不同段的变量名相减出错41Normal type operand expected要求给出一个正常的操作数.42Constant expected要求给出一个常数.43Operand must have segment运算符SEG用错.44Must be associated with data在必须与数据段有关的位置上出现了代码段有关的项45Must be associated with code在必须与代码段有关的位置上出现了数据段有关的项46Multiple base registers同时使用了多个基址寄存器.如\"MOV AX,[SI][BP]\"47Multiple index registers同时使用了多个变址寄存器.如\"MOV AX,[SI][DI]\"48Must be index or base register指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器.49Illegal use of register非法使用寄存器出错50Value is out of range数值太大,超过允许值.例如:\"MOV AL,100H\"51Operand not in current CS ASSUME segment操作数不在当前代码段内.通常指转移指令的目标地址不在当前CS段内52Improper operand type操作数类型使用不当.例如:\"MOV VAR1,VAR2\".两个操作数均为存储器操作数,不能汇编出目标代码53Jump out of range by%ld byte条件转移指令跳转范围超过-128~127个字节.出错厂,信息同时给出超过的字节数54Index displacement must be constant变址寻址的位移量必须是常数55Illegal register value非法的寄存器值.目标代码中表达寄存器的值超过756Immediate mode illegal不允许使用立即数寻址.例如\"MOV DS,CODE\"其中CODE是段名,不能把段名作为立即数传送给段寄存器DS 57Illegal size for operand使用操作数大小(字节数)出错.例如:使用双字的存储器操作数58Byte register illegal要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器59Illegal uer of CS register指令中错误使用了段寄存器CS.如:\"MOV CS,AX\"CS不能做目的操作数60Must be accumulator register要求用AX或AL的位置上使用可其他寄存器.如IN,OUT指令必须使用累加器AX或AL61Improper uer of segment register不允许使用段寄存器的位置上使用了段寄存器.如\"SHL DS,1\"62Missing or unreachable CS试图跳转去执行一个CS达不到的标号.通常是指缺少ASSUME语句中CS与代码段相关联63Operand combination illegal双操作数指令中两个操作数组合出错64Near JMP/CALL to different CS试图用NEAR属性的转移指令跳转到不在当前段的一个地址65Label cannot have segment override段前缀使用出错66Must have instuction agter prefix在重复前缀REP,REPE,REPNE后面必须有指令67Cannot override ES for destination串操作指令中目的操作数不能用其他段寄存器替代ES68Cannot address with srgment register指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联69Must be in segment block指令语句没有在段内70Cannot use EVEN or ALIGN with byte alignment在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令71Forward needs override or FAR转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定72Illegal value for DUP count操作符DUP前的重复次数是非法的或未定义73Symbol id already external在模块内试图定义的符号,它已在外部符号伪指令中说明74DUP nesting too deep操作数DUP的嵌套太深75Illegak use of undefinde operand()不定操作符\"\"使用不当.例如\"DB10H DUP(2)\"76Too many valer for struc or record initialization在定义结构变量或记录变量时,初始值太多77Angle brackets requored around initialized list定义结构体变量时,初始值未用尖括号()括起来78Directive illegal structure在结构体定义中的伪指令使用不当.结构定义中的伪指令语句仅二种:分号(;)开始的注释语句和用DB,DW 等数据定义伪指令语句79Override with DUP illegal在结构变量初始值表中使用DUP操作符出错80Field cannot be overridden在定义结构变量语句中试图对一个不允许修改的字段设置初值81Override id of wrong type在定义结构变量语句中设置初值时类型出错82Circular chain of EQU aliases用等值语句定义的符号名,最后又返回指向它自己.如:A EQU BB EQU A83Cannot emulate cooprocessor opcode仿真器不能支持的8087协处理器操作码84End of file,not END directive源程序文件无END文件85Data emitted with no segment语句数据没有在段内汇编语言程序设计1.在MASM编译时产生警告错误“Operand types must match”能够忽略吗?答:不能,如语句:MOV AL,BX就会产生上述错误信息,原因是AL和BX两个操作数的字长不匹配。
51单片机汇编伪指令
/littlebird100/260038/Message.aspx最近在学KEIL在进行编译时,生成的SRC文件,里面的许多命令都不大知道,于是自己找资料查了查。
现总结如下,希望对大家有点帮助。
为了大家查找方便,命令按字母排序:1、 ALTNAME功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中。
格式: ALTNAME 保留字自定义名注意: 自定义名与保留字之间首字符必须相同。
2、BIT功能:指令用于将一个位地址赋给指定的符号名。
指令格式:符号名BIT 位地址经BIT 指令定义过的位符号名不能更改。
例如:X_ON BIT 60H ;定义一个绝对位地址X_OFF BIT 24h.2 ;定义一个绝对位地址3、 BSEG功能:绝对选择指令指令BSEG选择绝对位寻址数据段指令格式如下:BSEG [A T 绝对地址表达式]4、CODE功能:用于将程序存储器ROM 地址赋给指定的符号名。
指令格式:符号名CODE 表达式例如:RESET CODE 00H5、CSEG功能:绝对选择指令CSEG选择绝对代码段;指令格式如下:CSEG [A T 绝对地址表达式]6、DATA(BYTE)功能:指令用于将一个内部RAM 的地址赋给指定的符号名指令格式:符号名DA TA 表达式数值表达式的值应在0~255 之间,表达式必须是一个简单再定位表达式。
例如:REGBUF DA TA(BYTE)40HPORT0 DA TA(BYTE)80HDA TA与BYTE的区别: DA TA与BYTE是相类似的伪指令。
当程序运行到DA TA 伪指令定义的符号名时,该符号名将被显示;而由BYTE定义的符号名不被显示。
7、DB功能:DB伪指令用于定义一个连续的存储区,给该存储区的存储单元赋值。
该伪指令的参数即为存储单元的值,在表达式中对变元个数没有限制,只要此条伪指令能容纳在源程序的一行内,其格式为:标号:DB 表达式只要表达式不是字符串,每一表达式值都被赋给一个字节。
arm汇编伪指令详解(转载)
arm汇编伪指令详解(转载)4.1 ARM汇编器所⽀持的伪指令在ARM汇编语⾔程序⾥,有⼀些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。
伪指令在源程序中的作⽤是为完成汇编程序作各种准备⼯作的,这些伪指令仅在汇编过程中起作⽤,⼀旦汇编结束,伪指令的使命就完成。
在ARM的汇编程序中,有如下⼏种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
4.1.1 符号定义(Symbol Definition)伪指令符号定义伪指令⽤于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令有如下⼏种:— ⽤于定义全局变量的GBLA、GBLL和GBLS。
— ⽤于定义局部变量的LCLA、LCLL和LCLS。
— ⽤于对变量赋值的SETA、SETL、SETS。
— 为通⽤寄存器列表定义名称的RLIST。
1、 GBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS)全局变量名GBLA、GBLL和GBLS伪指令⽤于定义⼀个ARM程序中的全局变量,并将其初始化。
其中:GBLA伪指令⽤于定义⼀个全局的数字变量,并初始化为0;GBLL伪指令⽤于定义⼀个全局的逻辑变量,并初始化为F(假);GBLS伪指令⽤于定义⼀个全局的字符串变量,并初始化为空;由于以上三条伪指令⽤于定义全局变量,因此在整个程序范围内变量名必须唯⼀。
使⽤⽰例:GBLA Test1 ;定义⼀个全局的数字变量,变量名为Test1Test1 SETA 0xaa ;将该变量赋值为0xaaGBLL Test2 ;定义⼀个全局的逻辑变量,变量名为Test2Test2 SETL {TRUE} ;将该变量赋值为真GBLS Test3 ;定义⼀个全局的字符串变量,变量名为Test3Test3 SETS “Testing” ;将该变量赋值为“Testing”2、 LCLA、LCLL和LCLS语法格式:LCLA(LCLL或LCLS)局部变量名LCLA、LCLL和LCLS伪指令⽤于定义⼀个ARM程序中的局部变量,并将其初始化。
编译、汇编、反编译、反汇编、伪指令区别
编译、汇编、反编译、反汇编、伪指令区别
编译、汇编、反编译、反汇编、伪指令区别
2010-11-30 10:18 编译就是把高级语言变成计算机可以识别的二进制语言,利用编译程序从源语言编写的源程序产生目标程序的过程。
汇编大多是指汇编语言,汇编程序。
把汇编语言翻译成机器语言的过程称为汇编。
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件。
反汇编:将可执行的文件中的二进制经过分析转变为汇编程序。
反编译:将可执行的程序经过分析转变为高级语言的源代码格式,一般完全的转换不太可能,编译器的优化等因素在里面。
伪指令(伪汇编指令),用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
将相对
于程序或相对于寄存器的地址载入寄存器中。
预处理指令(伪编译指令),比如#define 和#ifdef,一般被用来使源代码在不同的执行环境中被方便的修改或
者编译。
源代码中这些指令会告诉预处理器执行特定的操作。
比如告诉预处理器在源代码中替换特定字符等。
汇编语言伪指令
汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。
这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。
它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。
这些助记符称为伪指令,它们所完成的操作称为伪操作。
不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。
一、符号定义伪指令符号定义(Symbol Definition)伪指令用于定义ARM汇编程序中的变量,对变量赋值和定义寄存器别名等,如表1所列。
表1 符号定义伪指令实例:GBLL P_ON ; 定义全局逻辑变量P_ON P_ON SETL {TRUE} ; 给全局逻辑变量P_ON赋值为真LCLA NUM ; 定义局部数字变量NUM NUM SETA 100 ; 给全局数字变量NUM赋值为100RegList RLIST {R0-R5,R8,R10} ; 定义一个寄存器列表RegList,可用微处理器系统结构与嵌入式系统设计(第3版)2; LDM/STM指令访问该列表二、数据定义伪指令数据定义(Data Denfinition)伪指令一般用于为特定的数据分配存储单元,同时完成对已分配存储单元的初始化工作。
数据定义伪指令如表2所示。
表2 数据定义伪指令从使用方法上来讲,数据定义伪指令可以分为以下3类。
1.SPACE伪指令SPACE用于分配一片连续的存储区,并初始化为0。
其中表达式中的数字表示分配的字节数。
SPACE也可以用%代替。
实例:DataSpace SPACE 100 ; 分配连续100字节的存储单元并初始化为0 2.MAP和FIELD伪指令MAP和伪指令FIELD经常结合在一起使用。
MAP用于定义一个结构化的内存表的首地址,可以用“^”替代。
FIELD用于定义一个结构化的内存表中的数据域,可以用“#”代替。
汇编语言伪指令
汇编语言伪指令在编写汇编语言程序时,会用到另一类指令,这类指令仅供汇编程序将源程序翻译成目标程序时使用,本身并不形成机器码,这类指令称为伪指令。
由此可知,指令有二类:(1)汇编指令:是编译后产生气器码的指令。
(2)伪指令:仅供汇编程序使用,编译后不产生气器码的指令。
下面简洁介绍5条伪指令。
1. 汇编起点指令ORG(Origin)指令格式:ORG nn作用:将ORG nn 后的程序机器码或数据存放以nn为首地址的存储单元中。
如在下面的例4-1中,伪指令ORG 2000H 将目标程序从地址2000H处开头存放。
2. 定义字节指令DB (Define Byte)指令格式:[LABEL] DB N1,N2,…,Nm作用:将DB后的8位字节数据N1,N2,…,Nm依次存入以标号LABEL为首地址的存储单元中。
若无标号,则N1,N2,…Nm依次存放在DB上一条指令之后的存储单元中。
如在例4-1中伪指令DB 将字节数据55,38依次存放到以标号LABEL3为首地址的存储单元2100H~2101H中。
3. 定义字指令DW (Define Word)指令格式:[LABEL] DW NN1,NN2,…,NNm作用:将DW后的16位字数据NN1,NN2,…,NNm依次存放到以标号LABEL为首地址的存储单元中,若无标号,则NN1,NN2,…,NNm依次存放在DW上一条指令之后的存储单元中。
在例4-1中,伪指令DW 同样可将字数据5538存放到以标号LABEL3为地址的存储单元2100H~2101H中。
4. 等值指令EQU (Equate)指令格式:LABEL EQU nn作用:将16位地址nn赋给标号LABEL,在例4-1中,伪指令LABEL0 EQU 2100H将地址2100H赋给标号LABEL0。
5. 结束汇编指令END作用:汇编程序编译源程序时,遇到伪指令END,不管END下面是否还有其它指令都将停止编译。
例1 将地址为2100H存储单元中内容55与地址为2101H存储单元内容38进行十进制数相加,运算结果93存放在地址为2102H的存储单元中。
gcc汇编中的伪操作
gcc汇编中的伪操作学习gcc汇编编程,主要是学习gcc中定义的各种伪操作,下⾯是常见伪操作的说明:⼀、段定义伪操作:1. 标⽰段的开始伪操作:.text,.data,.bss说明:这三个伪操作分别表⽰代码段,数据段,未初始化数据段的开始。
2. 定义段指定段的属性。
伪操作:.section格式为:.section name attr例如:.section .data,"a"3. 设置对齐⽅式伪操作.align或.balign (.balignl,balignw)语法格式:.align [align] [, data].balign [align][, data]说明:align 是⼀个数值,表⽰对齐⽅式,如2,4,8,16等。
data⽤来指定进⾏填充的数据。
4. 设置代码位置伪操作:.org语法格式:.org length [,data]说明:.org⽤来从当前位置开始保留⼀段空间,并填充设定的值。
length是字节数,表⽰保留的空间长度。
data⽤来指定进⾏填充的数据。
⼆、指令集定义伪操作1. arm指令集伪操作伪操作:.arm和.thumb说明:.arm表⽰随后的代码是32位arm指令集,.thumb表⽰随后的代码是16位thumb指令集。
2. x86指令集伪操作伪操作:.code 16和.code 32说明:. code 16表⽰随后的代码是16位x86指令集,.code 3表⽰随后的代码是32位x86指令集。
它们⽤于x86平台上。
三、符号定义1. 符号定义伪操作:.equ 或 .set语法格式:.equ symbol, value.set symbol, value说明:symbol 是定义的符号名称,可以是已经定义过的符号。
value表⽰数值或标号。
2. 符号定义伪操作:.equiv语法格式:.equiv symbol, expr其中:symbol 是定义的符号名称,但不能是已经定义过的符号,这是它和.equ的区别。
51单片机汇编指令及伪指令小结
51单片机汇编指令及伪指令小结51单片机汇编指令及伪指令小结51单片机汇编指令小结一、数据传送类指令MOV用法MOVA,RnMOVA,@RiMOVA,#dataMOVA,directMOVRn,AMOVRn,#dataMOVRn,directMOV@Ri,AMOV@Ri,#dataMOV@Ri,directMOVdirect,AMOVdirect,@RiMOVdirect,Rn功能寄存器送累加器立即数送累加器直接寻址单元送累加器累加器送寄存器立即数送寄存器直接寻址单元送寄存器字节数122122周期11111121121222222222221111XCH不能出现两个直接寻址地址R0和R1只能寻址片内低128字节或者片外低256字节MOVX必须通过A与外部RAM传值,另一个操作数必须用寄存器间接寻址MOVC必须通过A进行注意事项MOV指令中不能出现两个工作寄存器间接寄存器寻址只能用R0和R1R0和R1只能寻址片内低128字节或者片外低256字节(SFR不能通过工作寄存器寻址)DPTR为唯一16位寄存器内部RAM单元送累加器1累加器送内部RAM单元1立即数送内部RAM单元2直接寻址单元送内部RAM单元累加器送直接寻址单元内部RAM单元送直接寻址单元寄存器送直接寻址单元址单元223223MOVdirect,#data 立即数送直接寻址单元MOVdirect2,direct1直接寻址单元送直接寻MOVDPTR,#data1616位立即数送数据指针3MOVXMOVXA,@Ri外部RAM单元送累加器1(8位地址)MOVXA,@DPTRMOVX@Ri,AMOVX@DPTR,AMOVCMOVCAA+DPTRXCHXCHD,@外部RAM单元送累加器(16位地址)累加器送外部RAM单元(8位地址)累加器送外部RAM单元(16位地址)查表数据送累加器(DPTR为基址)查表数据送累加器(PC为基址)累加器与寄存器交换累加器与内部RAM单元交换累加器与直接寻址单元交换累加器与内部RAM单元111111121MOVCA,@A+PCXCHA,RnXCHA,@RiXCHA,directXCHDA,@Ri低4位交换PUSH&POPPOPdirectPUSHdirect栈顶弹出指令直接寻址单元直接寻址单元压入栈顶2222用ACC表示累加器堆栈在用户RAM区二、算术运算类指令指令ADD用法ADDA,RnADDA,@RiADDA,directADDA,#dataADDCADDCA,RnADDCA,@RiADDCA,#dataADDCA,directINCINCAINCRnINCdirectINC@Ri功能累加器加寄存器累加器加内部RAM单元累加器加直接寻址单元累加器加立即数累加器加寄存器和进位标志累加器加内部RAM单元和进位标志累加器加立即数和进位标志累加器加直接寻址单元和进位标志累加器加1寄存器加1直接寻址单元加1内部RAM单元加1字节数112211221121周期111111111111注意事项ADD可以产生进位,但不考虑进位加法类指令只能通过A进行加法类的和超过8位时,CY置1,OV置1 ADDC可以产生进位,也考虑进位除了INCA改变奇偶标识位,其他都不改变PSW(不改变CY)INCDPTRDASUBBDAASUBBA,RnSUBBA,@RiSUBBA,#dataSUBBA,directDECDECADECRnDEC@RiDECdirectMUL&MULABDIV数据指针加1十进制调整累加器减寄存器和进位标志累加器减内部RAM单元和进位标志累加器减立即数和进位标志累加器减直接寻址单元和进位标志累加器减1寄存器减1内部RAM单元减1直接寻址单元减1累加器乘寄存器B1111221112121111111114结果存储为BAA、B为单字节无符号数乘积大于255时(结果中B不为0),OV置1CY总为0结果储存为:商A,余数B除数为0时,OV置1与INC类似DIVAB累加器除以寄存器B14三、逻辑运算类指令指令ANL用法ANLA,RnANLA,@RiANLA,#dataANLA,directANLdirect,AANLdirect,#dataORLORLA,RnORLA,@RiORLA,#dataORLA,direct功能累加器与寄存器累加器与内部RAM单元累加器与立即数累加器与直接寻址单元直接寻址单元与累加器直接寻址单元与立即数累加器或寄存器累加器或内部RAM单元累加器或立即数累加器或直接寻址单字节数1122231122周期注意事项111111111元ORLdirect,AORLdirect,#dataXRLXRLA,RnXRLA,@RiXRLA,#dataXRLA,directXRLdirect,AXRLdirect,#dataRLARRARLCARRCACPLACLRA 直接寻址单元或累加器直接寻址单元或立即数累加器异或寄存器累加器异或内部RAM单元累加器异或立即数累加器异或直接寻址单元直接寻址单元异或累加器直接寻址单元异或立即数累加器左循环移位累加器右循环移位累加器连进位标志左循环移位累加器连进位标志右循环移位累加器取反累加器清零2311222311111111111112111111边上一位移入CY,另一侧一位从CY移入ANL、ORL、XRL均可以对接口进行操作四、控制转移类指令类指令用法ACALLaddr11功能2KB范围内绝对调用字节数2周期注意事项2Addr0~10赋给PC0~10PC11~15不变调用时,地址分两次压栈调用时,地址分两次压栈A+DPTR赋给PCLCALLaddr16AJMPaddr11LJMPaddr16SJMPrelJMP@A+DPTRRETRET1JCrel64kb范围内长调用2KB范围内绝对转移64KB范围内长转移-128B~127B相对短转移相对长转移子程序返回中断返回判断CY=1转移323211122222222JNCrelJZrelJNZrelCJNEA,#data,relCJNEA,direct,relCJNERn,#d ata,rel判断CY=0转移累加器为零转移累加器非零转移累加器与立即数不等转移累加器与直接寻址单元不等转移寄存器与立即数不等转移22233332222222221影响CY:前数>=后数,CY=0,反之CY=1CJNE@Ri,#data,relRAM单元与立即数不等转移五、位操作类指令MOVMOVC,bitMOVbit,C直接寻址位送CC送直接寻址DJNZRn,relDJNZdirect,relNOP直接寻址单元减1不为零转移空操作寄存器减1不为零转移2312212Bit为RAM中20H~2FH中128个可寻址位,或SFR中可寻址储存单元必须通过C传送SETBJBbit,relJNBbit,relJBCbit,relSETBCSETBbit(bit)为1则转移并清零3331222211逻辑操作与字节中的一致51汇编常用伪指令16位地址:此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址;2.【标号】DB字节数据项表:奖项表中的字节数据存放到从标号开始的连续字节单元中。
汇编语言第3次实验报告:编译及伪指令功能分析
3观察和理解系统对段寄存器及IP及SP的管理。
实验环境
1X86系列桌面系统;
2UltraEdit-32、TASM、TLINK、TD。
实验内容
按实验代码asmtest.asm中的10个步骤完成相关内容,并做记录。
实验记录
1目标代码数据段常量bits定义语句的编译结果是在数据段不留痕迹,说明编译程序没有给常量分配储存单元。
6目标代码变量x在定义语句的编译结果:偏移量为0000H;初值为0008H。
7目标代码变量x在引用语句的编译结果[0000],对应的寻址方式是直接寻址方式。
8将变量定义语句y的注释打开,目标代码变量x的偏移量被更改为为[0002],这体现了编译程序对变量的自动管理功能。
9实验代码要求注释的四个位置应注释为:
四川大学计算机学院、软件学院
实验报告
学生姓名
夏超
学号
1143041054
班级
113040115
学生专业
计算机科学与技术学院Leabharlann 计算机学院课程名称
汇编语言程序设计(第三次)
实验时间
2010年11月6日
实验项目
编译及伪指令功能分析
报告撰写时间
2010年11月6日
实验目的
1用TD观察标号、常量和变量编译后的结果,加深对伪指令行为的理解;
按16进制数,显示x的偏移量。
按16进制数,显示x的值。
按16进制数,显示标号的段基址。
按16进制数,显示标号的偏移量。
教师评议
成绩评定:指导教师签名:
目标代码数据段常量bits定义语句的编译结果是在数据段不留痕说明编译程序没有给常量分配储存单元目标代码常量bits引用语句的编译结果0ach对应的寻址方式是立即数寻址方式目标代码标号lop定义语句的编译结果是不留痕迹说明目标代码标号lop引用语句的编译结果0fah本质上该值是当前ip地址与目标地址的差值将两nop语句的注释开编译后目标代码标号lop引用语句的编译结果是0f8h这体现了编译程序对标号的自动管理功能目标代码变量x在定义语句的编译结果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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指令赋给。