# 8086 program to sort an integer array in ascending order

**Problem –** Write a program in 8086 microprocessor to sort numbers in ascending order in an array of n numbers, where size “n” is stored at memory address 2000 : 500 and the numbers are stored from memory address 2000 : 501.

**Example –**

Example explanation:

**Pass-1:**F9 F2 39 05 F2 F9 39 05 F2 39 F9 05 F2 39 05 F9 (1 number got fix)**Pass-2:**F2 39 05 F9 39 F2 05 F9 39 05 F2 F9 (2 number got fix)**Pass-3:**39 05 F2 F9 05 39 F2 F9 (sorted)

**Algorithm –**

- Load data from offset 500 to register CL (for count).
- Travel from starting memory location to last and compare two numbers if first number is greater than second number then swap them.
- First pass fix the position for last number.
- Decrease the count by 1.
- Again travel from starting memory location to (last-1, by help of count) and compare two numbers if first number is greater than second number then swap them.
- Second pass fix the position for last two numbers.
- Repeate.

**Program –**

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 |

**Explanation –**

**MOV SI, 500**: set the value of SI to 500.**MOV CL, [SI]**: load data from offset SI to register CL.**DEC CL**: decrease value of register CL BY 1.**MOV SI, 500**: set the value of SI to 500.**MOV CH, [SI]**: load data from offset SI to register CH.**DEC CH**: decrease value of register CH BY 1.**INC SI**: increase value of SI BY 1.**MOV AL, [SI]**: load value from offset SI to register AL.**INC SI**: increase value of SI BY 1.**CMP AL, [SI]**: compares value of register AL and [SI] (AL-[SI]).**JC 41C**: jump to address 41C if carry generated.**XCHG AL, [SI]**: exchange the contents of register AL and SI.**DEC SI**: decrease value of SI by 1.**XCHG AL, [SI]**: exchange the contents of register AL and SI.**INC SI**: increase value of SI by 1.**DEC CH**: decrease value of register CH by 1.**JNZ 40F**: jump to address 40F if zero flat reset.**DEC CL**: decrease value of register CL by 1.**JNZ 407**: jump to address 407 if zero flat reset.**HLT**: stop.

## Recommended Posts:

- 8086 program to sort an integer array in descending order
- 8086 program to print the table of input integer
- 8086 program for selection sort
- 8086 program to find the min value in a given array
- 8086 program to determine largest number in an array of n numbers
- 8086 program to determine modulus of first array elements corresponding to another array elements
- 8086 program to determine cubes of numbers in an array of n numbers
- 8086 program to determine product of corresponding elements of two array elements
- 8086 program to determine squares of numbers in an array of n numbers
- 8086 program to add two 8 bit BCD numbers
- 8086 program to subtract two 8 bit BCD numbers
- 8086 program to add two 16 bit BCD numbers with carry
- 8086 program to multiply two 8 bit numbers
- 8086 program to multiply two 16-bit numbers
- 8086 program to subtract two 16 bit BCD numbers

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.