问题–在8086微处理器中编写一个程序,以按n个数字的降序对数字进行排序,其中大小“ n”存储在内存地址2000:500中,而数字存储在内存地址2000:501中。
例子 –
示例说明:
- Pass-1: 32 05 14 50 32 05 14 50 32 14 05 50 32 14 50 05 (已解决1个数字)
- Pass-2: 32 14 50 05 32 14 50 05 32 50 14 05 (2个数字已修复)
- Pass-3: 32 50 14 05 50 32 14 05 (已排序)
算法 –
- 将数据从偏移500加载到寄存器CL(用于计数)。
- 从起始存储位置移动到最后一个位置,如果第一个数字小于第二个数字,则比较两个数字,然后交换它们。
- 首遍确定最后一个号码的位置。
- 将计数减少1。
- 再次从起始存储位置移动到(last-1,借助计数),如果第一个数字小于第二个数字,则比较两个数字,然后交换它们。
- 第二遍确定最后两个数字的位置。
- 重复。
程序 –
MEMORY ADDRESS | MNEMONICS | COMMENT |
---|---|---|
400 | MOV SI, 500 | SI<-500 |
403 | MOV CL, [SI] | CL<-[SI] |
405 | DEC CL | CL<-CL-1 |
407 | MOV SI, 500 | SI<-500 |
40A | MOV CH, [SI] | CH<-[SI] |
40C | DEC CH | CH<-CH-1 |
40E | INC SI | SI<-SI+1 |
40F | MOV AL, [SI] | AL<-[SI] |
411 | INC SI | SI<-SI+1 |
412 | CMP AL, [SI] | AL-[SI] |
414 | JNC 41C | JUMP TO 41C IF CY!=1 |
416 | XCHG AL, [SI] | SWAP AL AND [SI] |
418 | DEC SI | SI<-SI-1 |
419 | XCHG AL, [SI] | SWAP AL AND [SI] |
41B | INC SI | SI<-SI+1 |
41C | DEC CH | CH<-CH-1 |
41E | JNZ 40F | JUMP TO 40F IF ZF=0 |
420 | DEC CL | CL<-CL-1 |
422 | JNZ 407 | JUMP TO 407 IF ZF=0 |
424 | HLT | END |
解释 –
- MOV SI,500 :将SI的值设置为500。
- MOV CL,[SI] :将数据从偏移量SI加载到寄存器CL。
- DEC CL :寄存器CL的值减1。
- MOV SI,500 :将SI的值设置为500。
- MOV CH,[SI] :将数据从偏移量SI加载到寄存器CH。
- DEC CH :将寄存器CH的值减1。
- INC SI :SI的值增加1。
- MOV AL,[SI] :从偏移量SI加载到寄存器AL的值。
- INC SI :SI的值增加1。
- CMP AL,[SI] :比较寄存器AL和[SI](AL- [SI])的值。
- JNC 41C :如果未产生进位,则跳转到地址41C。
- XCHG AL,[SI] :交换寄存器AL和SI的内容。
- DEC SI :将SI的值减1。
- XCHG AL,[SI] :交换寄存器AL和SI的内容。
- INC SI :将SI的值增加1。
- DEC CH :将寄存器CH的值减1。
- JNZ 40F :如果归零复位,则跳转到地址40F。
- DEC CL :将寄存器CL的值减1。
- JNZ 407 :如果归零复位,则跳转到地址407。
- HLT :停止。