版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章汇编语言程序设计主要内容汇编语言程序结构和段分配符号和符号名字表达式和操作符控制语句条件汇编宏的定义和调用设计实例一:LED驱动和控制设计实例二:按键中断和LED控制汇编语言程序结构和段分配所谓的汇编语言程序就是按照一定的规则组合在一起机器语言助记符和汇编器助记符命令这些按一定规则组合在一起的汇编语言助记符机器指令,能通过KeilMDK软件的处理,转换成可以在STC32G系列32位单片机处理器核上按照设计要求运行的机器代码汇编语言程序结构和段分配
--汇编语言程序框架一个完整的可以运行在STC32G系列单片上的汇编语言程序代码下面的汇编语言程序将保存在STC32G系列单片机程序存储器中(即CODE段,具体地址由TABLE符号指定)中的4个常数0x0123、0x4567、0x89ab、0xcdef搬移到STC32G系列单片机内的数据存储器中(即EDATA段,具体地址由STORE指定)汇编语言程序结构和段分配
--汇编语言程序框架
data_seg1SEGMENTCODE;定义代码段data_seg1RSEGdata_seg1;引用该段TABLE:DW0x0123,0x4567,0x89ab,0xcdef;该段内定义了4个16位常数data_seg2SEGMENTEDATA;定义EDATA段data_seg2RSEGdata_seg2;引用该段STORE:DSW4;该段保留4个16位字空间汇编语言程序结构和段分配
--汇编语言程序框架prog_segSEGMENTCODE;定义代码段prog_seg RSEGprog_seg;应用该段LJMPmain;跳转到main入口 ORG0x0220;强制偏移到代码段位置0x0220main:;main入口MOVDPTR,#TABLE;将TABLE的地址加载到DPTR MOVWR0,#STORE;将STORE的地址加载到WR0MOVR4,#0x04;将循环次数4加载到寄存器R4CON:;标号CON MOVA,#0x0;累加器A初始化为0 MOVCA,@A+DPTR;将指向TABLE的数据元素加载到累加器A汇编语言程序结构和段分配
--汇编语言程序框架MOVR2,A;累加器A的内容加载到寄存器R2 INCDPTR;16位寄存器DPTR加1,指向下一个元素 MOVA,#0x0;累加器A初始化为0 MOVCA,@A+DPTR;将指向TABLE的下一个数据元素加载到累加器AMOVR3,A;将累加器A的内容加载到寄存器R3 MOV@WR0,WR2;WR2内容保存到WR0指向的数据存储器地址INCDPTR;16位寄存器DPTR加1,指向下一个元素 ADDWR0,#0x2;WR2中的地址加2,指向下一个16位字边界 MOVA,R4;寄存器R4中的循环次数加载到累加器A中汇编语言程序结构和段分配
--汇编语言程序框架SUBBA,#0x1;累加器A递减,即循环次数减1,影响标志位MOVR4,A;将累加器A中的循环次数重新保存到寄存器R4 JNZCON;将标志位Z不等于0时,跳到循环标志CON NOP;否则结束循环END;标记文件的结束汇编语言程序结构和段分配
--汇编代码中段的分配段(segment)是代码块或数据存储器段是可重定位的或绝对的可重定位的段具有名字、类型和其他属性将来自不同模块的相同名字的段看作是同一段的一部分,称为部分段L251链接器/定位器将具有相同名字的多个部分段合并位一个段注:绝对段不能与其他段组合汇编代码中段的分配
--CODE段和常数CODE段,也称为代码段,它是用来保存程序中汇编助记符描述的机器指令部分以及程序中所用到的常数和表格等CODE段放在STC32G系列单片机中的程序Flash存储空间注:CODE段可以由MOVC指令,并且通过DPTR寄存器进行访问汇编代码中段的分配
--DATA段数据段DATA中的存储器位置可以通过直接和间接存储器访问来寻址在兼容MCS-251ISA的STC32G系列单片机实现中SFR在DATA段中的地址大于0x80。SFR的位置只能通过直接访问来寻址汇编代码中段的分配
--DATA段myvarSEGMENTDATA;定义DATA段myvarRSEGmyvar;引用该段VALUE:DS1;在DATA空间保存一个字节
IO_PORT2DATA0A0H;特殊功能寄存器中IO_PORT2的地址VALUE2DATA20H;存储器的绝对地址汇编代码中段的分配
--DATA段myprogSEGMENTCODE;定义CODE段myprogRSEGmyprog;引用该段LJMPmain;无条件跳转到main
ORG0200H;定位到代码段中地址为200H的位置main:MOVA,IO_PORT2;端口IO_PORT2的值0xFF加载到累加器AMOVVALUE,#0xa5;立即数#0xa5保存到VALUE指向的存储单元ADDA,VALUE;(A)+(VALUE)→(A),0xFF+0xA5→0xA4=(A)MOVVALUE2,A;累加器A的值保存到VALUE2指向的存储器单元MOVR1,#VALUE;将VALUE存储器地址加载到寄存器R1ADDA,@R1;将((R1))+(A)→(A)END汇编代码中段的分配
--BIT段BIT段中的存储器位置可用8051中的位指令寻址位于位可寻址存储器位置中的SFR可以用位指令寻址可位寻址SFR位置为80H、88H、90H、98H、0A0H、0A8H、0B0H、0B8H、0C0H、0C8H、0D0H、0D8H、0E0H、0E8H,0F0H和0F8H(可位寻址的只能是可以被8整除的地址)汇编代码中段的分配
--BIT段mybitsSEGMENTBIT;定义BIT段mybitsRSEGmybits;引用该段FLAG:DBIT1;保留1位空间P1DATA90H;80251中SFR表示端口1ACCDATA0E0H;80251中SFR表示ACC累加器的地址GREEN_LEDBITP1.2;在端口P1的第2引脚P1.2定义符号GREEN_LEDmyprogSEGMENTCODE;定义CODE段myprogRSEGmyprog;引用该段LJMPmain;无条件跳转到mainORG0220H;定位到程序程序器地址为0220H的位置汇编代码中段的分配
--BIT段main:SETBGREEN_LED;将P1.2设置为1JBFLAG,is_on;到DATA的直接访问SETBFLAG;设置FLAGMOVACC,#0xFF;给累加器ACC加载立即数0xFFCLRACC.5;复位ACC的第5位,(ACC)=0xDFCLRACC.7;复位ACC的第5位,(ACC)=0x5Fis_on:CLRFLAG;复位FLAGCLRGREEN_LED;P1.2=0END汇编代码中段的分配
--EBIT段MCS-251ISA为EBIT段提供了扩展位可寻址存储器空间,该空间由扩展位指令寻址MCS-251ISA中,所有SFR也可以使用扩展位指令寻址mybitsSEGMENTEBIT;定义EBIT段mybitRSEGmybits;引用该段 ORG0x90;位地址偏移0x90,等效于0x32.0ZFLAG:DBIT1 ;在0x32.0定义一个位ZFLAGPSW1DATA0D1H;80251中SFRPSW1的地址DATDATA40H;80251中的可位寻址区域汇编代码中段的分配
--EBIT段prog_segSEGMENTCODE;定义CODE段prog_seg RSEGprog_seg;引用该段LJMPmain;跳转到main入口 ORG0220H;强制偏移到程序存储空间的地址0x220main:;程序入口SETBPSW1.1;设置寄存器PSW1的第1位(零标志Z)JBZFLAG,is_on;如果设置了ZFLAG,则跳转到is_on CLRDAT.1;清除位可寻址空间字节地址0x40的第1位is_on:;标号SETBZFLAG;设置ZFLAGCLRPSW1.1;清除寄存器PSW1的第1位(零标志Z)SETBDAT.1;设置位可选址空间字节地址0x40的第1位END汇编代码中段的分配
--IDATA段通过寄存器R0或者R1,程序可以间接寻址保存在IDATA段中的变量
myvarsSEGMENTIDATA;定义IDATA段myvarsRSEGmyvars;引用该段BUFFER:DS10;缓冲区BUFFER保留10个字节PSW1DATA0D1H;定义寄存器PSW1在SFR的地址0xD1
prog_segSEGMENTCODE;定义CODE段prog_seg RSEGprog_seg;引用该段LJMPmain;跳转到main入口 ORG0220H;强制偏移到程序存储器地址为0x220的位置汇编代码中段的分配
--IDATA段main:;main入口MOVR1,#10;将循环次数10加载到寄存器R1MOVA,#0x0;累加器A初始化为0,(A)=0MOVR0,#BUFFER;将BUFFER的地址加载到R0寄存器CON:;标号CON MOV@R0,A;将累加器A的内容保存到R0指向的存储空间INCR0;递增寄存器R0值,指向下一个存储空间地址 INCA;递增累加器A值 SUBR1,#1;递减寄存器R1中的值 JNBPSW1.1,CON;如果PSW1中的z标志不为零,跳转到CON NOP;当PSW1中的z标志为零,退出循环END汇编代码中段的分配
--EDATA段EDATA段只存在于兼容MCS-251ISA的单片机中典型的,在STC32G系列单片机中允许设置EDATA段myvarsSEGMENTEDATA;定义EDATA段myvarsRSEGmyvars;引用该段BUFFER:DSW10;保留10个字空间(20个字节)PSW1DATA0D1H;定义PSW1的SFR地址0xD1prog_segSEGMENTCODE;定义CODE段prog_seg RSEGprog_seg;引用该段LJMPmain;跳转到main ORG0220H;强制偏移到程序存储器的地址0x220汇编代码中段的分配
--EDATA段main:;main入口MOVR6,#10;循环次数10加载到寄存器R6MOVWR0,#1010H;立即数0x1010加载到字寄存器WR0MOVWR4,#BUFFER;将BUFFER的地址加载到寄存器WR4CON:;标号 MOV@WR4,WR0;WR0寄存器内容保存到WR4指向存储空间INCWR4,#2;WR4内保存的地址递增2,指向下一个字 ADDWR0,#1010H;16位寄存器WR0的值加上0x1010 SUBR6,#1;寄存器R6保存的循环次数减1 JNBPSW1.1,CON;若寄存器PSW1的标志位Z≠0,则跳转CON NOP;若寄存器PSW1的标志位Z=0,则退出循环END汇编代码中段的分配
--XDATA段XDATA段可通过寄存器DPTR和MOVX指令访问对于一个单页的XDATA存储空间来说,也可以通过寄存器R0和R1访问myvarsSEGMENTXDATA;定义XDATA段myvarsRSEGmyvars;引用该段BUFFER:DSB10;保留100个字节PSW1DATA0D1H;定义寄存器PSW1在SFR中的地址0xD1prog_segSEGMENTCODE;定义CODE段prog_seg RSEGprog_seg;引用该段LJMPmain;跳转到main ORG0220H;强制偏移到程序存储器的地址0x220汇编代码中段的分配
--XDATA段main:;main入口MOVR6,#10;循环次数10加载到寄存器R6MOVA,#10H;累加器A初始化为0x10,即(A)=0x10 MOVDPTR,#BUFFER;将BUFFER的地址加载到寄存器DPTR中CON:;标号CON MOVX@DPTR,A;将A的内容写到DPTR指向的存储空间上INCDPTR;寄存器DPTR中的地址递增 INCA;寄存器A的值递增 SUBR6,#1;寄存器R6中的循环次数减1 JNBPSW1.1,CON;若寄存器PSW1的零标志z≠0,跳转到CON NOP;若寄存器PSW1的零标志z=0,退出循环END汇编代码中段的分配
--HDATA段和HCONSTHDATA和HCONST存储器只能在兼容MCS-251ISA的单片机中使用MCU指令访问HDATA和HCONST存储器在经典的251设备上使用存储器分组进行仿真HDATA和HCONST存储器可通过DR0...DR28和DR56访问。任何存储器位置均可通过这些寄存器访问汇编代码中段的分配
--HDATA段和HCONSTmyvarsSEGMENTHDATA;定义HDATA段myvarsRSEGmyvars;引用该段BUFFER:DSB10;保留10个字节PSW1DATA0D1H;定义寄存器PSW1在SFR的地址0xD1prog_segSEGMENTCODE;定义CODE段prog_seg RSEGprog_seg;引用该段LJMPmain;跳转到main ORG0220H;强制偏移到程序存储器的地址0x220main:;main入口MOVR6,#10;循环次数10加载到寄存器R6MOVR0,#10H;立即数0x10加载到寄存器R0
汇编代码中段的分配
--HDATA段和HCONST MOVWR8,#WORD2BUFFER;获取BUFFER的高8位地址 MOVWR10,#WORD0BUFFER;获取BUFFER的低8位地址CON:;标号 MOV@DR8,R0;寄存器R0值保存到DR8指向的存储空间INCDR8,#1;DR8内的存储器地址递增 INCR0;寄存器R0的值递增 SUBR6,#1;寄存器R6的循环次数递减1 JNBPSW1.1,CON;若PSW1的标志位Z≠0,跳转到CON NOP;若PSW1的标志位Z=0,退出循环END汇编语言程序结构和段分配
--注释注释是程序开发人员可以在程序中包含的文本行,用于识别和解释程序当编写汇编语言程序时,程序开发人员可以在汇编程序的任何地方包含注释注释必须以分号“;”开头注释可以单独出现在一行上,也可以出现在指令的末尾。比如:;ThisisacommentNOP;Thisisalsoacomment当汇编器识别除一行的分号字符时,它将忽略该行上的后续文本A251汇编器将忽略出现在分号右侧的行上的任何内容注释对目标文件生成或其中包含的代码没有影响第七章汇编语言程序设计汇编语言程序设计
--符号和符号名字符号是定义的一个名字,用来表示一个值、文本块、地址或者寄存器的名字。也可用符号表示常数和表达式符号最多可以由31个字符组成,包括A~Z之间的大写字母a~z之间的小写字母0~9之间的数字下划线“_”问号“?”符号名字可以以除0~9以外的任何字符开头汇编语言程序设计
--符号和符号名字符号可以以多种方式定义在汇编语言程序代码中,可以使用EQU或SET控制语句定义符号,用于表示表达式。例如:NUMBER_FIVEEQU5TRUE_FLAGSET1FALSE_FLAGSET0在汇编语言程序代码中,可以将符号定义为标号。比如:LABEL1:DJNZR0,LABEL1符后也用于引用一个变量的位置。比如:SERIAL_BUFFERDATA99h符号和符号名字
--标号标号定义了程序或数据空间中的“位置”(地址)适用于符号名字的所有规则也适用于标号当定义标号时,标号必须是一行中第一个文本字段它前面可能是制表符或空格在符号名字后面必须紧跟着冒号字符“:”,用于将其标识为标号一行只能定义一个标号符号和符号名字
--标号比如:LABEL1:DS2LABEL2:NUMBER:DB27,33,'STRING',0COPY:MOVR6,#12H在上面的例子中,LABEL1、LABEL2、NUMBER和COPY都是标号符号和符号名字
--标号标号可以指程序代码、基本数据或扩展数据存储器中的变量空间,也可以指程序在程序或代码空间中的常数数据此外,程序开发人员也可以使用标号将程序执行转移到其他位置标号后面的指令可以通过使用标号来引用程序可以跳转到标号或调用标号。在标号后面的代码将被立即执行在调试程序代码时,标签可以给仿真器和调试器提供消息仿真器或调试器可以在调试时提供标号。这将有益于简化调试过程注:标号只能定义一次,不能重新定义它符号和符号名字
--特殊的汇编器标号A251汇编器定义并保留MCS-251ISA中寄存器集的名字在基于MCS-251ISA的汇编程序代码中,这些预定义的名字用于访问处理器核中的寄存器寄存器功能A表示8051单片机处理器核中的累加器。它与许多操作一起使用,包括乘法和除法、将数据移动到外部存储器和从外部存储器移动数据、布尔运算等DPTR寄存器DPTR是16位的数据指针,用于访问XDATA或CODE存储器中的地址数据PC寄存器PC是16位的程序计数器。它包含着下一条要执行指令的地址C进位标志;指示产生进位的操作状态。操作也使用进位标志来表示借位符号和符号名字
--特殊的汇编器标号寄存器功能AB在乘法(MUL)和除法(DIV)指令中,使用寄存器A和寄存器B对R0~R7在当前活动寄存器组中的,8个8位通用8051寄存器。最多可以使用四个寄存器组AR0~AR7表示当前寄存器组中R0~R7的绝对数据地址。这些寄存器的绝对地址根据当前选择的寄存器组而变化。这些符号仅在给出USING汇编语句时才可以使用R8~R15MCS-251ISA中提供的额外8个8位通用寄存器WR0~WR30MCS-251ISA中提供的16个16位通用寄存器。寄存器WR0~WR14与寄存器R0~R15重叠。注意,此处没有可用的WR1DR0~DR28,DR56,DR60MCS-251ISA中提供的10个32位通用寄存器。寄存器DR0~DR28与寄存器WR0~WR30重叠。注意,此处没有可用的DR1、DR2和DR3汇编语言程序设计
--表达式和操作数操作数是与汇编命令或指令一起指定的参数或表达式汇编器命令需要常数或符号的操作数。比如:VVVEQU3DS10h汇编器指令比命令支持的操作数种类更多有些指令不需要操作数,有些指令最多需要3个操作数,多个操作数用逗号分隔。比如:MOVR2,#0所需操作数的个数以及类型取决于指定的指令或命令汇编语言程序设计
--表达式和操作数指令操作数的类型操作数类型功能立即数用作数字值的符号或常数直接位地址引用位地址的符号或常数程序地址引用代码地址的符号或常数直接数据地址引用数据地址的符号或常数间接地址对一个存储器位置的间接引用,(可选)偏移特殊汇编器符号寄存器名字表达式和操作数
--数字数字以十六进制、十进制、八进制和二进制数的形式指定如果没有指定数字的形式,默认为十进制数十进制数、八进制数或二进制数的第一个字符必须是数字(0~9)对于第一个字符不是数字(0~9)的十六进制数,必须在其前面添加一个零进制后缀合法的字符例子十六进制H、h0~9、A~F、a~f1234H、99H、0A0F0H、0FFH十进制D、d0~91234、65590D、20d、123八进制O、o、Q、q0~7177O、7777o、25O、123o、177777O二进制B、b0~11111B、10011111B、101010101B注:(1)十六进制数也可以使用C语言的表示方法,如0x12AB。(2)可以在数字之间插入符号“$”,用于增加数字的可读性,比如:1$2$3$4等效于1234。表达式和操作数
--数字A251汇编器支持指定绝对地址的记数法页面当页面为0或所有其他页面为ECODE时,使用该符号指定的数字将接收存储器类型EDATA通过这种方式,可以使用这些数字来引用任何存储器位置ABSVAL1EQU0:20H;符号用于寻址20HABSVAL2EQU0:80H;符号用于寻址EDATA空间的80HPORT0EQUS:80H;符号用于SFR空间80HENTRYEQU10:2000H;入口点在102000H表达式和操作数
--数字
MOVWR0,ABSVAL1MOVR1,ABSVAL2MOVPORT0,R1EJMPENTRYMOVWR0,0:20H;访问ABSVAL1MOVR1,0:80H;访问ABSVAL2MOVS:80H,R1EJMP10:2000H表达式和操作数
--数字冒号表示法中的数字用下面代替VAL1EQU0:20HVAL1EQUEDATA20HVAL2EQU0FF:1000HVAL2EQUECODE0FF1000HORGOFE:2000H?modulename?numberSEGMENTECODEAT0FE2000HRSEG?modulename?numberORG0:400H?modulename?numberSEGMENTEDATAAT400HRSEG?modulename?numberCSEGAT0FE:2000H?modulename?numberSEGMENTECODEAT0FE2000HRSEG?modulename?numberBVAR1BIT0:20H.1BVAR1BIT20H.1BVAR1BIT0:30H.1BAVR1EQUEBIT30H.1PUSH.B#13PUSHBYTE#13PUSH.W#13PUSHWORD#13表达式和操作数
--数字注:提供冒号符号是为了与其他251宏汇编器兼容。如果不需要将代码移植到其他汇编器,建议在汇编源文件中使用表7.4中的替换序列表达式和操作数
--字符在表达式中可以使用ASCII字符来生成数字值表达式可以由单引号包含的两个ASCII字符组成注:字符个数不能超过两个,否则在对汇编程序处理的过程中会报错表达式值‘A’0041h‘AB’4142h‘a’0061h‘ab’6162h‘’Error:Nullstringisinvalid‘ABC’Error:Morethan2characters表达式和操作数
--字符在汇编语言的任何地方都可以使用字符,它可以用来作为立即数。例如:LETTER_AEQU'A'
TEST:MOV@R0,#'F'SUBBA,#'0'表达式和操作数
--字符串字符串与汇编器描述DB一起使用,用来定义在A251汇编程序中的消息字符串用一对单引号''包含。比如:KEYMSG:DB'Pressanykeytocontinue.'该声明将在KEYMSG指向的缓冲区内生成下面的十六进制数,即:50h、72h、65h、73h、73h、20h、…、6Eh、75h、65h、2Eh此外,也可以在同一行混合字符串和数字数据。比如:EOLMSG:DB'Endofline',00h在该例子中,后面添加的值00h,用于表示字符串“行尾”的结束表达式和操作数
--字符串可以使用两个连续的单引号字符将单引号插入字符串。比如,MSGTXT:DB'ISN''TAQUOTEREQUIREDHERE?'.表达式和操作数
--位置计数器在汇编器中,为每个段保留了一个位置计数器在这个计数器中,包含了指令或者数据的偏移地址位置计数器在每行之后递增该行中代码或数据的字节数默认,将每段的位置计数器初始化为0可以用ORG描述修改位置计数器的初值表达式和操作数
--位置计数器在表达式中,使用“$”符号,用于得到位置计数器当前的值,可以使用位置计数器确定一个字符串的长度。比如:msg:DB'Thisisamessage',0msg_len:EQU$-msg此外,可以在指令中使用位置计数器。比如,下面的指令创建一个无限循环JMP$;while(1)表达式和操作数
--操作符在汇编语言中,操作符可以是一元操作符(即,只有一个操作数);或者二元操作符(即,有两个操作数)操作符及其操作数的组合就构成一个表达式操作符
--优先级括号可用于包含多个运算符的表达式中,以指定运算符的求值顺序如果表达式中未使用括号,则运算符优先级顺序决定求值顺序优先级操作符1(最高)()2NOT、HIGH、LOW、BYTE0,BYTE1,BYTE2,BYTE3、WORD0、WORD23一元+、一元−4*、/、MOD5+、-6SHL(左移)、SHR(右移)7AND、OR、XOR8(最低)EQ、=、NE、<>、LT、<、LTE、<=、GT、>、GTE、>=操作符
--优先级BYTEx根据x所指定操作数的位置,返回相应的字节BYTE0返回最低的字节(与LOW等效);BYTE1返回紧挨BYTE0的字节(与HIGH等效)WORDx根据x指定的操作数的位置,返回相应的字WORD0返回最低的字(16位);WORD2返回最高的两个字节(16位)MSB32位操作数LSBBYTE3BYTE2BYTE1BYTE0WORD2WORD0
HIGHLOW操作符
--类操作符在本章前面介绍了类运算符,它们为表达式分配存储器类这就是将表达式与类关联的方式操作符语法功能BITBIT表达式将类BIT分配给表达式CODECODE表达式将类CODE分配给表达式CONSTCONST表达式将类CONST分配给表达式DATADATA表达式将类DATA分配给表达式EBITEBIT表达式将类EBIT分配给表达式ECODEECODE表达式将类ECODE分配给表达式ECONSTCONST表达式将类ECONST分配给表达式EDATAEDATA表达式将类EDATA分配给表达式IDATAIDATA表达式将类IDATA分配给表达式HCONSTHCONST表达式将类HCONST分配给表达式HDATAHDATA表达式将类HDATA分配给表达式XDATAXDATA表达式将类XDATA分配给表达式操作符
--类型操作符类型运算符为表达式指定数据类型操作符语法功能BYTEBYTE表达式将类BYTE分配给表达式WORDWORD表达式将类WORD分配给表达式DWORDDWORD表达式将类DWORD分配给表达式NEARNEAR表达式将类NEAR分配给表达式FARFAR表达式将类FAR分配给表达式表达式和操作数
--表达式EXTRNCODE(CLAB);代码空间CODE入口EXTRNDATA(DVAR);数据空间DATA的变量
MSKEQU0F0H;定义符号用于代替0xF0VALUEEQUMSK-1;另一个常数的符号值LVALEQU12345678H;LVAL的值为12345678HmyVarEQUEDATA0030H;用16位地址访问变量
FOOSEGMENTCODE;定义代码段CODE的名字FOORSEGFOO;引用该段表达式和操作数
--表达式ENTRY:MOVA,#40H;用常数加载寄存器MOVR5,#VALUE;加载常数符号值MOVR3,#(0x20ANDMASK);计算的例子MOVR7,#LOW(VALUE+20H)MOVR6,#1OR(MSKSHL4)
表达式和操作数
--表达式MOVR0,DVAR+20;从地址DVAR+20加载常数MOVR1,#LOW(CLAB+10);加载地址CLAB+10的低字节MOVWR4,#WORD2(LVAL);加载LVAL的高字MOVDR0,#ENTRY;加载地址的低字,ENTRY到DR0MOVHDR0,#WORD2(ENTRY);加载地址的高字,ENTRY到DR0MOVR4,@DR0;将ENTRY的内容加载到R4MOVmyVar,R1;将R1保存到EDATA变量myVar表达式和操作数
--表达式MOVR5,80H;加载DATA地址.80H(=SFRP0)到R5MOVR5,EDATA80H;加载EDATA地址80H到R5SETB30H.2;设置30H.2的位(长地址)SETB20H.2;设置20H.2的位(短地址)
END;结束第七章汇编语言程序设计控制语句A251汇编器提供了大量的控制语句,允许程序开发人员定义符号值、保留和初始化存储空间,以及控制代码的存储位置这些语句不能和汇编助记符描述的机器指令混淆这些语句不能产生可执行代码,除了DB、DD和DW描述外,它们不影响代码存储器的内容这些控制改变的是汇编器的状态、定义的用户符号和添加到目标文件的信息控制语句
--地址控制
控制语句
--地址控制EVEN迫使位置计数器指向下一个偶数地址(如果当前的位置计数器为奇数)该语句能确保下一个语句对齐字边界如果需要,汇编器产生一个字节的间隙,间隙的定义同ALIGN。例如:MYDATA:SEGMENTDATAWORDRSEGMYDATAvar1:DSB1EVENvar2:DSW1控制语句
--地址控制ORGORG语句更改当前段的位置计数器,并为后续语句设置新的原点该表达式必须是一个简单的可重定位表达式,并且没有向前引用只能使用当前段中的绝对地址或符号值表达式中可以使用表示位置计数器当前值的美元符号字符(‘$’)当遇到ORG语句时,汇编器计算表达式的值并修改位置计数器如果ORG语句出现在绝对段中,则将为位置计数器分配指定的绝对地址值。位置计数器不能设置为低于段的基地址的地址如果ORG语句出现在可重定位的段中,则将为位置计数器分配指定表达式的偏移量。例如,如果可重定位地址为1000h开始,并且ORG表达式的值为1234h,则下一条语句的绝对地址为2234h(1000h+1234h)控制语句
--地址控制ORG语句更改位置计数器,这可能会创建一个间隙,但不会创建新段ORG语句的例子,如下:ORG100hORGRESTARTORGEXIT1ORG($+15)AND0FFF0h控制语句
--地址控制USINGUSING语句指定哪个寄存器组(0~3)用于编码AR0~AR7寄存器所选的寄存器组被记录在目标文件中,并且存储器区域由链接器保留一些8051指令(如PUSH和POP)只允许使用绝对地址汇编器使用当前寄存器组中寄存器的物理地址代替绝对寄存器(AR0~AR7)当指令PUSHR0无效时,PUSHAR0有效汇编器必须知道使用哪个寄存器组来计算正确的物理地址这就是使用USING语句的目的控制语句
--地址控制USING语句不生成任何代码来切换当前寄存器组。汇编程序必须选择正确的寄存器组例如,下面的代码选择寄存器组2PUSHPSW;保存当前的寄存器组MOVPSW,#(2SHL3);设置寄存器组2…POPPSW;恢复保存的寄存器组物理地址按如下计算,即物理地址=(寄存器组Ⅹ8)+寄存器控制语句
--地址控制谨慎地使用EQU语句来定义绝对寄存器(AR0~AR7)的符号符号值在定义时计算(而不是在使用时)如果随后使用USING语句更改寄存器组,则定义的符号将具有错误的地址,生成的代码可能会失效使用USING语句的例子如下:USING3;选择寄存器组3PUSHAR2;将寄存器组3中的R2入栈(地址1Ah)USING1;选择寄存器组1PUSHAR7;将寄存器组1中的R7入栈(地址1Fh)控制语句
--存储器初始化DBDB语句使用一个或多个字节值初始化存储器标号是分配给当前存储器的地址符号表达式保存在存储器中的字节值。每个表达式可以是符号、字符串或表达式DB语句只能在代码或常数段中指定如果在不同的段中使用,则会生成错误DB语句的用法如下:MSG:DB'PressAKeyToContinue',0TAB:DB2,3,5,7,11,13,17,19,';'控制语句
--存储器初始化DDDD语句使用一个或多个32位双字值初始化存储器标号是分配给当前存储器的地址符号表达式保存在存储器中的双字值。每个表达式可以是符号、字符串或表达式DD语句只能在代码或常数段中指定如果在不同的段中使用,则会生成错误DD语句的用法如下:TABLE:DDTABLE,TABLE+10,NEXTDD$NEXT:DD0VALS:DD12345678h,98765432h,1控制语句
--存储器初始化DWDW语句使用一个或多个字值(2个字节)初始化存储器标号是分配给当前存储器的地址符号表达式保存在存储器中的字值。每个表达式可以是符号、字符串或表达式DD语句只能在代码或常数段中指定如果在不同的段中使用,则会生成错误DD语句的用法如下:TABLE:DWTABLE,TABLE+10,HEREHERE:DW0CTAB:DWCASE0,CASE1,CASE2,CASE3DW$控制语句
--保留存储空间DBITDBIT语句在bit段或ebit段中保留指定个数的位数标号是分配给当前存储器地址的符号。表达式是要保留的位数该语句在当前存储器空间中保留空间,并按保留的位数递增位置计数器该语句的用法如下:A_FLAG:DBIT1B_FLAG:DBIT1控制语句
--保留存储空间DSDS语句在当前的存储器空间中保留指定个数的字节标号是分配给当前存储器地址的符号表达式是要保留的字节个数该语句在当前存储器空间中保留空间,并按保留的字节数递增位置计数器该语句的用法如下:GAP:DS(($+15)AND0FFF0h)-$;16字节对齐DS10TIME:DS8控制语句
--保留存储空间DSBDSB语句与DS语句的功能完全相同该语句的用法如下:COUNT:DSB10TIME:DSB8控制语句
--保留存储空间DSDDSD语句在当前的存储器空间中保留指定个数的32位双字标号是分配给当前存储器地址的符号表达式是要保留的双字个数该语句在当前存储器空间中保留空间,并按保留的双字个数递增位置计数器该语句的用法如下:COUNT:DSB10TIME:DSB8控制语句
--保留存储空间DSWDSW语句在当前的存储器空间中保留指定个数的16位字标号是分配给当前存储器地址的符号表达式是要保留字的个数该语句在当前存储器空间中保留空间,并按保留字的个数递增位置计数器控制语句
--过程声明PROC和ENDP指令PROC和ENDP用于定义一个标号,用于称为过程的机器指令序列对于兼容MCS-251ISA的STC32G系列单片机来说,过程具有NEAR或FAR类型这取决于调用它的类型-LCALL或ACALL(用于NEAR);ECALL(用于FAR)与C函数不同,汇编器的过程不为标号提供本地作用域。A251中的标识符必须是唯一的,因为可见性是模块范围的控制语句
--过程声明该语句的格式如下:namePROC[type]...;指令和注释RETnameENDP其中:name:指定过程的名字PROC:指定这是一个过程函数type:指定过程是NEAR/FAR。当未指定类型时,默认为NEARRET:程序通常以RET指令结束。软件指令RET将自动转换为合适的机器返回指令。RET用于从类型为NEAR的过程返回;ERET用于从类型为FAR的过程返回ENP:用PROC语句定义的ENDP过程必须以ENDP结束,前面加上过程的名字控制语句
--过程声明PROC和ENP的用法P101PROCNEARRET;near返回P101ENDP
P102PROCFARRET;far返回(ERET)P102ENDP
P103PROCNEARCALLP101;near调用P101(LCALL)CALLP102;far调用P102(ECALL)RET;near返回P102ENDPEND控制语句
--过程声明LABEL该语句为段中的位置定义符号名字,定义的标号继承了父段的属性,不能在段外定义它格式为:
符号[:]LABEL[类型](可选)标号定义可以包含指定汇编器所要访问类型的类型如果未指定类型,则根据段(NEAR用于Code段,BYTE用于Data段,BIT用于Bit段)设置标号类型控制语句
--过程声明该语句的用法如下:RSEGECODE_SEG1;激活ECODE段ENTRY:LABELFAR;入口点
RSEGECODE_SEG2;激活另一个ECODE段EJMPENTRY;跳转跨越64KB段控制语句
--程序链接EXTRN/EXTERN该语句(可能出现在汇编源文件中的任何位置)指定当前源文件使用但在其他目标模块中定义的符号定义符号的模块必须使用PUBLIC语句导出符号EXTRN/EXTERN语句指定符号、其存储器类和数据类型其格式为:EXTRN类:(符号1,符号2,...,符号N)EXTRN/EXTERN类:类型(符号1,符号2,...,符号N)控制语句
--程序链接有效的类类描述BIT位于BIT存储空间的符号CODE位于CODE空间的符号CONST位于CONST存储器的符号DATA位于DATA空间的符号EBIT位于EBIT存储空间的符号ECONST位于ECONST存储器的符号EDATA位于EDATA存储器的符号ECODE位于ECODE存储器的符号HDATA位于HDATA存储器空间的符号HCONST位于HCONST存储器的符号IDATA位于IDATA存储器的符号XDATA位于XDATA存储器的符号NUMBER位于任意存储器空间的符号控制语句
--程序链接有效的类型
类型描述BYTE字节变量DWORD双字变量FARfar标号NEARnear标号WORD字变量链接器解析所有外部符号并验证类和类型是否匹配。类为NUMBER的符号匹配任何存储器类该语句的用法如下:EXTRN/EXTERNCODE:FAR(main)EXTRN/EXTERNNUMBER(tabsize)EXTRN/EXTERNDATA:BYTE(counter)控制语句
--程序链接NAMENAME语句指定要嵌入此汇编器模块的目标文件中的名字指定的模块名字最多可以包含40个字符,且必须遵守符号名字规则如果源模块中不存在NAME语句,则将文件名嵌入到目标模块中语句格式为:NAME模块名注:模块名字未用作目标文件名字控制语句
--程序链接PUBLICPUBLIC语句指定可以在其他目标模块中使用列出的符号指定的符号在生成的对象模块中标记为公共符号,并由链接器用于解析来自其他目标模块的外部引用指定为PUBLIC的符号必须在源文件中定义下面的符号可以声明为PUBLIC,包括:类似BYTE、WORD和BIT等变量;在NEAR和FAR存储器中定义的标号;使用EQU定义的常数;PUBLIC的用法如下:PUBLICmyvar,yourvar,othervar控制语句
--段控制BSEGBSEG语句选择BIT空间内的绝对段,如果包含可选地址,则汇编器从该地址开始绝对段有两种表示位地址的方法:指定字节基地址和位偏移量。有效地址范围为20.0H~2F.7H21H.5指定位号。在位表示法中,有效地址范围为0~127,其映射到20H.0~2FH.7地址21H.5可以表示为位编号13如果省略了可选地址,则汇编器从地址20H开始绝对段(如果没有定义先前的绝对BIT段)如果先前定义了绝对BIT段,则汇编器从该段的末尾开始继续控制语句
--段控制A251汇编器将BSEG语句转换为以下:?BI?modulename?nSEGMENTBITOFFSaddress其中,modulename为源文件的名字,n为顺序号,address为BSEG语句中指定的地址该语句的用法BSEGAT10;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年质量员(设备安装质量基础知识)押题宝典考试题库附答案详解【达标题】
- 2026年消防职业技能鉴定练习题库带答案详解(综合卷)
- 关节脱位病人整体护理模式
- 2026年环境影响评价工程师之环评技术导则与标准考试押题卷带答案详解(综合卷)
- 2026年基金从业人员押题宝典考试题库有完整答案详解
- 关注化疗患者营养需求
- 口腔护理技术规范与技巧
- (2026年)精神科危险物品分级课件
- 生物质炭介入下连作压砂地的土壤质量优化与哈茨木霉拮抗性增强探究
- 2026山东济宁汶上县事业单位招聘工作人员(教育类)52人备考题库及答案详解(考点梳理)
- 2026年上海市闵行区初三下学期二模数学试卷和答案
- 防范银狐木马病毒与补贴诈骗信息课件
- (二模)南昌市2026届高三年级四月检测英语试卷(含答案)
- 河南省活性炭码上换监管预警系统-20260415
- 六化建设培训
- 2025年西藏拉萨市检察院书记员考试题(附答案)
- TSG08-2026《特种设备使用管理规则》全面解读课件
- 2026年软件即服务项目投资计划书
- 毕业设计(伦文)-皮革三自由度龙门激光切割机设计
- 2026秋招:富滇银行公司面试题及答案
- 2025年12月23日青岛市青选计划面试真题及答案解析
评论
0/150
提交评论