问题–在8086微处理器中编写汇编语言程序,以使用选择排序对给定的n个数字数组进行排序。
假设–数组中元素的数量存储在偏移量500处。数组从偏移量501开始。
例子 –
算法 –
- 我们首先找到数组中最小的数字。
- 从数组的第一个元素交换最小的数字。
- 继续重复该过程,直到遍历所有元素。
程序 –
Offset | Mnemonics | Comment |
---|---|---|
400 | MOV DI, 501 | DI < – 501 |
403 | MOV SI, 500 | SI < – 500 |
406 | MOV CL, [SI] | CL < – [SI] |
408 | XOR CH, CH | CH < – CH ^(XOR) CH |
40A | INC SI | SI < – SI+0001 |
40B | DEC CX | CX < – CX-0001 |
40C | MOV BX, SI | BX < – SI |
40E | MOV AH, CL | AH < – CL |
410 | INC AH | AH < – AH+01 |
412 | MOV AL, [SI] | AL < – [SI] |
414 | INC SI | SI < – SI+0001 |
415 | DEC AH | AH < – AH-01 |
417 | CMP AL, [SI] | AL-[SI] |
419 | JC 41F | If Carry Flag = 1, goto offset 41F |
41B | MOV AL, [SI] | AL < – [SI] |
41D | MOV BX, SI | BX < – SI |
41F | INC SI | SI < – SI+0001 |
420 | DEC AH | AH < – AH-01 |
422 | JNZ 417 | If Zero Flag = 0, goto offset 417 |
424 | MOV DL, [BX] | DL < – [BX] |
426 | XCHG DL, [DI] | DL < – > [DI] |
428 | XCHG DL, [BX] | DL < – > [BX] |
42A | INC DI | DI < – DI+0001 |
42B | MOV SI, DI | SI < – DI |
42D | LOOP 40C | CX < – CX-0001; If Zero Flag = 0, goto offset 40C. |
42F | HLT | End of program. |
说明–寄存器AH,AL,BX,CX,DL,SI,DI用于一般用途:
AL - Stored the smallest number
AH - Stores the counter for the inner loop
BX - Stores the offset of the smallest
number of each iteration of the outer loop
CX - Stores the counter for the outer loop
DL - Helps in swapping the elements
SI - Pointer
DI - Pointer
- MOV SI,500:在SI中存储0500。
- MOV CL,[SI]:将内容存储在CL中的偏移量SI处。
- XOR CH,CH:将逻辑运算XOR b / w CH和CH的结果存储在CH中。
- INC SI:将SI的值增加1。
- DEC CX:将CX的值减小1。
- MOV AH,CL:将CL的内容存储在AH中。
- CMP AL,[SI]:将AL的内容与偏移SI的内容进行比较。如果AL <[SI] –设置进位标志(即,进位标志= 1)。
- JC 41F:如果进位标志被设置(1),则跳至偏移量041F。
- JNZ 417:如果重置零标志(0),则跳至偏移量0417。
- XCHG DL,[BX]:将DL的内容与偏移量BX处的内容交换。
- 回路40C:将CX的值减1,然后检查是否置零标志(1)。如果将零标志复位(0),则它会跳转到偏移量040C。
- HLT:终止程序。