用8086x编写一个程序,要求使用双循环冒泡法将-15,-12,3从小到大排列
时间: 2023-09-11 12:06:48 浏览: 86
S7-1200循环中断OB30的使用方法及示例程序.docx
5星 · 资源好评率100%
以下是使用8086汇编语言实现双循环冒泡排序的程序,可以将-15,-12,3从小到大排列:
```
.MODEL SMALL
.STACK 100H
.DATA
ARRAY DB -15, -12, 3
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 3 ;循环次数
MOV SI, 0 ;起始地址
OUTER_LOOP:
MOV DI, SI ;内循环起始地址
INC DI ;下一个元素
MOV BX, CX ;保留CX值
DEC BX ;减去1个元素
INNER_LOOP:
MOV AL, [ARRAY + DI - 1] ;获取当前元素
CMP AL, [ARRAY + DI] ;比较当前元素和下一个元素
JLE SKIP_SWAP ;如果当前元素小于等于下一个元素,则跳过交换
XCHG [ARRAY + DI - 1], [ARRAY + DI] ;交换当前元素和下一个元素
SKIP_SWAP:
INC DI ;下一个元素
LOOP INNER_LOOP ;内循环结束
DEC CX ;减少循环次数
INC SI ;下一个元素
CMP CX, 0 ;检查循环是否结束
JNE OUTER_LOOP ;如果循环未结束,则继续进行外循环
;输出排序后的数组
MOV AH, 09H ;设置输出字符串的功能号
LEA DX, ARRAY ;获取数组的地址
MOV CL, 3 ;循环次数
MOV SI, 0 ;起始地址
PRINT_LOOP:
MOV AL, [DX + SI] ;获取当前元素
ADD AL, 30H ;转换为ASCII码
MOV DL, AL ;存储到DL寄存器中
INT 21H ;输出当前元素
MOV DL, ',' ;输出逗号
INT 21H ;输出逗号
INC SI ;下一个元素
LOOP PRINT_LOOP ;循环输出数组元素
MOV AH, 4CH ;退出程序的功能号
INT 21H ;调用21H中断
MAIN ENDP
END MAIN
```
程序的思路是使用双循环冒泡排序将数组进行排序,然后通过循环输出数组元素来输出排序后的数组。在程序中,使用CX寄存器保存循环次数,SI寄存器保存当前元素的地址,DI寄存器保存内循环的起始地址,BX寄存器用于保留CX寄存器的值。在每次外循环和内循环中,使用MOV指令将需要比较的元素加载到AL寄存器中,然后使用CMP指令进行比较,如果当前元素小于等于下一个元素,则跳过交换,否则使用XCHG指令交换当前元素和下一个元素。整个程序完成后,使用INT 21H中断调用DOS的系统服务输出排序后的数组。
阅读全文