ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条。
ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。
例如:
ORG 2000H
(1) 分号“;” 分隔符 这条指令到此为止 相当于C的注释符,后面可以添加注释
(2) 程序中的标点符号,必须是在英文状态下输入,半角
(3) 标号(标号可指定除系统占用外的标号)
MAIN : 待执行程序;
LJMP MAIN; 执行完过后跳转回标号处
(4) 程序调用: LCALL
LCALL DELAY;调用DELAY标号下的程序
(5) 返回指令: RET
执行程序时遇到RET指令,返回,然后执行之后的指令,如同C语言的return
(6)子程序
延时程序
DELAY: 程序代码;
RET; 返回
END;结束子程序
(7)减一跳转指令:DJNZ (Decrese one if not zero jump to REL)
格式: DJNZ Rn,rel; 双字节指令 Rn <=255 或者 -127<Rn<128
DJNZ direct,rel;单字节指令
说明:DJNZ RN,REL 是一条件转移指令,先将工作寄存器Rn中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到行标为REL的地方执行,否则,为“0”就不转移,继续执行下一条指令。
例子:延时程序 延时 250*250 = 62500 个指令周期
DELAY: MOV R7,#250 ; 工作寄存器 R7 =250
D1:MOV R6,#250; 工作寄存器 R6 =250
D2:DJNZ R6,D2 ; while(R6) R6--
DJNZ R7,D1 ; IF(R7-- >0) LJMP:D1
RET ; 结束程序
END ; 结束标志
(8)机器周期:计算机每访问一次存储器的时间 一个机器周期=12个震荡周期
震荡周期:震荡源的周期,即晶振等时间源周期,若使用12M晶振那么其
震荡周期= 1/(12,000,000) 即1/12微秒 那么一个机器周期即1微秒
指令周期: 执行一次指令所需要的机器周期,不同的指令需要的机器周期
是不一样的,我们一般需要知道与时间有关的指令的周期,如DJNZ为双周
期指令,即如果用12M晶振,执行一次DJNZ需要的时间为2微秒。
(9)外部时钟电路:当系统使用多片单片机时,为了保证每片单片机的时钟频
率是一样的,各个单片机需要在外部接入同一个时钟信号源。
(10)单片机的存储器ROM和RAM
ROM:READ ONLY MEMROY 只读存储器,用来存储单片机的控制程序
和不可更改数据。
RAM:READ ACCESS MEMROY随机读写存储器,一般用作单片机的功能
寄存器和工作寄存器
(11)直接寻址:MOV R6,#22; 直接使用数所在的地址传送,R6是定义的一
个绝对地址。
寄存器寻址:MOV 30H,#22;
MOV R6,30H; 先把数存储在一个中间变量,然后再传送
以累加器为目的操作数的指令
(1)MOV A,Rn 将寄存器Rn中的值传入A
(2)MOV Rn,A 将累加器中的值传入寄存器Rn
(3)MOV A,direct 将直接地址中的值传入累加器A
(4)MOV A,@Ri 将寄存器中的值作为地址把该地址中的内容传入A
(5)MOV A,#DATA 将立即数传入A
(12)单片机与外部RAM之间的数据交换,在51系列单片机中所有要送入或读
出外部RAM的数据必须先送到A中去,内部RAM可以直接传送数据,外部
RAM不行。
指令
(1)MOVX A,@Ri ;将外部RAM地址存储于Ri 或者DPTR然后将地址
指向的内容传入A
(2)MOVX @Ri,A
(3)MOVX A,@DPTR
(4)MOVX @DPTR,A
(13)单片机伪指令
伪指令是用来给寄存器定义或者赋值的指令
ORG :程序开始地址伪指令,本条指令的下一条指令从指定的地址开始存
放数据。
DB:定义字节伪指令
从程序存储器某位置开始存储一组规定好的8位2进制数
DW:定义字伪指令
从程序存储器某位置开始存储一组规定好的16位2进制数
DS:保留空间伪指令
ORG 2000H;
TAB: DB 45,48H,10,34H;
以上程序意义为 从存储器地址2000H处依次存进45,48H,10,34H;
ORG 2000H;
ABC:DS0 8H;
LOOP:MOV A,30H;
LOOP 标号的指令存储在2008H后
注意:DB,DW,DS只能针对ROM存储器,不能操作RAM
(14)堆栈的操作指令
(1)PUSH direct 将direct中的内容推入堆栈
(2)POP direct 将对堆栈中的内容取出存至direct
堆栈操作指令 流程
先确定 堆栈开始地址 MOV SP,#5FH;
MOV A,#100;
MOV B, #20;
PUSH ACC;堆栈地址+1
PUSH B; 在#60H处存入 20
POP B; 将#60H处的20取出
POP ACC;堆栈地址-1 当前堆栈地址为#5FH
(15)加法运算指令
ADD(8位加法),ADDC(带进位加法,进位存在PSW的CY位中)
SUBB (带借位的减法指令,没有不带借位的减法指令)
ADD A,Rn;
ADD A,@Ri;
ADD A,direct;
ADD A,#data;
ADDC是进行低8位加法,若有进位则存在CY中,再做高位加法将结果加
上进位,得到最终答案。
(16)乘法指令
MUL
用法 MUL A B; 其功能为将A与B值相乘,其中得到值得高八位存在B中,
低八位存在A中,若超出16位值,则PSW的OV位溢出,否则OV位为0,CY
位则是总是为0;
注意 A B均为无符号数
(17)除法指令
DIV
用法:DIV AB (A/B)
8位无符号数A 除以8位无符号数B,得到的商存至 A 中,余数存至 B中,
若DIV AB ; B= 00H 即除数为0 ,则OV为1 溢出。
(18)加1指令 INC 单周期指令
减1指令 DEC
用法: INC A;
INC Rn; INC direct; INC @Ri;
注意,在算数运算类指令中,除了INC DEC其他指令都要将结果放在累加器
A 中。
(19)对累加器的逻辑运算指令
(1累加器清零 CLR A;
(2)逻辑“非”,逐位取反 CPL A;
(3)逻辑左移,逐位左移 RL A;
(4)加上CY逻辑左移,相当于带移动的数为9位数 RLC A;
(5)逻辑右移 RR A;
(6)加上CY逻辑右移 RRC A;
(7)高低4为交换 SWAP A;
(20)两个寄存器间的逻辑运算 所得结果放在前一个值
(1)逻辑与 ANL ANL A,Rn; 结果放在A中
(2)逻辑或 ORL ORL A,Rn;
(3)逻辑异或 XRL XRL A,Rn;
流水灯实验:
ORG 0000H ; 程序开始地址(复位地址)
LJMP START ; 程序跳到start标号处
ORG 30H ; 程序指令存储开始地址 30H
START:MOV SP,#5FH ; 堆栈初始化指令
MOV A,#80H ; A 1000000
LOOP:MOV P1,A ; 将P1寄存器的值改为A中的值
RL A ; 左移
LCALL DELAY ;延时
LJMP LOOP ; 循环
DELAY:MOV R7,#255 ; 延时程序
D1:MOV R6,#255 ;
D2:NOP
NOP
NOP
NOP
DJNZ R6,D2 ;
DJNZ R7,D1 ;
RET ;
END ;
延时时间 = 255*255*4个指令周期
(21)条件转移指令
(A)无条件转移指令
(1)无条件绝对转移指令 AJMP addr11
(2)无条件长转移指令 LJMP addr16
(3)无条件相对转移指令 SJMP rel
addr11 跳转地址范围 限制为11位字节即2k页面内
addr16 跳转地址范围 限制为16位字节即64k(51最大外部rom)
页面内
rel 跳转地址范围为8位地址内
原则上AJMP,SJMP都可以用LJMP 替代
(4)无条件间接转移指令 JMP @A+DPTR
将跳转表格的首地址存入DPTR中,然后通过向A输入值来确定
要跳转至表格的位置,实现按键功能等。。
(B)条件转移类指令
(1)累加器为0转移指令:JZ rel; MOV A,R0;JZ L1;
( 2) 累加器为非0转移指令:JNZ rel;
(C)比较转移指令
(1)CJNE A,#data,rel 比较如果A!=#data则跳转至rel地址;相等,
则顺序执行,同时如果A>data则CY=0否则CY=1;
(D)循环转移指令
DJNZ Rn,rel; 减1不为0则跳转,否则继续执行
(22)调用和返回指令
(1)长调用 LCALL addr16
(2)短调用 ACALL addr11
(3)返回
子程序返回 RET
中断返回 RETI
(4)空操作指令 NOP 停一个机器周期
(23)位操作指令
(1)位数据传输
A.MOV C,bit ------> MOV C,P1.0;
B.MOV bit,C-------> MOV P1.0,C;
(2)位清零指令
A,CLR C ------->使CY位=0
B,CLR bit------->CLR P1.0;
(3)位置1指令
A,SETB C----->使CY=1;
B,SETB bit------>SETB P1.0;
(4)位取反指令
A,CPL C -------->CY取反
B,CPL bit------->CPL P1.0;
(5)位逻辑与指令
A.ANL C,bit
B.ANL C,/bit 将bit位取出后 取反 再与C逻辑与,其结果存
在CY中,bit中的值不变
(6)位逻辑或指令
A.ORL C,bit
B.ORL bit,C
(7)判CY条件转移指令
A.JC rel CY=1 转移至rel 否则顺序执行
B.JNC rel CY!=1 转移至rel 否则顺序执行
(8)判位变量转移指令
A.JB bit,rel---->JB P1.0,LOOP; 若P1.0=1则loop
B.JNB bit,rel
C.JBC bit,rel----->JB P1.0,LOOP;若P1.0=1则转移至loop
同时将P1.0清零。