南十一112吧 关注:40贴子:1,037
  • 0回复贴,共1

HCS12汇编指令

只看楼主收藏回复

#取立即数
立即数寻址:LDAA #$66
直接寻址 LDAA $55
扩展寻址 LDX $4567
累加器变址寻址 LDAB A,X ;将X+A作为地址的内存字节加在到累加器B
加载指令:LDAA $55;将$0055内存单元的数据加载到累加器A中
LDAB $55;将$0055内存单元的数据加载到累加器B中
LDD #$40 ;将$0040加载到累加器D
LDX #$1000;将$1000加载到累加器X
LDD D,X ;将D+X内存单元中的数据加载到累加器D
LDD [D,X];将累加器X+D的内容为地址的指针的内容加载到累加器D中
LDS X ;将X指向的内存单元的内容加载到堆栈指针SP
LDX #$2000 ;将立即数$2000加载到变址寄存器X
LDY #$2000 ;将立即数$2000加载到变址寄存器Y
有效地址加载指令(将有效地址加载到X,Y,SP):
LDY #$2000
LEAS 4,Y+;SP的值为$2000,然后Y的值加4,Y的值变为$2004
存储指令将累加器或者CPU寄存器的内容写入内存单元
STAA $1000;将累加器A的内容存到地址为$1000的内存单元
STY $2000;将变址寄存器Y的内容存储到内存单元$2000,$2001
传送指令:
TAB ;A传送到B
TAP ;将累加器A传送到CCR
TBA ;B传送到A
TFR X,A;将X低8位传送到累加器A中
TPA ;将CCR传送到A
TSX ;将SP传送到X
TXS ;将寄存器X传送到堆栈指针SP
寄存器交换指令:
EXG A,B;交换A与B的内容
符号扩展SEX;符号位扩展为8位
MOVE指令:
MOVB $2000,X;将2000单元的内容放到寄存器X中
MOVB $80,8,Y;将0080单元的内容放到寄存器Y+8单元中
MOVW #$1234,$1000;将$12放到$1000的单元,$34放到1001单元
MOVW 2,X+,4,Y+;将X指向的2B字节空间存放到Y指向的2B内存空间中,然后X加2,Y加4。
加法减法指令:
ABA;将A=A+B
ABX;X=X+B
ABY;Y=B+Y
ADDA X;将A的内容加上内存X单元的内容放到A中
ADCA X;将A的内容加上X指向的内存单元内容再加进位放到A中
SBA;A=A-B
SUBA X;A减去X内存中的内容放到A中
INC $1000;将1000地址单元的内容加1
INCA;将累加器A的内容加1
INS;将SP内容加1
INX;将X内容加1
INY;将Y内容加1
DEC $1000;将1000内存单元的内容减1
DECA;累加器A的内容减1
DECB
DES
DEX
比较指令:
CBA:A-B 影响CCR NZVC四个标记位
CMPA X;将A的内容与X指向的数据单元内容比较
CMPB
CPD 5,X;将D的内容与X+5指向的数据单元的2B内容比较
CPS $100;将SP的内容与$100 101单元的一个字内容比较
CPX $20;将X的内容与$20单元的的内容比较
CPY
测试指令(用来测试内存单元或者寄存器是否为0的一类指令)
该指令执行减0操作,结果不回送。
TST $1000;
TSTA
TSTB
逻辑运算指令
与运算
ANDA #$00;将A的内容清0
ANDB $2000;将B的内容与$2000地址内容相与
ANDCC #$00;将CCR清0
异或运算
EORA $80;将A与80地址的数据异或
EORB
或运算
ORAA $80;将A与$80地址的内容或运算 结果放回B
ORAB $80;将B与80内容或运算 结果放回B
ORCC $80;
清零,求补,取反指令
CLC;清零CCR中的C位
CLI;清零CCR中的I位
CLV;清零CCR中的V位
CLR $80;将80地址内容清0
CLRA;清寄存器A
CLRB;清寄存器B
COM $80;FF-80中的内容放回到80内存单元中
COMA;FF-A=A
COMB;FF-B=B
乘法指令:
LDD #300;
LDY #500;
EMUL;结果存在Y:D中
LDD #300;
LDY #-500;
EMULS;结果存于Y:D中 -150000
LDDA #125
LDAB #80
MUL;AXB结果放到A:B中
除法指令
EDIV;(Y:D)/X->Y;余数->D
EDIVS;带符号
FDIV;D/X->X;余数->D
位操作:
BCLR $2000,#$81;将$2000地址的最高位和最低位清0
BSET $55,#$80;将内存55单元的最高位置1
移位循环指令:
移动一位,空位补0,进位进入C
逻辑移位:
LSL
LSLA
LSLB
LSLD
LSR
LSRA
LSRB
LSRD
算术移位:
ASL
ASLA
ASLB
ASLD
ASR
ASRA
ASRB
循环左移指令:
ROL
ROLA
ROLB
ROR
RORA
RORB
最大值最小值指令:
MAXA $1080;比较A与$1080的内容,将大的放到A中
转移指令:
BRA;总转移
BRN;不转移
BCC;当C=0时跳转
BCS;当C=1时跳转
BEQ; 当Z=1时跳转
BNE; 当Z=0时跳转
BMI; 当N=1时跳转
BPL; 当N=0时跳转
BVC; 当V=0时跳转
BVS; 当V=1时跳转
长转移指令:指令前加L
循环控制指令:
DBEQ B ,LOOP1;B减1,如果为0则跳转到LOOP1处执行
DBNE SP,LOOP2;SP减1,如果不为0则转到LOOP2处
IBEQ X,LOOP3;X加1,如果为0则跳转到LOOP3执行
IBNE Y,LOOP4;Y加1,如果不为0则跳转到LOOP4执行
TBEQ D,LOOP5;如果D=0,则跳转到LOOP5执行
TBNE A,LOOP6;如果A不为0,则跳转到LOOP6处执行
跳转,子程序调用指令:
JMP Y;调到Y指向的地址去执行
中断指令
SWI;软中断指令
TRAP;陷阱指令
RTI;中断返回指令
堆栈操作指令:
PSHA;将A存放到堆栈中
PSHB;将B存放到堆栈中
PSHC;PUSH CCR
PSHD;push D
PSHX
PSHY
PULA;出栈到A
PULB
PULC
PULD
PULX
PULY
其他指令:
STOP;停止单片机
WAI;等待中断
NOP;延时
汇编语言程序设计:
十六进制$
八进制@
二进制数%
字符串常量;单引号或者双引号
汇编伪指令:
ORG $4000;通知编译器从4000地址开始定位下面的代码
EQU ;表达式与数值等价
Count SET 1;Count设置成1
Somedata: DC.B 01;从Somedata开始的数据单元的内容依次为$05
String: DC.B $A,$B;从String开始的数据单元内容依次为$0A,$0B
String: FCC 'ABCD';从string开始的数据单元依次为ABCD的ASCII码
Label1:DCB.B 10,$00;将Label1开始的10个字节全部清零
Label2:DCB.L 10,$ffffffff;将Label2开始的10个4字节空间全部初始化为$ffffffff
ABSENTRY entry;定义程序入口点


IP属地:北京1楼2014-06-07 14:10回复