先决条件–冒泡排序
问题–在8085微处理器中编写汇编语言程序,以使用冒泡排序对n个给定的数字列表进行排序。
例子 –
假设–列表大小存储在2040H,数字列表存储在2041H起。
算法 –
- 将列表加载到C寄存器中并将D寄存器设置为0
- 对于n个元素,递减C进行n-1个比较
- 在累加器中加载列表的起始元素
- 比较累加器和下一个元素
- 如果累加器小于或等于下一个元素,则跳至步骤8
- 交换两个元素
- 将D寄存器设置为1
- 减量C
- 如果C> 0,则取累加器中的下一个元素,然后转到点4
- 如果D = 0,则意味着在迭代中不进行任何交换,因此我们知道在以后的迭代中不会进行交换,因此退出了循环,并停止了程序
- 跳至步骤1进行进一步的迭代
程序 –
Address | Label | Instruction | Comment |
---|---|---|---|
2000H | START | LXI H, 2040H | Load size of array |
2003H | MVI D, 00H | Clear D register to set up a flag | |
2005H | MOV C, M | Set C register with number of elements in list | |
2006H | DCR C | Decrement C | |
2007H | INX H | Increment memory to access list | |
2008H | CHECK | MOV A, M | Retrieve list element in Accumulator |
2009H | INX H | Increment memory to access next element | |
200AH | CMP M | Compare Accumulator with next element | |
200BH | JC NEXTBYTE | If accumulator is less then jump to NEXTBYTE | |
200EH | JZ NEXTBYTE | If accumulator is equal then jump to NEXTBYTE | |
2011H | MOV B, M | Swap the two elements | |
2012H | MOV M, A | ||
2013H | DCX H | ||
2014H | MOV M, B | ||
2015H | INX H | ||
2016H | MVI D, 01H | If exchange occurs save 01 in D register | |
2018H | NEXTBYTE | DCR C | Decrement C for next iteration |
2019H | JNZ CHECK | Jump to CHECK if C>0 | |
201CH | MOV A, D | Transfer contents of D to Accumulator | |
201DH | CPI 01H | Compare accumulator contents with 01H | |
201FH | JZ START | Jump to START if D=01H | |
2022H | HLT | HALT |
解释-
- 检索累加器中的元素。
- 将其与下一个元素进行比较(如果更大),然后交换,否则移至下一个索引。
- 如果在一个完整的循环中没有交换,则暂停,否则重新开始整个迭代。
- 以下方法有两个循环,一个循环嵌套在其他循环中,
最坏情况和平均情况下的时间复杂度:O(n * n)。最坏的情况发生在对数组进行反向排序时。
最佳情况下的时间复杂度:O(n)。最好的情况是对数组进行排序时。