📜  8086程序以升序对整数数组进行排序

📅  最后修改于: 2021-06-28 15:31:17             🧑  作者: Mango

问题–在8086微处理器中编写一个程序,以按n个数字的升序对数字进行排序,其中大小“ n”存储在内存地址2000:500中,而数字存储在内存地址2000:501中。

例子 –

示例说明:


  • Pass-1: F9 F2 39 05 F2 F9 39 05 F2 39 F9 05 F2 39 05 F9(已修复1个数字)
  • Pass-2: F2 39 05 F9 39 F2 05 F9 39 05 F2 F9(修复了2个数字)
  • Pass-3: 39 05 F2 F9 05 39 F2 F9(已排序)

算法 –

  1. 将数据从偏移500加载到寄存器CL(用于计数)。
  2. 从起始存储位置移动到最后一个位置,如果第一个数字大于第二个数字,则比较两个数字,然后交换它们。
  3. 首遍确定最后一个号码的位置。
  4. 将计数减少1。
  5. 再次从起始存储位置移动到(last-1,借助计数),如果第一个数字大于第二个数字,则比较两个数字,然后交换它们。
  6. 第二遍确定最后两个数字的位置。
  7. 重复。

程序 –

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 JC 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

解释 –

  1. MOV SI,500 :将SI的值设置为500。
  2. MOV CL,[SI] :将数据从偏移量SI加载到寄存器CL。
  3. DEC CL :寄存器CL的值减1。
  4. MOV SI,500 :将SI的值设置为500。
  5. MOV CH,[SI] :将数据从偏移量SI加载到寄存器CH。
  6. DEC CH :将寄存器CH的值减1。
  7. INC SI :SI的值增加1。
  8. MOV AL,[SI] :从偏移量SI加载到寄存器AL的值。
  9. INC SI :SI的值增加1。
  10. CMP AL,[SI] :比较寄存器AL和[SI](AL- [SI])的值。
  11. JC 41C :如果产生进位,则跳转到地址41C。
  12. XCHG AL,[SI] :交换寄存器AL和SI的内容。
  13. DEC SI :将SI的值减1。
  14. XCHG AL,[SI] :交换寄存器AL和SI的内容。
  15. INC SI :将SI的值增加1。
  16. DEC CH :将寄存器CH的值减1。
  17. JNZ 40F :如果归零复位,则跳转到地址40F。
  18. DEC CL :将寄存器CL的值减1。
  19. JNZ 407 :如果归零复位,则跳转到地址407。
  20. HLT :停止。