8086 有100个有符号双字节整数,存放在数据区,编程实现从小到大排序。并按顺序输出打印。
时间: 2024-02-21 14:58:13 浏览: 61
以下是一种基于冒泡排序的汇编程序实现,可以实现对100个有符号双字节整数的从小到大排序,并按顺序输出打印。
```
assume cs:code, ds:data
data segment
nums dw 100 dup(0) ; 存放100个有符号双字节整数
data ends
code segment
start:
mov ax, data
mov ds, ax
; 读入100个有符号双字节整数到nums数组中
mov si, offset nums
mov cx, 100
read_loop:
mov ah, 01h ; 读入一个字符
int 21h
mov bh, 0 ; bh用于标记符号位,0表示正数,1表示负数
cmp al, '-' ; 判断是否为负数
jne read_num
mov bh, 1 ; 设置符号位为负数
mov ah, 01h ; 再读入一位字符
int 21h
read_num:
sub al, '0' ; 将字符转换为数字
mov dl, al
mov al, bh ; 将符号位存入al的高位
shl al, 7 ; 将符号位左移7位,变成高位
or al, dl ; 将数字存入al的低位
mov [si], ax ; 存入nums数组中
add si, 2 ; si指向下一个双字节整数
loop read_loop
; 对nums数组进行冒泡排序
mov cx, 100
sort_loop:
mov si, offset nums
inc si ; si指向nums[1]
mov bx, cx ; bx用于记录当前还需要比较的元素个数
dec bx ; 最后一个元素不需要比较,所以bx初始值为cx-1
inner_loop:
mov ax, [si-2] ; ax = nums[i-1]
cmp ax, [si] ; 比较nums[i-1]和nums[i]
jle no_swap ; 如果nums[i-1] <= nums[i],不需要交换
xchg ax, [si] ; 否则交换nums[i-1]和nums[i]
mov [si-2], ax ; 将交换后的nums[i-1]存回数组
mov bx, cx ; 重置还需要比较的元素个数
dec bx ; 因为进行了一次交换,所以需要重新比较
no_swap:
add si, 2 ; si指向下一个元素
dec bx ; 还需要比较的元素个数减一
jnz inner_loop ; 如果还有元素需要比较,则继续内循环
dec cx ; 已经完成一轮排序,数组长度减一
jnz sort_loop ; 如果还需要进行排序,则继续外循环
; 按顺序输出排序后的结果
mov si, offset nums
mov cx, 100
output_loop:
mov ax, [si]
call print_num ; 调用打印整数的子程序
add si, 2 ; si指向下一个元素
loop output_loop
mov ah, 4ch ; 程序结束
int 21h
print_num proc near
push ax
push bx
push cx
push dx
push si
mov bx, 10 ; 进制数为10
mov cx, 0 ; cx用于记录数字位数
mov si, sp ; si指向存放数字的栈顶
cmp ax, 0 ; 如果ax为0,直接输出'0'
jne num_to_str
mov dl, '0'
mov ah, 02h
int 21h
jmp print_num_end
num_to_str:
cmp ax, 0 ; 如果ax小于0,输出负号并取相反数
jge positive_num
mov dl, '-'
mov ah, 02h
int 21h
neg ax
positive_num:
mov bx, 10 ; 进制数为10
num_to_str_loop:
xor dx, dx ; 清除dx
div bx ; ax = ax / bx, dx = ax % bx
push dx ; 将余数存入栈中
inc cx ; 增加数字位数
cmp ax, 0 ; 如果ax不为0,继续循环
jne num_to_str_loop
output_num:
pop dx ; 从栈中取出余数
add dl, '0' ; 余数转换为字符
mov ah, 02h ; 输出字符
int 21h
loop output_num
print_num_end:
pop si
pop dx
pop cx
pop bx
pop ax
ret
print_num endp
code ends
end start
```
注意,由于8086处理器只能处理16位整数,所以在读入双字节整数时,需要将符号位存入高位,数字存入低位,这样可以通过符号位判断正负,并进行排序。同时,在输出双字节整数时,需要将其转换为字符串,然后逐个输出字符。以上代码可能还需要根据实际情况进行调整。
阅读全文