目录
89C51汇编语言指令由操作码助记符和操作数字段组成
格式:
[标记]:操作码 [目的操作数][,源操作数] [;注释]
寻址指令
1,寄存器寻址 (R0~R7,A(累加器),B,DPTR(数据指针,16位特殊功能寄存器))
MOV A,R0 ;(将r0寄存器中内容送入A中)
2,直接寻址(操作数为RAM片内单元地址)
MOV A,40H ;(将RAM40H单元的内容,直接送入A中)
3,立即数寻址(#加一个数)
MOV A,#40H ;(将40H这个数本身送入A中)
4,寄存器间接寻址(操作数的地址存在寄存器中)
MOV A,@R0 ;(在R0寄存器中找到存放操作数的地址,再根据地址找到操作数放入A中) MOVX A,@DPTR ;(片外RAM)
5,变址寻址(基址寄存器+变址寄存器间接寻址)
MOVC A,@A+DPTR ;(将A+DPTR的值给A)
6,相对寻址(只出现在相对转移指令中,目的地址=源地址+2+rel)
例: JC rel ;当源地址为1000H,rel=75H,则转移的目标地址为1077H
7,位寻址(只有片内RAM 20H~2FH内和能被8整除的寄存器可寻址)
CLR bit ;用bit表示位地址
数据传输指令
1,以累加器A为目的操作数的指令
MOV A,Rn (Rn)->A MOV A,direct (direct)->A MOV A,@Ri ((Ri))->A MOV A,#data #data->A
2,以寄存器Rn为目的地的操作数指令
MOV Rn,A (A)->Rn MOV Rn,direct (direct)->Rn MOV Rn,#data #data->Rn
3,以直接地址为目的操作数的指令
MOV direct,A ;(A)->direct MOV direct,Rn ;(Rn)->direct MOV direct,direct ;(源direct)->direct MOV direct,@Ri ;((Ri))->direct MOV direct,#data ;#data->direct
4,以间接地址为目的操作数的指令
MOV @Ri,A ;(A)->(Ri) MOV @Ri,direct ;(direct)->(Ri) MOV @Ri,A ;data->(Ri)
5,16为数据传送指令
MOV DPTR,#data16 ;dataH->DPL,dataL
6,查表指令
MOVC A,@A+DPTR ;先(PC)+1->PC,后((A)+(DPTR))->A ,一字节(远程) MOVC A,@A+PC ; 先(PC)+1->pc,后((A)+(PC))->A,一字节(近程)
7,累加器A与片外RAM传送指令
MOVX A,@Ri ;((Ri))->A MOVX A,@DPTR ;((DPTR))->A MOVX @Ri,A ;A->(Ri) MOVX @DPTR,A ;A->(DPTR)
8,入栈PUSH,出栈操作POP
PUSH direct ;入栈先sp+1->sp,后(direct)->(sp) POP direct ;先((SP))->direct,后(SP)-1->(SP)
9,交换指令
XCH A,Rn ;将A中内容与Rn中交换 XCHD A,@Ri ;将A与Rn中的,低四位交换
算数运算指令
1,加法指令
ADD A,Rn ;将A与Rn相加放入A ADDC A,Rn ;将A与Rn相加放入A,进位标志CY也加到累加器
2,带借位减法指令
SUBB A,Rn ;将A减Rn中数再减CY中给A
3,乘法指令
MUL AB ;(A)*(B)低字节放A,高字节放B
4,除法指令
DIV AB ;(A)/(B)商放A,余数放B
5,自增自减指令
INC A ;(A)+1->A DEC A ;(A)-1->A
6,十进制调整指令
DA A ;调整累加器A中的内容为BCD码
逻辑操作指令
1,累加器A清零操作
CLR A ;A->0
2,位重置1的操作
SETB C ;1->C 将C内电位置1
3,累加器取反
CPL A ;A电位取反
4,移位指令
RL A ;累加器A循环左移指令 RR A ;累加器A循环右移指令 RLC A ;累加器A带进位循环左移指令 RRC A ;累加器A带进位循环右移指令
5,累加器半字节交换指令
SWAP A ;高低字节交换
6,逻辑与,或,异或指令
ANL A,Rn ;(A)交(Rn)->A ORL A,Rn ;(A)并(direct)->A XRL A,Rn ;(A)异或(Rn)->A
控制转移类指令
1,短转移指令(运行到这时,可在2KB范围内无条件转移到由a10~a0所指的地址单元去)
AJMP addr11 ;先(pc)+2->pc,addr11->PC10~0
2,长转移指令(将指令的第2,3字节地址码装入pc高,低,8位,程序无条件去执行)
LJMP addr16 ;addr16->PC
3,相对转移指令
SJMP rel ;先PC+2->pc,后pc+rel->pc SJMP $ ;无执行
4,间接转移指令
JMP @A+DPTR ;操作A+DPTR->PC
5,空指令(一般用来产生机器周期的延时)
NOP ;(PC)+1->PC
6,判零转移指令
JX rel ;pc+2->pc,A中全零,PC=PC+rel;不全零时,程序顺序执行 JXZ rel ;pc+2->pc,A中全零,PPC+rel->PC;不全零时,程序顺序执行
7,比较转移指令
CJNE(目的字节),(源字节),rel ;PC+3->PC,然后判断若 源字节<目的字节 pc+rel->pc ,0->CY(进位) ; 若 源字节>目的字节 pc+rel->pc ,1->CY(进位) ; 若 源字节=目的字节 顺序执行,0->CY(进位)
8,循环转移指令
DJNZ Rn,rel ;(PC)+2->PC,(Rn)-1->Rn; ;当Rn=0时,结束循环,程序顺序执行,Rn!=0,(PC)+rel->PC DJNZ direct,rel ;(PC)+3->PC,(direct)-1->direct; ;当(direct)=0时,结束循环,程序顺序执行,direct!=0,(PC)+rel->PC
9,调用和返回指令
ACALL addr11 ;短调用指令 LCALL addr16 ;长调用指令 RET ;子程序返回主程序 RETI ;子程序返回主程序,开放中断逻辑
位操作(布尔处理)类指令
89C51中有个位处理机,有一套处理位变量的指令。此处解释位条件转移类指令,其余指令和常规操作类似。
位条件转移类指令
1,判断布尔累加器C转移指令
JC rel ;先进行(PC)+2->PC ;若(C)=1,则 (PC)+rel->PC ;若(C)=0,则顺序往下执行。 JNC rel ;PC+2->PC ;若(C)=0,则(PC)+rel->PC ;若(C)=1,则顺序往下执行。
2,判断变量转移指令
JB bit,rel ;(PC)+3->PC ;若(bit)=1,则(PC)+rel->PC ;若(bit)=0,则顺序执行。 JNB bit,rel ;(PC)+3->PC ;若(bit)=0,则(PC)+rel->PC ;若(bit)=1,则顺序执行。
3,判断变量并清零转移指令
JBC bit,rel ;pc+3->pc ;若(bit)=1,则(pc)+rel->pc,0->bit ;若(bit)=1,则顺序执行。
伪指令
1,ORG汇编起始命令
ORG 2000H ;规定汇编后第一条指令存放的地址(此处为2000)
2,END汇编结束命令
END ;汇编结束指令,之后的所有指令不执行
3,EQU赋值命令
AA EQU R1 ;将R1中的值赋值给AA
4,DATA数据地址赋值命令
AA DATA #0FFH ;DATA与EQU相似可以先使用后定义,常用于定义数据地址。
5,DB定义字节命令
DB 0A3H ;保留一字节或者字节串的储存单元并存入DB后面的数据
6,DW 定义字命令
DW 7234H,8AH,10H ;命令DW后的16位数据项从当前地址连续存放
7,DS 定义存储空间命令
DS 08H ;DS之后的表达式值所规定的存储单元
8,BIT位地址符号命令
A1 BIT P1.O ; 把BIT之后的位地址值赋给字符名