用汇编编写一个从键盘上输入并排序的程序

原创 2015年11月20日 20:42:14

用汇编编写一个从键盘上输入并排序的程序

data segment 
	shuzi_w db 0
      key DW 100 dup(0)   ;输入的数的存放位置
      buffer dw 0 ;输入数字的暂存位置 输入的数字大于10 需要缓冲
      n   db 1            ; 总共输入的数字个数     注意从1开始 loop循环原因
      n1  db 1
      pkey db 'the programmer has been done ..' ,0dh,0ah,24h
      string db 'please input data: ',0dh,0ah,24h      
      string1 db 0dh,0dh,0dh,0dh,'output: ',0dh,0ah,'$'
      kongge db 0dh, 0ah,24h 
      data ends                 
stack segment
      dw   128  dup(0)
stack ends
code segment
	assume cs:code,ds:data,ss:stack
start:
	xor ax,ax   
      push ax
      mov ax, data
      mov ds, ax
      mov es, ax
      lea dx , string
      mov ah, 09h
      int 21h              ;显示请输入数据   
      mov di , offset key
      mov ax , 0       
      mov buffer,ax
biaohao1:            ;程序输入处
      mov ah,08h       ;键盘输入但不显示
      int 21h              ; 输入保存在AL中    
      cmp al,0dh;  输入是回车,直接结束输入
      jz biaohao4 
      cmp al,'0'           ;当输入的数在0到9中间时 输入的是ASCII码
      jb  biaohao2         ;不跳转否则跳转
      cmp al,'9' 
      ja   biaohao2 
    ;若输入的数在0到9之间时
      mov  ah,2
      mov dl,al   ;显示此数
      int 21h
      sub al,30h
      mov ah,0   
      push ax ; 保存刚输入的数字
      mov bx,buffer
      mov ax,10
      mul bx    ;ax=10*buffer
      pop bx ;  将上面保存的ax 的值给bx
      add ax,bx  ;ax=10*buffer+bx(之前的ax) 输入的数字大于10
      mov buffer,ax ;将ax 的值给buf 
      mov [di],ax ;若输入11,循环第一次输入是1,第二次重输入12
      jmp biaohao1; 输入大于10 的数字的下一位
biaohao2:    ;输入数字不是0到9  
      cmp al,20h   ;输入是否是空格
      je biaohao3   ;是的话跳出循环
      jmp biaohao1  ; 不是的话继续输入下一位
biaohao3:     ;是空格表示输入下一个数字
      call konggexianshi  ;屏幕上显示空格
      add  di,2 ;修改di指针,输入下一个数字
      inc n     ;输入的数字个数加一    
      mov ax,0
      mov buffer,ax ;初始化
      jmp biaohao1;继续输入下一个数字
biaohao4:
      mov al,n
      cmp al,0
      jz qw   ;没有输入数字就直接回车,结束程序
      call konggexianshi
      call paixu      
      push dx
      push ax 
      lea dx,string1
      mov ah ,09h
      int 21h
      pop ax
      pop dx 
      mov cx,0
      mov cl, n
      mov bx,offset key
disp: mov dx,0; 初始化
      mov ax,[bx]
      call shujuxianshi
      call konggexianshi
      inc bx
      inc bx
      loop disp
qw: 
      call konggexianshi
      lea dx, pkey
      mov ah, 9
      int 21h        ; output string at ds:dx
      mov ah, 1
      int 21h
      mov ax, 4c00h ; exit to operating system.
      int 21h 
;功能:从小到大排序
;入口参数为key的数组,和数组长度n,返回值为堆栈的数
paixu proc near
      mov al,n   
      mov n1,al; 外循环、
loop1:
      mov cl,n
      mov ch,0;内循环
      dec cx
      mov bx,offset key
loop2:
      mov ax,[bx]
      cmp ax,[bx+2]
      jna loop3   ;ax不大于bx+2,不交换
      push ax
      mov ax,[bx+2]  
      mov [bx],ax
      pop ax
      mov [bx+2],ax
loop3:
      add bx,2
      loop loop2
      dec n1
      jz paixuend
      jmp loop1
paixuend:
      ret
paixu endp
;功能:空格显示,
;入口参数为kongge的字符串,无返回值
konggexianshi proc near 
      push ax
      push dx
      mov ah,09
      mov dx ,offset kongge  
      int 21h
      pop dx 
      pop ax
      ret
konggexianshi endp 
 
;功能:显示单个位数。
;入口参数为AL,显示AL的值,无返回值
xianshidangeshuzi proc near 
      push dx
      push ax   
      mov dx,0
      mov dl,al
      xor ax,ax
      mov ah,02h
      int 21h 
      pop ax
      pop dx
      ret
xianshidangeshuzi endp

;功能:数据显示,可以显示5位数的十进制数。
;入口参数为AX,无返回值
shujuxianshi proc near
      push cx
      push ds
      mov cx,10000
      div cx 
      push dx ;保存余数  
      mov shuzi_w,al   ;万位数
      cmp shuzi_w,0
      je  j1 
      add al,30h  
      call xianshidangeshuzi    
j1:
      pop ax;取余数
      mov dx,0
      mov cx,1000
      div cx
      push dx;保存余数 
      mov shuzi_w,al ;千位数
      cmp shuzi_w,0
      je j2
      add al,30h
      call xianshidangeshuzi 
j2:
      pop ax;取余数
      mov dx,0
      mov cx,100
      div cx
      push dx;保存余数 
      mov shuzi_w,al  ;百位数
      cmp shuzi_w,0  
      je j3
      add al,30h
      call xianshidangeshuzi  
j3: 
      pop ax;取余数
      mov dx,0
      mov cx,10
      div cx
      push dx;保存余数 
      mov shuzi_w,al ;十位数
      cmp shuzi_w,0 
      je j4
      add al,30h
      call xianshidangeshuzi  
j4:
      pop dx
      add dl,30h  
      mov al,dl 
      call xianshidangeshuzi  
      xor ax,ax           ;初始化
      mov shuzi_w,al	;个位数
      pop ds
      pop cx   
      ret 
shujuxianshi endp
ends
end start



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

这是华为2013的一个机试题,会好半天才想出来,用了三个for循环,可能有点繁琐,但只要慢慢看还是好理解的, 题目:       通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过...

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。       压缩规则:       1. 仅...

华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串

/* 题目描述: 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说...

华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串

/*这道题目暴露出很多问题 编程时头脑一定要清醒 否则会出现低级失误 比如字符串之间直接复制 和直接比较的问题*/ /*****************************************...

汇编-从键盘输入数据并显示的程序

从键盘输入数据并显示的程序
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)