汇编实现多个数字的输入与输出

DATAS SEGMENT
    ;此处输入数据段代码
    NUM dw 10 DUP(0)
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
   MOV AX,DATAS
    MOV DS,AX
    mov cl,10
    mov bx,0
    mov si,0
    
L1: mov bx,0
	call input
    mov NUM[si],bx
    add si,2
    cmp si,20
    jb L1
    mov si,0
    
L2: mov ax,NUM[si]
    call output
    mov dl,','
    mov ah,2
    int 21h
    add si,2
    cmp si,20
    jb L2
    
    
    MOV AH,4CH
    INT 21H
    
input proc;输入函数
L0: mov ah,1
    int 21h
    cmp al,'0'
    jb over
    cmp al,'9'
    ja over
    sub al,48
    mov dl,al;暂存输入的数
    mov ax,bx;将bx存到ax中,做乘法
    mul cl
    mov dh,0
    add ax,dx;将dl里的数加到ax中
    mov bx,ax
    jmp L0
over:
ret
input endp

output proc;输出函数
    mov bl,0
    mov ax,NUM[si]
L3: div cl
    push ax;入栈
    add bl,1;计数器加一
    mov ah,0
    cmp ax,0;当被除数为0时结束循环
    jne L3
L4: pop dx;出栈
    sub bl,1;计数器减一
    mov dl,dh
    add dl,48
    mov ah,2
    int 21h
    cmp bl,0;当计数器清零时结束循环
    jne L4
ret
output endp 
    CODES ENDS
END START









  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要明确一下,汇编语言的排序算法有很多种,比如冒泡排序、选择排序、插入排序、快速排序等等。这里我以冒泡排序为例进行讲解。 首先,我们需要声明一个数组来存储这十个十六位数,假设这个数组名为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 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值