目录
前言
在前面两篇文章中,对单片机有了初步的了解,下面将介绍利用汇编语言实现冒泡排序。
一、本篇文章将使用的指令介绍
MOV 传送字或字节
INC 加1,类比与C语言++
DEC 减1,类比与C语言--
JC 有进位/借位时转移,cy端为进位/借位标志位;当进位/借位时cy为1
CJNE 比较不等转移指令
DJNZ 减一不为0跳转指令
SJMP 短跳转指令
CLR 清零指令
JB 无符号小于则跳转
XCH 交换两个操作数的值指令
SETB 置1
二、交换数值的实现
2.1 XCH 两个操作数的数值交换
交换两个操作数的值一般用XCH指令实现,下面是该指令是使用格式:
XCH的使用格式: XCH A,SRC(SRC为源操作数)
观察格式发现第一个操作数只能是累加器A,那么如果要实现R0跟R7内是数值交换怎么做呢?由于第一个操作数被限定为A,那么就需要将R0/R7的其中一个数值给A,再与另外一个数进行交换;而给A数值的R7/R0需要再被A交换或者传数值,代码实现如下:
MOV R0,#5 ;XCH function:exhange the vail between two number
MOV R7,#45
MOV A,R0
XCH A,R7
MOV R0,A ;XCH A,R0
END ;结束标志符
执行XCH指令后的结果为:
此时可以发现仅仅A与R7的数值进行了交换,而R0几乎没变。这是因为仅仅对R0进行了传送数据的指令操作,而没有对R0进行另外的操作,所以在第五行需要对R0进行操作,如果执行第五行——MOV R0,A 的结果为:
而如果执行——XCH A,R0,结果为:
从结果来看,MOV R0,A或者XCH A,R0的最后目的都达到了,不同的区别点就是程序结束后,累加器A的数值不一样。在具体功能的实现下这两者需要加以区分。
看完XCH的数值交换实现后,你可能会想如果不用XCH能不能实现两个操作数的数值交换呢?结果是肯定的。那么该如何实现呢,这其实与酱油,醋瓶的交换类似。设想一下,你面前由一个红色瓶装醋,一个蓝色瓶装酱油,如果要求将酱油装如红色瓶,醋装入蓝色瓶,该如何操作呢?
没错,就是在用一个空瓶作为中介,借助它实现酱油,醋瓶的交换。由此,可以实现30H单元与50H 单元的数值交换,以60H单元作为中介,代码如下:
MOV 30H,#30H function:exhange the vail between two number
MOV 50H,#20H
MOV 60H,30H
MOV