;-----------------------------------------------------
SORT: ;排序程序
MOV B, #49 ;第一轮排序时,比较49次
S1: MOV R0, #20H ;数据区的起始地址
CLR PSW5 ;清除"交换"标志位
MOV R7, B
S2: MOV A, @R0 ;取前一个数
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移
MOV A, @R0 ;取后一个数,准备交换
DEC R0
XCH A, @R0 ;交换到前一个
INC R0
XCH A, @R0 ;交换到后一个
SETB PSW5 ;设定"交换"标志位
S4: DJNZ R7, S2 ;继续本轮比较
JNB PSW5, ENDS ;如本轮没有进行过交换,可提前结束
DJNZ B, S1 ;下一轮,比较次数少一次
ENDS: RET
;-----------------------------------------------------
一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列
SORT:
MOV
A,R0
;
MOV
R1,A
;(R1)为首地址
MOV
A,R2
;字节数送入
R5
MOV
R5,A
;(R5)为字节数
CLR
F0
;互换标志位F0清零
DEC
R5
;循环n-1
MOV
A,@R1
;
LOOP:
MOV
R3
,A
;(R3)为前一个数
INC
R1
;地址指向下一个数
CLR
C
;
MOV
A,@R1
;取下一个数
SUBB
A,R3
;比较大小
JNC
LOOP1
;如果进位位Cy=0,则转移
SETB
F0
;互换标志位F0置1
MOV
A,R3
;前面大的数放到A
XCH
A,@R1
;互换后,小的数在A,大数在@R1
DEC
R1
;(R1)指向前一个地址
XCH
A,@R1
;小的数放到前一个地址
INC
R1
;
(R1)指向下一个地址
LOOP1:
MOV
A,@R1
;取下一个数
DJNZ
R5,LOOP
JB
F0,SORT
如果直接寻址位=1,则转移
RET这是单片机汇编语言的经典冒泡法排序,看懂了,对你很有帮助!把R0=30H
,R2=100H-30H代入,就可以得到你要的结果
ORG 0000H
LJMP 2000H
ORG 2000H
;原址排序
;比较片内RAM30H,31H,32H三个单元数的大小
;并把数据按照从大到小的顺序又存入30H,31H,32H单元中
MAIN:
MOV SP,#80H
MOV R2,#2 ;假设你要进行n个数的排序,则将R2设为N-1就行
MOV A,R2
MOV R3,A
S0:MOV 80H,R2
MOV R0,#30H
MOV R1,#31H
S1:MOV A,@R0
MOV B,@R1
CJNE A,B,S
S:JNC S2 ;改为'JC S2',则对N个数从小到大排序
XCH A,B ;@R0<@R1则对调
MOV @R0,A
MOV @R1,B
S2:INC R0
INC R1
DJNZ R2,S1
MOV R2,80H
DEC R2
DJNZ R3,S0
JMP $
END
以上就是关于帮忙 汇编语言 数据的排序 急急急急急急!!1全部的内容,包括:帮忙 汇编语言 数据的排序 急急急急急急!!1、用单片机汇编语言编写从30H开始的100数据的排列 从小到大程序、求单片机汇编语言排序程序,哪位高手帮帮忙呀等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)