首页 > 电脑

请用M68HC08指令写出10种以上将$40中的数据传给$50的指令表达式

更新时间2018-03-18 09:23:18

计算机的指令系统是一套控制计算机操作的编码,称之为机器语言。计算机只能识别和执行机器语言的指令,机器语言指令是随计算机系统的不同而不同的。为了容易为人们所理解,便于记忆和使用,通常用符号指令(即汇编指令)来表示计算机的指令。这一章我们以M68HC08的汇编指令来分析M68HC08的指令系统功能和使用方法。1 指令格式1.1 汇编指令格式M68HC08汇编指令由操作码助记符字段和操作数字段所组成,指令的格式如下:操作码[操作数1],[操作数2],[操作数3]第一部分“操作码”助记符,由2-5个英文字母组成,例如LD、MOV、DBNXZ、BRSET等。第二部分为“操作数”字段,根据指令功能的不同,操作数可以有一个、二个、三个或者没有(例如空操作指令NOP)。操作码与操作数之间以空格分隔,操作数和操作数之间用“,”号分开。指令前可以加标号,标号代表这条指令的起始存储地址,指令后可以加注释,注释以“;”号开始,一行指令以回车符结束。例如:STRT:MOV#FF,DORA;PTA编程为输出口中1.2 常用伪指令一、定位伪指令格式:ORG地址“地址”可以十六进数(以$开头)或十进制表示,该伪指令给出以下的程序或数据的起始存储地址。例如:ORG $C000则该伪指令下面的程序或常数存放在$C000开始的存储器中。二、定义字节常数伪指令格式:FCB X1、X2、X3,…Xn定义程序区中的字节常数,Xi是单字节常数也可以是用单引号括起来的字符串(这时定义ASCII码),每个字节为一个字符。例如:ORG $8000FCB $3F, $61则在Flash的$8000、$8001两个单元定义了两个常数$3F、$61。利用字节定义伪指令可以在程序存储器中定义常数表,如显示器的字形数据表等。三、定义字常数伪指令格式:FDB Y1、Y2、…Ym定义程序区中字(双字节)常数,高位字节在前,低位字节在后,Yi用十六进制或十进制数表示。例如:ORG $FFFEFDB $8000则在$FFFE、$FFFF定义了一个字常数,$80存储在$DDDW单元,而$FFFF单元存储$0。利用FDB指令可以定义复位和中断向量。1.3 符号说明M68HC08汇编程序允许使用标准的M68HC08汇编指令和多种伪指令(详见§7.1M68HC08汇编使用方法)。为了以下说明和分析指令的方便,我们对常用的符号作简单说明。一、功能性符号·( )寄存器或存储单元的内容;·←数据传送的方向;·↑表示退栈;·↓表示进栈;·&表示逻辑或;·○+表示逻辑异或;·×乘;·÷除;·+加;·-减;·:表示连成双字节;·《表示扩展为有符号的16位数。二、寄存器或存储单元符号·A累加器;·CCR条件码寄存器;·H变址寄存器高8位;·X变址寄存器低8位;·PC程序计数器;·PCH程序计数器的高8位;·PCL程序计数器的低8位;·SP堆栈指针;·M存储器地址或数据(视寻址方式而定)·rel相对偏移量(表示有符号的8位二进制数)。三、位标识符号·V溢出标志位;·H半进位;·I中断屏蔽位;·N负标志位;·Z零标志位;·C进位/借位。四、对条件码寄存器影响:·-无影响;·0:清“零”;·:根据结果置“1”或清“零”。五、机器码标志·dd:$00XX的低8位地址;·ee:16位偏移量地址;·ff:16位偏移量低8位或8位偏移量;·ii:单字节立即数;·ll:16位扩展寻址低8位;·rr:相对偏移量。六、源操作数标志·OPR:操作数,一个或两个字节,由操作方式确定;·rel:相对偏移量。七、寻址方式·INH:隐含寻址;·IMM:8位立即数寻址;·DIR:8位直接地址寻址;·EXT:16位扩展寻址;·IX:16位变址无偏移量;·IX1:16位变址8位偏移量;·IX2:16位变址,16位偏移量;·IX+:16位变址,无偏移量,变址寄存器加1;·IX1+:16位变址,8位偏移量,变址寄存器加1;·rel:8位相对寻址;·DD:直接寻址;·IMD:立即寻址,直接寻址;·IX+D:16位变址,直接寻址,变址寄存器加1;·DIX+:直接寻址,16位变址,变址寄存器加1;·SP1:堆栈指针寻址,8位偏移量;·SP2:堆栈指针寻址,16位偏移量。2 寻址方式指令给出操作数或产生操作数有效地址(EA)的方式称为寻址方式。根据寻址方式,CPU就可以取得操作数。M68HC08比M68HC05增加了8种寻址方式,使程序员能选择最合适的寻址方式来优化程序,达到缩短程序长度、提高运行速度的目的。下面分别介绍M68HC08指令系统的寻址方式。一、隐含寻址无操作数或操作数隐含在操作码字节中。例如:NOP ;无操作数CLRA ;清零累加器一般只能访问CPU寄存器。二、立即数寻址操作数包含在指令操作码后面的一个或两个字节中。例如:LDA # $10 ;80H—ALDHX# $8100;81H—H,0—XM68HC08指令系统中,数字前加$表示十六进制数,加%表示二进制数,无前缀表示十进制数,指令的数据前加#表示立即数。三、直接寻址操作数的有效地址EA包含在指令操作码后续字节中。直接寻址的有效地址在指令的地址段中只指出低8位的值,高8位固定为零,即EA=$00XX。这种寻址方式只能访问零页的I/O寄存器或RAM。例如:INC $50 ;(50H)+1→50H单元四、扩展寻址扩展寻址方式中,操作数的16位有效地址EA在指令操作码的后面两个字节中。实际上也是一种直接寻址方式。因为有效地址为16位,可以访问64K字节存储空间的任意单元。例如:JMP $C100 ;$C100→PC,CPU转至$C100执行程序LDA $8120;(8120H) →A在使用M68HC08汇编时,用户不必考虑指令是用直接寻址还是扩展寻址。汇编程序自动根据指令中有将地址值取直接寻址或扩展寻址方式。五、变址寻址无偏移量这是一种间接寻址方式,操作数的有效地址EA的高8位在H寄存器中,低8位在X寄存器中。这种寻址方式可以访问64K字节存储空间的任意单元。例如:DEC,X;(HX)—1→(HX)单元六、变址8位移量操作数的有效地址为(H:X)加上无符号的8位偏移量。这种寻址方式可用于查表,从n个元素的表中选择第k个元素,k在变址寄存器中,表格的首地址为8位偏移量。例如:LDA $50,X;(HX)+$50) →A七、变址16位偏移量操作数的有效地址为(H:X)加上无符号的16位偏移量,类似于变址8位偏移量,可用于查表和程序散转。例如:FMP KTAB,XKTAB JMP PGM0JMP PGM1根据(HX)的不同转移到不同的地方。八、堆栈指针8位偏移量操作数的有效地址是(SP)加上无符号的8位偏移量。这种变址8位移量寻址方式相似。这种寻址方式主要方便对堆栈的操作。若系统中不用中断,SP可以作为第二变址寄存器。例如:LDA $10,SP ;(SP)+$100) →A九、操作数有效地址为(SP)加上16位无符号的偏移量,类似于变址16位偏移量的寻址方式。LDA $100,SP ;((SP)+$100)→A十、相对寻址相对寻址只用于转移指令和子程序调用指令,转移的有效地址为当前PC值加上8位带符号的偏移量,偏移量位于操作码后面的字节中。在使用M68HC08汇编时程序员不必计算偏移量值,只要用标号表示转移的目标地址,汇编程序自动计算偏移量,偏移量为-128~+127,超出这个范围,汇编会报错。例如:BCC MLP1 ;C=0转MLP1,相对寻址INC A ;(A)+1→ABRA MLP2 ;转MLP2,相对寻址MLP1: CLRAMLP2: STA ,X存储器单元和存储器单元之间的数据传送指令,由源操作数和目的操作数不同寻址方式组合得到以下四种寻址方式。寻址方式源操作数目的操作数例子功能十一、IMD立即数寻址直接寻址MOV # $80,$40S80→$40单元十二、DD直接寻址直接寻址MOV $80,$40($80)→$40单元十三、IX+D变址,(HX)+1直接寻址MOVX+,$40((HX))→$40单元,(HX)+1十四、DIX+直接寻址变址(HX)+1MOV $40,X+($40)→(HX),(HX)+1十五、变址无偏移量,变址寄存器加1操作数的有效地址为变址寄存器内容。这是一种间接寻址方式,指令执行后变址寄存器内容加1。例如:CBEQ X+,rel ;((HX))=(A)转移,(HX)+1→HX十六、变址8位偏移量,变址寄存器加1操作数有效地址为变址寄存器内容加上8位无符号偏移量,指令执行后变址寄存器内容加1。例如:FNNZ $80,X+rel ;($80+(HX)-1不等于0转移;且(HX)+1→HX3 M68HC08指令系统3.1指令类型一、根据指令周期分类指令周期反映了指令运行的速度。M68HC08指令周期是以内部总线时钟周期为单位的。指令周期占内部总线时钟周期数按指不同有1,2,3,4,5,6,7,9等几种。若内部总线时钟频率为8MHz,最短的指令周期为125ns,最长的指令周期为1125ns。二、根据指令字节长度分类指令字节长度反映了指令的存储效率。M68HC08有单字节指令、双字节指令和3字节指令。三、根据指令功能分类根据指令的功能,HC08指令系统可分为以下几类:①数据传送指令;②算术运算指令;③逻辑运算指令;④位操作指令;⑤移位指令;⑥程序转移和控制指令。3.2数据传送指令数据传送指令实现CPU寄存器、I/O寄存器、RAM和ROM(或Flash)之间的数据传送,一般况下指令执行结果只影响CCR的“N”和“Z”标志位。若所传送的数据为零,置“1”Z,否则清零Z;数据最高位为1置“1”N,否则清零N。一、CPU寄存器取数指令1.所寻址的单元内容送累加器ACCR指令操作VHINZC寻址方式总线周期LDA # oprLDA oprLDA oprLDA opr, XLDA opr,XLDA,XLDA opr, SPA←(M)0———IMMDIREXTIX2IX1IXSP12344324LDA opr, SPSP25例如:LDA # $80 ;$80→ALDA PORTA ;并行口中A输入信息读到A(先用EQU指令定义PORTA)2.所寻址的单元内容送16位变址寄存器的低8位X,而高8位H的内容保持不变CCR指令操作VHINZC寻址方式总线周期LDA # oprLDA oprLDA oprLDA opr, XLDA opr,XLDA,XLDA opr, SPLDA opr, SPA←(M)0———IMMDIREXTIX2IX1IXSP1SP2234432453.所寻址的两个单元的16位数据送变址寄存器HXCCR指令操作VHINZC寻址方式总线周期LDA # oprLDA oprH:X←(M:M+1)0———IMMDIR23这是两条16位数据传送指令,主要用于对变址寄存器HX赋值。例如:LDHX # $80 ;0→H,$80→XLDHX $8212 ;($8212) →H,($8213) →X二、CPU寄存器存储命令1.累加器A的内容存储到所寻址的单元例如:STA PORTA ;(A)输出到并行口不PORTASTA $80,X ;(A)存储到地址为(HX)+$80的单元2.变址寄存器低8位X的内容存储到所寻址的单元3.16位变址寄存器的内容存储到所寻址的两个单元例如:STHX $80;(H)→$80单元(X)→$81单元三、堆栈操作指令1.进栈指令M68HC08的进栈操作是数据先进栈,然后栈指针减1,因此SP指向下一次进栈的地址单元。不影响标志位。2.退栈指令HC08的退栈操作是栈指针SP先加1,然后取(SP)指出栈单元内容。不影响标志位。四、CPU寄存器之间的的数据传送指令由上面所列指令及其功能可以看出除TAP指令外,这类指令不影响标志位。五、存储器单元之间的数据传送指令这类指令在编程时应注意格式:MOV源操作数,目的操作数。例如:MOV $50, $60 ;($50)→$60单元MOV # $80,$60;立即数$80→$60单元3.3 算术运算指令一、加法指令1.不带进位加法指令ADD累加器A和所寻址的单元内容相加,运算结果送累加器A。影响标志位OV、H、N、Z、C,运算结果满足下列条件时置“1”相应的标志位,否则清零。OV:(A).7,(M).7=1,而结果最高位(RESOLT7,以R7表示)为0,负数相加溢出;或(A).7=0(M).7=0而结果最高位R7为1,正数相加溢出;H:相加结果低3位向高4位进位时置“1”;N:相加结果R7为1时置“1”;Z:相加结果为零时置“1”;C:相加时最高产生位进位时置“1”。2.带进位加法ADC累加器A、进位标志C、和所寻址的单元内容相加,结果送累加器A。对标志位的影响和ADD指令相同,ADC指令用于实现多字节加法。3.十进制调整指令这条指令对累加器中由上一条加法指令(加数和被加数均为压缩BCD码)所得的8位结果(在A)进行十进制调整,使A的内容为BCD码。调整规则如下:a. (A).3~(A).0大于9或H=1则(A)+$06→A,否则(A).3~(A).0不变;b. (A).7~(A).4大于9或C=1则(A)+$60→,否则(A).7~(A).4不变;c. 结束。例如:(A)=$56 ($50)=$67执行指令:ADD $50 ;(A)=$BD,(C)=0(A).7~(A).4>9,(A).3~(A).0>9DAA ;经调整之后(A)=23,(C)14.16位变址寄存器加上8位带符号立即数指令这条指令将补码表示的8位立即数扩展为16位带符号数并和(HX)相加,运算结果送HX,不影响标志位。5.16位堆栈指针加上8位带符号立即数指令这条批令将补码表示的8位立即数扩展为16位有符号数并和(SP)相加,结果送SP,不影响标志。6.加1指令加1指令不影响标志位C和H,例如:(A)=$FF。ADD # $1 ;结果(A)=0,(C)=1,(H)=1INCA ;结果(A)=0,(C)和(H)不变二、减法指令1.不带借位减法指令A的内容减去所寻址单元内容,结果送累加器A,影响V、N、Z、C标志位。满足下列条件置“1”,否则清零。V:(A).7=1(M).7=0而结果R7=0,为负数减正数溢出;或者(A).7=0(M).7=1而结果R7=1,为正数减负数溢出。这时1→V。N:相减结果R7=1时,1→NZ:相减结果为零时,1→Z;C:相减时最高位产生借位时,1→C。2.带借位减法指令A的内容减去C和所寻址单元的内容结果送A,对标志位的影响和SUB指令产生的影响相同。3.减1指令对所寻址单元的内容减去1。减1指令不影响标志位H和C。4.累加器A的比较指令CMPA和所寻址的单元内容相比较,实际上是A减去所寻址单元内容,只影响标志位,而不传送减法的结果,即不影响A和寻址单元的内容,对标志位影响和关法指令产生的影响相同。5.X的比较指令CPXX和所寻址的单元内容的相比较,只影响标志位,不影响X和所寻址单元内容,对标志位影响和减法指令产生的影响相同。6.HX的比较指令CPHX16位变址寄存器HX内容和可寻址的两个单元内容相比较,只影响标志位,不影响HX和可寻址单元内容,对标志位影响和减法指令产生的影响相同。7.取补指令0减去所寻址的单元,即所寻址单元的各位取反,然后加1。对V、N、Z、C标志位影响和减法指令产生的影响相同。8.测试指令测试所寻址单元的内容是否为零或负数。执行所寻址单元内容减去0的操作,并影响V、N、Z标志位,不影响原来单元内容。三、乘法指令X和A中两个无符号数相乘,积的高8位送X,低8位送A。清零H和C标志,不影响其他标志位。四、除法指令(H):(A)中无符号16位数除以(X)中8位无符号数,商→A,余数送H。若商大于$FF或除数为零,置1进位标志C,否则清零标志C。3.4逻辑运算指令一、单操作数简单逻辑指令1.清零指令清“0”所寻址的单元,0→V、N、1→Z不影响其他标志位。2.取反指令对的寻址单元的内容按位取反。二、双操数逻辑运算指令1.“逻辑与”指令累加器A和所寻址的单元内容按位做逻辑与运算,结果选A。结果最高位R7=1置“1“N,否则清零N,结果为零,1→Z,否则0→Z。按位“逻辑与“操作在两个操作数对应位都为1时,结果对应位才为1,否则对应结果位为0。例如:(A)=$F0则执行指令AND# $0F后(A)=0。2.“逻辑或”指令累加器A和所寻址单元内容按位进行逻辑或运算结果送A。按位逻辑或操作,只有当两个操作数对应位都为零时,结果的对应位才为零,否则为1。例如:(A)=$F0,执行ORA# $0F后则(A)=$FF。3.“逻辑异或”指令累加器A和所寻址单元内容按位进行逻辑异或运算,结果送A。按位逻辑异或就是按位半加。当两个操作数对应位不同时结果对应为1,相同时为0。例如:(A)=$F0,若执行指令EOR# $A0,则(A)=$50。4.位测试指令A和所寻址的单元内容逻辑与。但结果不传送,只影响标志位V、N、Z,不影响A和所寻址单元内容。这些指令用于测试所寻址单元的指定位为零还是1。例如:(A0=$01,执行指令BIT$50后,若Z=0则($50).0=03.5位操作指令一、标志位操作指令1.对CCR寄存器的I、C置“1“指令2.对CCR寄存器的I、C清零指令对标志位I的置“1“和清零就是控制CPU的关中和开中。二、对零页RAM/IO寄存器的位操作指令对于零页的RAM单元或IO寄存器,CPU执行位置1和清零指令一样地快速方便。3.6移位指令一、逻辑左移指令所寻址的单元内容左移一位,低位移入0,高位移到C。二、逻辑右移指令所寻址的单元内容右移一位,高位移入0,低低移出至C。三、带进位循环左移指令所寻址单元的内容带进位循环右移一位,C移入最高位,最低位移出至C。五、算术左移指令算术左移指令功能和逻辑左移指令操作相同六、算术右移指令将所寻址的单元内有符号的8位数右移一位,符号位保持不变,相当于除2操作。七、累加器A半字节交换指令累加器A的高4位和低4位相互交换,不影响标志位。3.7 程序转移和控制类指令一、无条件转移指令1.相对转移指令2.绝对转移令绝对转移指令,将所寻址的两个单元内容作为地址送PC,使CPU转到该地址开始执行程序,不影响标志位。二、条件转移指令1.测试状态标志条件转移指令这类指令,根据上一条指令执行结果,测试CCR的标志位状态,若条件满足,执行相对转移指令,若条件不满足,则顺序执行下一条指令,不影响标志位。若执行有符号减法或比较批令后,CCR相关位与实际两操作数间的关系为:如果CPU内部A或X的内容大于等于所寻址单元内容,则N○+V=0;如果A或X内容大于所寻址单元内容,Z1(N○+V)=0;A或X小于所寻址的单元内则N○+V=1。执行无符号减法或比较指令后,CCR相关位与实际两操作数间的关系为:如果CPU内部A或X的大于等于所寻址单元内容则C=0;A或X大于所寻址单元内容C=0,Z=0;A或X内容小于所寻址单元内容C=1。BLT、BGE、BLE、BGT指令一般直接跟在有符号数减法或比较指令之后。2.测试IRQ条件转移指令这两条指令也不影响标志位。测试所寻址单元相应位状态,若满足条件则发生转移,否则顺序执行下一条指令。只能对零页的RAM或I/O寄存器的位测试转移。不影响标志位。4.减1不为零转移这是兼有减1指令和不等于零转移指令功能的条件转移指令,不影响标志位。5.比较相等转移指令累加器A或X和所寻址单元内容相比较,若相等,则执行一相对转移指令;若不相等,顺序执行下一条指令。不影响标志位。三、调用子程序指令1.相对调用指令该调用子程序指令功能和相对转移指令类似,只是增加PC进栈操作也不影响标志位。2.绝对调用子程序指令这些指令功能和绝对转移指令功能相似,只是附加了PC值进栈操作。不影响标志位。四、返回指令1.从子程序返回指令RTS这条指令的功能是PC退栈返回主程序。一般子程序必须以RIS结束。2.从中断返回指令RTI这条的功能和RTS相似,只是多了CPU寄存器CCR、A、X的退栈操作,使CPU从原来被中断地方继续执行程序。中断服务程序必须以RTI指令结束。五、控制指令1.软件中断指令SWICPU执行SWI指令,产生不可屏蔽的软件中断,主要用于设计开发工具的监控程序。五、控制指令1.软件中断指令SWICPU执行SWI指令,产生不可屏蔽的软件中断,主要用于设计开发工具的监控程序。2.堆栈指针复位指令RSPRSP指令使SPL值为$FF,而SPH值保持不变。不影响标志。注:为保证栈指针能正确初始化,最好使用LDHX和TXS指令,例对于把SP初始化为$00FF,可使用:LDHX# $100和TXS这两条指令。3.节电方式指令4.空操作指令空操作指令,指令本身不执行任何操作。用在延时等程序中,以调节程序执行的时间。上面我们简要地分析了M68HC08的指令系统。对汇编语言程序设计有一定基础的读者,就可以用M68HC08提供的指令,设计出各种应用程序。

上一篇:按键精灵CallPlugin.Office.OpenXls(C:测试.xls)类型不匹配

下一篇:MATLAB高斯函数写法