汇编实现多个数的输入

;2.  用户输入不少于5个,
;不多于30个的十进制整数
;(含负数,绝对值小于100),
;排序后将结果输出。
assume cs:code,ds:data,ss:stack

data segment
    tip db 'please input your number',13,10,'$'
    fushu db 15 dup (0)
    zhengshu db 15 dup (0)
data ends

stack segment
    db 10000 dup (0)
stack ends

code segment

fushu_input:    push cx
                lea bx,fushu
                mov cx,10
        s2:     mov ah,1;存储新输入的数
                int 21h
                mov ah,0                
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over1

                mov al,10
                mul byte ptr ds:[bx+si]
                mov ds:[bx+si],al
                pop ax
                add ds:[bx],al;给上一次输入的十进制数乘10,并加上新输入的数

                loop s2

        over1:  inc si
                pop cx
                ret

zhengshu_input: push cx               
                mov ds:[bx+di],al;把第一位数先存进去
                lea bx,zhengshu
                mov cx,10
        s3:     mov ah,1;此时为整数的第二位数的存储
                int 21h
                mov ah,0
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over2

                mov al,10
                mul byte ptr ds:[bx+di]
                mov ds:[bx+di],al
                pop ax
                add ds:[bx+di],al;乘10移位,并加上新输入的数

                loop s3

        over2:  inc di                
                pop cx
                ret


        start:      
                mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,10000
                mov si,0;负数的偏移量用si
                mov di,0;正数的偏移量用di
                ;缺省

                lea dx,tip
                mov ah,9
                int 21h;输出提示符

                ;单个数的输入,一个一个字符读取
                mov cx,30
        s1:     mov ah,1
                int 21h
                cmp al,'-';若为负数则跳转
                jz fushu_input
                cmp al,'-'
                jnz zhengshu_input;反之则为正数跳转
                cmp al,13
                jz output
                loop s1

                mov ax,4c00h
                int 21h
code ends
end start

汇编无法实现整个数的输入,只能一个位一个位的输入,即123拆开成1,2,3来一个个读入

基本原理:将负数,整数分开存储到数据段,且都一位一位的存储

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值