汇编实验终于考完了,感觉终不负辛苦的付出,汇编子程序实际编程中感觉作用挺大的,收集了一下这个学期以来积累的子程序贴出来,留作纪念。 希望前辈不吝赐教。
二进制形式输出,显示结果固定为十六位 ;设(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 |