折扣率95:懂汇编的大虾救救小菜啊(200分)

来源:百度文库 编辑:中科新闻网 时间:2024/05/05 15:41:07
这是我们的期末考试题
设在单片机8031内部RAM存在一组无符号数组,其长度为100 起始地址为30H
要求用冒泡排序从大到小排列?原代码我已经有了希望高手把注释给写上 越详细越好,要快 我会给最详细的给奖励100分!
ORG 1000H
BUBBLE: MOV R0,#30H ;R0 为地址指针
MOV B,#64H ;给记数器B初值
CLR 10H ;交换标志清0
DEC B ;记数器B-1
BULOOP: MOV A,@R0
MOV 20H,A
INC R0
MOV 21H,@R0
CJNE A ,21H,BUNEU ;比较两数若不相等则跳转到BUNEU
BUNEU:JNC BUNEXT ;若20h>=21H则转BUNEXT
MOV A,@R0 ;若20H<21H交换两者
MOV @R0 ,20H
DEC R0
MOV @R0 ,A
INC R0 ;复原R0
SETB 10H ;交换标志置1
BUNEXT:DJNZ B,BULOOP
JB 10H,BUBBLE
END
部分解释以给出 请帮我写一分详细的解释 最好一句一个解释
我会在奖励100分的

ORG 1000H ;开始地址
;设定排序数组是放置在R0间址的内存中
;排序方法:
;1. R1=99 to 1
; 2. 设定交换标志=0
; 3. R0指向数组首地址,即R0=#20H
; 4. B=R1 to 1
; 5. 取A=RAM[R0], 21H=RAM[R0+1]做比较及交换用
; 6. 如果 RAM[R0]<RAM[R0+1] 则交换它们, 且交换标志=1
; 7. 如果没有交换,即交换标志=0,表示排序成功,退出程序, 否则继续循环1
;8.退出程序
;==============================
MOV R1,#19H ;****数据个数-1
BUBBLE: CLR 10H ;2. 设定交换标志=0
MOV R0,#30H ;3. R0指向数组首地址,即R0=#20H
MOV B,R1 ;4. B=R1 to 1,确定循环次数
BULOOP: MOV A,@R0 ;5. 设i=R0, 取数组内容A=RAM[i]
INC R0 ;5. 取数组内容21H=RAM[i+1]
MOV 21H,@R0
CJNE A ,21H,$+3 ;6. 将 RAM[i],RAM[i+1]比较,比较结果送C位
JNC BUNEXT ;如果没有借位,即RAM[i]>RAM[i+1],则进行下次循环

;6. RAM[i]<RAM[i+1] 则交换它们, 以下四句交换RAM[i],RAM[i+1]
XCH A,@R0 ;由于R0指向a[i+1],A=a[i], 交换则使得A=a[i+1],a[i]=a[i+1]
DEC R0 ;使R0指向a[i]
MOV @R0,A ;由于R0指向a[i],A=a[i+1], 则使得a[i]=A,即a[i]=原来的a[i+1]
INC R0 ;恢复使得R0指向a[i+1]

SETB 10H ;6. 交换标志置1
BUNEXT: DJNZ B,BULOOP ;进行上述4,5,6循环
JNB 10H,STOP ;即交换标志=0,表示排序成功,退出程序,
DJNZ R1,BUBBLE ;如果有交换或者还有循环没有完成,则循环
STOP: SJMP $ ;停机
END
;=======================================
;%3POST http://zhidao.baidu.com/q HTTP/1.0
ProxD=======================
;=======================================
;=======================================
;=======================================
;=======================================
;=======================================
;=======================================
;你的题目本身有问题。30H开始放100个数,
;30H+100=30H+64H=94H>80H,
;而80H以上被特殊功能寄存器占用,不能用来
;存放用户数据的,至于排序更加不可能。
;所以,注意程序中的*******,我改成排序的
;数为20H个,请根据实际需要改写数的个数。

可惜,汇编我忘光了,早若干年,俺回答你!现在。。。兄弟,等等吧!^_^

ORG 1000H ;开始地址
BUBBLE: MOV R0,#30H ;R0 为地址指针
MOV B,#64H ;给记数器B初值
CLR 10H ;交换标志清0
DEC B ;记数器B-1
BULOOP: MOV A,@R0 ;把30H为地址的内容给A
MOV 20H,A ;把A的内容给20H
INC R0 ;RO地址加一,实现循环
MOV 21H,@R0 把31H为地址的内容给21H
CJNE A ,21H,BUNEU ;比较两数若不相等则跳转到BUNEU
BUNEU:JNC BUNEXT ;若20h>=21H则转BUNEXT
MOV A,@R0 ;若20H<21H交换两者
MOV @R0 ,20H ;把20H的内容还给30H
DEC R0
MOV @R0 ,A
INC R0 ;复原R0
SETB 10H ;交换标志置1
BUNEXT:DJNZ B,BULOOP
JB 10H,BUBBLE
END