logo资料库

Freescale HC08指令系统.doc

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
Freescale HC08 指令系统 6/9/2022 Freescale HC08 指令系统 一、数据传送类指令 1、取数指令:取出存储器中的数放入寄存器 A、X、HX 中。同时按取出的数来改变 N、Z 标志,当取出的数为负(最高位为 1)时,则负标志位 N=1,当取出的数为 0 时,则零标志位 Z=1。对其它标志位没有影响。LD 是 Load 的简写,随后的字母是 CPU 内部寄存器名(LD 与寄存器名之间没有空格)。 (1) 所寻址的单元内容送累加器 A LDA #opr8 LDA addr8 LDA addr16 LDA addr8,X LDA addr16,X LDA ,X LDA addr8,SP LDA addr16,SP 例:HX=2000H,(2010H)=50H,则 ;#opr8→ A ; (addr8)→ A ; (addr16)→ A ; (HX+addr8)→ A ; (HX+addr16)→ A ; (HX)→ A ; (SP+addr8)→ A ; (SP+addr16)→ A LDA $10,X 指令执行后,A=50H (2)所寻址的单元内容送 16 位变址寄存器的低 8 位 X,而高 8 位 H 的内容保持不变 LDX #opr8 LDX addr8 LDX addr16 LDX addr8,X LDX addr16,X LDX ,X LDX addr8,SP LDX addr16,SP 例:HX=2000H,(2010H)=50H,则 ;#opr8→ X ; (addr8)→ X ; (addr16)→ X ; (HX+addr8)→ X ; (HX+addr16)→ X ; (HX)→ X ; (SP+addr8)→ X ; (SP+addr16)→ X LDX $10,X 指令执行后,X=50H (3)所寻址的两个单元的 16 位数据送变址寄存器 HX LDHX #opr16 LDHX addr8 如: (10H)=50H, (11H)=20H,则 ;#opr16→ HX ; (addr8: addr8+1)→ HX LDHX $50 指令执行后,HX=5020H 2、存数指令:将寄存器 A、X、HX 的数存入存储器单元中。对标志位的影响同 LDA。 (1)累加器 A 的内容存储到所寻址的单元 STA addr8 STA addr16 STA addr8,X STA addr16,X STA ,X STA addr8,SP STA addr16,SP ; A →(addr8) ; A →(addr16) ; A →(HX+addr8) ; A → (HX+addr16) ; A →(HX) ; A →(SP+addr8) ; A →(SP+addr16) 16-1
Freescale HC08 指令系统 6/9/2022 例:HX=$2000,A=$30, 则 STA ,X 指令执行后,($2000)= $30 (2)变址寄存器低 8 位 X 的内容存储到所寻址的单元 STX addr8 STX addr16 STX addr8,X STX addr16,X STX ,X STX addr8,SP STX addr16,SP 例:HX=$3000,X=$ 40, 则 ; X →(addr8) ; X →(addr16) ; X →(HX+addr8) ; X → (HX+addr16) ; X →(HX) ; X →(SP+addr8) ; X →(SP+addr16) STA $2000,X 指令执行后,($5000)= $40 ;(HX) →( addr8):( addr8+1) ; A → (SP),SP-1 →SP ; H → (SP),SP-1 →SP ; X → (SP),SP-1 →SP ;SP+1 →SP,(SP) →A ;SP+1 →SP,(SP) →H ;SP+1 →SP,(SP) →X (3)16 位变址寄存器的内容存储到所寻址的两个单元 STHX addr8 3、堆栈操作指令 (1)进栈指令 数据先进栈,然后栈指针减 1,因此 SP 指向下一次进栈的地 址单元。不影响标志位。 PSHA PSHH PSHX (2)退栈指令 栈指针 SP 先加 1,然后取(SP)所指的栈顶单元内容。不影响标志位。 PULA PULH PULX 4、寄存器之间的数据传送指令 除 TAP 指令外,这类指令不影响标志位。 TAP TPA TAX TXA TXS TSX 5、存储器单元之间的数据传送指令 格式:MOV 源操作数,目的操作数。 MOV addrs8, addrt8 MOV addr8,X+ MOV X+,addr8 例如: MOV $50,$60 MOV # $80,$60 ; (addrs8) → (addrt8) ; (addr8) →(HX),HX+1→HX ; (HX) → (addr8) ,HX+1→HX ;A →CCR ;CCR → A ;A →X ;X → A ;HX-1 →SP ;SP+1 →HX ;($50)→($60)单元 ;立即数$80→($60)单元 16-2
Freescale HC08 指令系统 6、立即数送给单元 MOV # opr8,addr8 ; # opr8 → (addrt8) 6/9/2022 5、6 中当传送的数为负(最高位为 1)时,N=1;当传送的数为 0 时,Z=1,对其它标志位 使用 MOV 指令 MOV $30, $50 MOV $40, $30 MOV $50, $40 没有影响。 例 将$30、$40 单元内容互换。 使用 LDA、STA 指令 LDA $30 STA $50 LDA $40 STA $30 LDA $50 STA $40 二、算术运算指令 算术类指令有加、减、乘/除、加 1/减 1、求反/取补、比较、测试等。 1、加减指令 (1)不带进位的加法指令 #opr8 addr8 addr16 addr16,X addr8,X ,X addr8,SP addr16,SP ADD ADD ADD ADD ADD ADD ADD ADD 第一操作数均在 A 中,第二操作数为 8 位立即数、采用直接寻址(2 种)或 HX 变址 ; A + #opr8 → A ; A + (addr8) → A ; A + (addr16) → A ; A + (addr16+HX) → A ; A + (addr8+HX) → A ; A + (HX) → A ; A + (addr8+SP) → A ; A + (addr16+SP) → A 寻址(3 种)或 SP 变址寻址(2 种)的存储单元(共有 8 种),结果均放在 A 中。 根据运算结果改变 V、H、N、Z、C 标志位。 C:若最高位有进位,则置位,否则清零。 V: 若溢出,则置位,否则清零。 H:若位 3 有进位,即半字节有进位,则置位,否则清零 N: 若结果的最高位为 1,相当于有符号运算中的结果为负,则置位,否则清零。 Z: 若结果为 0,则置位,否则清零。 例:A=$90,HX=$3000,($3000)=$80,C=1 则 ADD , X 指令执行后,A= $10 C=1,V=1,H=0,N=0,Z=0 (2)带进位的加法指令 ADC ADC ADC ADC ADC ADC ADC ADC #opr8 addr8 addr16 addr16,X addr8,X ,X addr8,SP addr16,SP ; A + #opr8+C → A ; A + (addr8) +C→ A ; A + (addr16) +C → A ; A + (addr16+HX) +C → A ; A + (addr8+HX) +C → A ; A + (HX) +C → A ; A + (addr8+SP) +C → A ; A + (addr16+SP) +C → A 16-3
Freescale HC08 指令系统 6/9/2022 除多加一个 C 外,其余与 ADD 指令完全相同 例:A=$29,HX=$3000,($3000)=$3F,C=1 则 ADD , X 指令执行后,A= $69 C=0,V=0,H=1,N=0,Z=0 例 将存放在$50、 $51 单元中的 16 位数与存放在 $60 $61 中的 16 位数相加,结果存放到 $70、 $71 单元中(假设高地址存放低 8 位)。 LDA ADD STA LDA ADC STA $51 $61 $71 $51 $61 $71 ;将待相加的低 8 位其中一个数送 A ;低 8 位相加 ;保存低 8 位相加结果 ;将待相加的高 8 位其中一个数送 A ;高 8 位相加,应考虑低 8 位产生的进位 ;保存高 8 位相加结果 (3)不带借位(C)的减法指令 ; A - (HX) → A ; A- #opr8 → A ; A - (addr8) → A ; A -(addr16) → A #opr8 addr8 addr16 addr16,X ; A - (addr16+HX) → A addr8,X ; A - (addr8+HX) → A ,X addr8,SP ; A- (addr8+SP) → A addr16,SP ; A - (addr16+SP) → A SUB SUB SUB SUB SUB SUB SUB SUB 第一操作数均在 A 中,第二操作数为 8 位立即数、采用直接寻址(2 种)或 HX 变址 寻址(3 种)或 SP 变址寻址(2 种)的存储单元(共有 8 种),结果均放在 A 中。(同 ADD) 根据运算结果改变 V、N、Z、C 标志位。 C:若最高位有借位,则置位,否则清零。 V: 若溢出,则置位,否则清零。 H:不变 N: 若结果的最高位为 1,相当于有符号运算中的结果为负,则置位,否则清零。 Z: 若结果为 0,则置位,否则清零。 例:A=$70,C=1 则 SUB #$81, X 指令执行后,A= $EF C=1,V=1 , N=1,Z=0,H 保持不变 (4)带借位的减法指令 ; A- #opr8 -C→ A ; A - (addr8) -C → A ; A -(addr16) -C → A #opr8 addr8 addr16 addr16,X ; A - (addr16+HX) -C → A addr8,X ; A - (addr8+HX) -C → A ,X addr8,SP ; A- (addr8+SP) -C → A addr16,SP ; A - (addr16+SP) -C → A SBC SBC SBC SBC SBC SBC SBC SBC 除多减一个 C 外,其余与 SUB 指令完全相同 ; A - (HX) -C → A 16-4
Freescale HC08 指令系统 2、乘/除法指令 (1)乘法指令 MUL ;X×A →X:A 6/9/2022 将 X 与 A 中两个无符号数相乘,结果是两个字节的无符号数,其高字节放入 X 中,低字节 放入 A 中。同时清标志位 H 和 C,不影响其它标志位。 例 已知 A=$25,X=$88,执行 MUL 指令后 A=$A8,X=$13 (2)除法指令 ;H:A ÷ X →A,余数→H DIV 将 H、A 中的二字节的无符号数除以 X 中的一个字节无符号数,商放入 A 中,余数放 入 H 中。若商大于$FF,则置标志 C,否则清 C。若商为 0,置标志 Z,否则清 Z。不影响 其它标志位。 例 已知 A=$25,HX=$1730,执行 DIV 指令后 A=$7B,H=$15 3、加 1/减 1 指令 (1) 加 1 指令 INC addr8 INCA INCX INC addr8,X INC ,X INC addr8,SP ;(addr8)+1 → (addr8) ;A+1 → A ;X+1 → X ; (addr8+HX)+1 → (addr8+HX) ; (HX)+1 → (HX) ; (addr8+SP)+1 → (addr8+SP) INCA、INCX 是寄存器的内容加 1 放回寄存器中,其它指令是把存储单元的内容加 1 之 后放回原存储单元中,对标志位 V、N、Z 产生影响,规则同加法。 (2) 减 1 指令 DEC addr8 DECA DECX DEC addr8,X DEC ,X DEC addr8,SP DECA、DECX 是寄存器的内容减 1 放回寄存器中,其它指令是把存储单元的内容减 1 ;(addr8)+1 → (addr8) ;A+1 → A ;X+1 → X ; (addr8+HX)+1 → (addr8+HX) ; (HX)+1 → (HX) ; (addr8+SP)+1 → (addr8+SP) ,X 之后放回原存储单元中,对标志位 V、N、Z 产生影响,规则同减法。 例 将存放在$50、 $51、 $52 单元中的 8 位数相加,结果存放到 $53 单元中。 方法 1: LDHX #$0050 LDA INCX ADD INCX ADD INCX STA ;取$ 50 单元 ;HX 指向$ 51 单元 ;$ 50 与 $ 51 单元相加 ;HX 指向$ 52 单元 ;$ 50、 $ 51、 $ 52 单元相加 ;HX 指向$ 53 单元 ;保存相加结果到$ 53 单元 ,X ,X ,X 16-5
Freescale HC08 指令系统 6/9/2022 X 1,X 2,X 3,X ;取$ 50 单元 ;与 $ 51 单元相加 ;与 $ 52 单元相加 ;保存相加结果至$ 53 方法 2: LDHX #$0050 LDA ADD ADD STA 4、取反、求补指令 (1)取反指令 COM addr8 COMA COMX COM addr8,X COM ,X COM addr8,SP ; $FF-(SP+addr8) → (SP+addr8) ;$FF-(addr8) → (addr8) ; $FF-A → A ; $FF-X → X ; $FF-(HX+addr8) → (HX+addr8) ; $FF-(HX) → (HX) 不考虑符号位,按位求反,相当于用$FF 减去该数。与求反码不同。 取反指令 COM 组指令中 COMA、COMX 是寄存器的内容取反后放回寄存器中,其它指令 是把内存单元的内容取反后放回内存单元中。 对标志位影响同减法指令。 例 A=$51,执行 COMA 指令后 A=$AE (2) 求补指令 NEG addr8 NEG NEG NEG NEG NEG A X addr8,X ,X addr8,SP ; $00-(addr8) → (addr8) ; $00-A → A ; $00-X → X ; $00-(HX+addr8) → (HX+addr8) ; $00-(HX) → (HX) ; $00-(SP+addr8) → (SP+addr8) 不考虑符号位,按位求反再加 1,相当于用$00 减去该数。与求补码不同。 求补 NEG 组指令中 NEGA、NEGX 是寄存器的内容求补后放回寄存器中,其它指令是把内 存单元的内容求补后放回内存单元中(求补即按位取反后加 1)。 对标志位影响同减法指令。 例 A=$51,执行 NEG 指令后 A=$AF 5、比较指令 ; A- #opr8 ; A - (addr8) ; A -(addr16) CMP #opr8 CMP addr8 CMP addr16 CMP addr16,X ; A - (addr16+HX) CMP addr8,X ; A - (addr8+HX) ; A - (HX) CMP ,X CMP addr8,SP ; A- (addr8+SP) CMP addr16,SP ; A - (addr16+SP) 被减数 A 与 8 位立即数或单元做相减运算,结果影响标志位,影响规则同减法指令, 但结果丢失不保存,不改变任何操作数。用于判断二数之间的关系。 16-6
Freescale HC08 指令系统 6/9/2022 ; X- #opr8 ; X - (addr8) ; X -(addr16) ; X - (addr16+HX) ; A - (addr8+HX) ; X - (HX) ; X- (addr8+SP) ; X - (addr16+SP) #opr8 addr8 addr16 addr16,X addr8,X ,X addr8,SP addr16,SP CPX CPX CPX CPX CPX CPX CPX CPX 被减数 X,其他同 CMP CPHX #opr16 CPHX addr8 ;HX- #opr16, opr16 为 16 位立即数 ;HX- (addr8:addr8+1) 6、清零指令 addr8 CLR CLRA CLRX CLRH CLR CLR CLR CLRA、CLRX、CLRH 是将寄存器清零,其它指令是将存储器单元清零,同时清零 V、 ;0 →(addr8) ; 0 →A ; 0 →X ; 0 →H ; 0 → (HX+addr8) ; 0 → (HX) ; 0 → (SP+addr8) addr8,X ,X addr8,SP N 标志位,置 Z 标志位,不改变 H、C 标志位。 7、测试是否为 0 指令 addr8 addr8,X ,X addr8,SP ;(addr8)-0 ;A-0 ;X-0 ;(HX+addr8)-0 ;HX0-0 ;(SP+addr8)-0 TST TSTA TSTX TST TST TST TST 组指令中 TSTA、TSTX 是将寄存器的内容与零比较(实际是执行减 0 的操作),其 它指令是把存储器单元的内容与零比较。这个指令执行后并不改变操作数本身,清 C 标志 位,根据结果改变 N、Z 标志位,若操作数为负(即最高位为 1),则 N=1,否则 N=0。 若操作数为 0,则 Z=1,否则 Z=0。不影响其它标志位。 8、SP 与 HX 增加指令 #opr8 #opr8 AIS AIX AIS 指令实现堆栈指针的直接增加,AIX 指令实现变址寄存器的直接增加,两条指令均 ;SP+ opr8 → SP ;HX+ opr8 → HX 不影响标志位。主要用于连续访问高 8 位地址不为 0 的单元。 三、逻辑运算指令 逻辑运算类指令完成逻辑与、或、异或等操作。这些指令把累加器 A 中的内容与 8 位 立即数或存储器单元的内容进行运算后再送到累加器中,同时清零 V 标志位,根据运算结 果改变 N、Z 标志位,不改变 H、C 标志位。 16-7
Freescale HC08 指令系统 1、逻辑与指令 6/9/2022 ;A∧ #opr8 →A ; A∧ (addr8) →A AND #opr8 AND addr8 ; A∧ (addr16) →A AND addr16 AND addr16,X ; A∧ (HX+addr16) →A AND addr8,X AND ,X AND addr8,SP AND addr16,SP ; A∧ (HX+addr8) →A ; A∧ (HX) →A ; A∧ (SP+addr8) →A ; A∧ (SP+addr16) →A 按位求与 “与”规则:二个都为 1 时,结果为 1;其他都为 0。 例 A=$9F,则执行指令 AND #$C6 后 A= $86 2、逻辑或指令 ;A∨ #opr8 →A ; A∨ (addr8) →A ; A∨ (addr16) →A ORA #opr8 ORA addr8 ORA addr16 ORA addr16,X ; A∨ (HX+addr16) →A ; A∨ (HX+addr8) →A ORA addr8,X ORA ,X ; A∨ (HX) →A ORA addr8,SP ; A∨ (SP+addr8) →A ORA addr16,SP ; A∨ (SP+addr16) →A 按位求或 “或”规则:二个都为 0 时,结果为 0;其他都为 1。 例 A=$9F,则执行指令 ORA #$C6 后 A= $DF ;A∨ #opr8 →A ; A∨ (addr8) →A ; A∨ (addr16) →A 3、逻辑异或指令 EOR #opr8 EOR addr8 EOR addr16 EOR addr16,X ; A∨ (HX+addr16) →A ; A∨ (HX+addr8) →A EOR addr8,X EOR ,X ; A∨ (HX) →A EOR addr8,SP ; A∨ (SP+addr8) →A EOR addr16,SP ; A∨ (SP+addr16) →A 按位求异或 “异或”规则:相同为 0,不同为 1。 例 A=$9F,则执行指令 EOR #$C6 后 A= $59 例 将$50 单元内容中的位 1、5 清 0,位 3、6 置 1,位 0、7 求反。 LDA $50 AND #%11011101 ORA #%01001000 EOR #%10000001 16-8
分享到:
收藏