汇编实现输入十个十六位数排序
时间: 2023-12-14 08:39:51 浏览: 93
首先需要明确一下,汇编语言的排序算法有很多种,比如冒泡排序、选择排序、插入排序、快速排序等等。这里我以冒泡排序为例进行讲解。
首先,我们需要声明一个数组来存储这十个十六位数,假设这个数组名为num,每个数占据2个字节,那么数组长度就是20个字节。在代码中可以这样声明:
```
num dw 10 dup(0) ;声明长度为10的数组num
```
然后,我们需要输入这十个十六位数。这里我以int 21h中断实现输入,每次输入一个数,输入完成后将其存储到数组中。具体实现可以参考下面的代码:
```
mov cx, 10 ;循环10次,输入10个数
mov si, offset num ;si指向数组num的首地址
input:
mov ah, 1 ;调用int 21h中断输入一个字符
int 21h
cmp al, 0dh ;判断是否输入回车键
je next ;如果是,跳转到next
mov ah, 0 ;将输入的字符转换成数字
sub al, '0'
mov bl, al
mov al, ah
sub al, '0'
mov bh, al
shl bh, 4 ;将高四位左移4位
or bl, bh ;将低四位与高四位合并成一个十六位数
mov [si], bx ;将数存储到数组中
add si, 2 ;指向数组中下一个位置
jmp input ;继续输入下一个数
next:
loop input ;循环10次,输入完成后跳转到排序
```
输入完成后,我们需要对这十个数进行排序。这里我以冒泡排序为例,具体实现可以参考下面的代码:
```
mov cx, 9 ;外层循环,循环9次
mov si, offset num ;si指向数组num的首地址
outer:
mov dx, cx ;内层循环,循环cx次
inner:
mov ax, [si] ;比较相邻两个数的大小
cmp ax, [si+2]
jle skip ;如果前一个数小于等于后一个数,跳过交换
xchg ax, [si+2] ;交换两个数的位置
mov [si], ax
skip:
add si, 2 ;指向数组中下一个位置
loop inner ;循环cx次
dec cx ;循环次数减1
cmp cx, 0 ;判断是否循环完成
jne outer ;如果没有,继续循环
```
最后,我们需要将排序后的结果输出。具体实现可以参考下面的代码:
```
mov cx, 10 ;循环10次,输出排序后的结果
mov si, offset num ;si指向数组num的首地址
output:
mov bx, [si] ;将数存储到bx寄存器中
mov ah, 2 ;调用int 21h中断输出一个字符
mov dl, bh ;输出高4位
cmp dl, 10 ;判断是否需要转换成字母
jl print_num ;如果不需要,直接输出
add dl, 7 ;将数字转换成字母
print_num:
add dl, '0' ;转换成ASCII码
int 21h
mov dl, bl ;输出低4位
cmp dl, 10 ;判断是否需要转换成字母
jl print_num ;如果不需要,直接输出
add dl, 7 ;将数字转换成字母
jmp print_num
next_output:
add si, 2 ;指向数组中下一个位置
loop output ;循环10次,输出完成后结束程序
```
完整代码如下:
```
.model small
.stack 100h
.data
num dw 10 dup(0)
.code
start:
mov ax, @data
mov ds, ax
;输入十个十六位数
mov cx, 10
mov si, offset num
input:
mov ah, 1
int 21h
cmp al, 0dh
je next
mov ah, 0
sub al, '0'
mov bl, al
mov al, ah
sub al, '0'
mov bh, al
shl bh, 4
or bl, bh
mov [si], bx
add si, 2
jmp input
next:
loop input
;冒泡排序
mov cx, 9
mov si, offset num
outer:
mov dx, cx
inner:
mov ax, [si]
cmp ax, [si+2]
jle skip
xchg ax, [si+2]
mov [si], ax
skip:
add si, 2
loop inner
dec cx
cmp cx, 0
jne outer
;输出排序后的结果
mov cx, 10
mov si, offset num
output:
mov bx, [si]
mov ah, 2
mov dl, bh
cmp dl, 10
jl print_num
add dl, 7
print_num:
add dl, '0'
int 21h
mov dl, bl
cmp dl, 10
jl print_num
add dl, 7
jmp print_num
next_output:
add si, 2
loop output
mov ah, 4ch
int 21h
end start
```
阅读全文