本人珍藏汇编子程序

来源:互联网 发布:荣威rx3 知乎 编辑:程序博客网 时间:2024/04/20 08:46

汇编实验终于考完了,感觉终不负辛苦的付出,汇编子程序实际编程中感觉作用挺大的,收集了一下这个学期以来积累的子程序贴出来,留作纪念。

希望前辈不吝赐教。

 

二进制形式输出,显示结果固定为十六位

;设(bx)=7fffh,则输出格式为0111111111111111b,后面的大字字母b表示二进制形式,显示结果固定为十六位。

;入口参数bx,出口参数bx
dispbxb proc near     
        mov cx,16
 next1: rol bx,1
        jc next
        mov dl,30h
        jmp outp
    next:mov dl,31h
  outp:mov ah,2
        int 21h
        loop next1
        mov dl,'b' ;显示字母“b”
        mov ah,2
        int 21h
        ret
dispbxb endp
 
 
; 按十进制形式输出一个字(不固定位输出,如255只输出255,不会输出0025)
; 按十进制形式输出一个字
;入口参数bx,出口参数bx
;通过2号中断输出
dispbxd proc near
        mov si,10
        xor cx,cx
              mov ax,bx
  next:mov dx,0
        div si
        push dx
        inc cx
        cmp ax,0  ;商为0则完成转换
        jnz next
next2:pop dx
        add dl,30h
        mov ah,2
        int 21h
        loop next2
        ret
dispbxd  endp
 
; 按十六进制形式输出一个字,固定四位输出
;入口参数bx,出口参数bx
dispbxh  proc near
        mov  cl,4
        mov  ch,4
next:   rol  bx,cl   ;高低半个字节交换
        mov  al,bl
        and  al,0fh  ;让al只保留借低位的值(bx的高位)
        add  al,30h
        cmp  al,3ah
        jl   next2
        add  al,07h   ;是a~f,要多加7
next2:mov  dl,al
        mov  ah,02h
        int  21h
        dec  ch
        cmp  ch,0
        ja   next
        mov dl,'h' ;显示字母“h”
        mov ah,2
        int 21h
        ret
dispbxh  endp
 
Decibin proc near
;通过键盘输入一个数字字符串,可以多位,回车结束输入
;出口参数 BX表示输出的真值
Mov bx,0
Newchar:
Mov ah,1
Int 21h
Sub al,30h
Jl exit
Cmp al,9d
Jg exit
Cbw
Xchg ax,bx
Mov cx,10d
Mul cx
Xchg ax,bx
Add bx,ax
Jmp newchar
Exit:
Ret
Decibin endp
 
 
;模板
data   segment       ; 定义数据段
data   ends
code   segment       ; 定义代码段
   assume cs:code, ds:data
start:
   mov   ax, data
   mov   ds, ax
 
MOV   AX, 4C00H
INT   21H
code   ends
   end   start
 
;在数据段定义如下字符串传递参数 
    n dw ?                      ;存放元素个数
     DataArray dw 80 dup(?),'$'
;冒泡法排序
f proc near
     mov cx,n
     dec cx                        ;cx=n-1, 为外层循环,并作为当前比较的最大下标
ag1:  xor bx,bx                     ;bx作为内层循环的计数
     lea si,DataArray
ag3:  mov ax,[si]
     cmp ax,[si+2]
     jbe ag2
     xchg ax,[si+2]                ;[si]>[si+2]则交换
     mov [si],ax
ag2:  inc bx                        ;每比较一次bx增1
     cmp bx,cx                     ;比较bx是否等于cx
     je  ag4
     add si,2d                     ;bx比cx小则继续比较, si后移两个字节
     jmp ag3                       ;跳转到ag3, 比较下两个元素
ag4:  loop ag1                      ;跳转到ag1, 进行cx=cx-1层的循环
     mov cx,n                      ;共输出n个元素
     mov bx,10d
     lea si,DataArray
;输出结果
ag5:  mov ax,[si]
     add si,2d                     ;将si指向下一个元素
     xor di,di                     ;di为堆栈元素的计数,即一个数值十进制的位数
ag6:  xor dx,dx
     div bx
     add dx,'0'                    ;得到余数对应的ASCII码
     push dx                       ;压栈
     inc di
     cmp ax,0
     jnz ag6                       ;当商不为0时,继续求余数
     mov ah,02h
ag7:  pop dx                        ;出栈
     int 21h
     dec di                        ;di计数
     cmp di,0
     jnz ag7                       ;输出字符数小于di时循环继续
     mov dl,' '
     int 21h                       ;每个元素相隔一个空格
     loop ag5                      ;输出下一个元素
     ret
f endp
 
 ;判断是否为闰年子程序,是闰年则ax=1,否则ax=0
      ;ax 传入十进制年份
      leap proc                 
         mov dx,0
            mov bx,4
            mov cx,ax
            div bx
            cmp dx,0
            jnz end0
            mov dx,0
            mov ax,cx
            mov bx,100
            div bx
            cmp dx,0
            jnz end1
            mov ax,cx
            mov dx,0
            mov bx,400
            cmp dx,0
            jz end1
         end0: mov ax,0
              jmp next
         end1:mov ax,1
         next:
         ret
      leap endp