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