实验三 循环和子程序设计

一. 实验目的

  1. 掌握子程序、宏和中断程序的设计方法;
  2. 熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

二. 实验内容

  1. 编写一个子程序计算z=f(x,y)=x/y+x-y(x,y,z有符号数内存字数)。要求通过堆栈传送输入参数,输出参数通过AX传递。(要求输入输出实现,且有提示)。
  2. 编写一个宏,求三个数的最大数,原型为:MAX3 x,y,z,min,最大值要求输出。
  3. 挂接1CH中断,正计时90秒后退出。要求屏幕显示0-89的秒数

代码1:

stack	segment stack
		dw 512 dup(?)
stack	ends
data	segment
		input_x db 'Enter the x: ',13,10,'$'
		input_y db 'Enter the y: ',13,10,'$'
		res db 'The res is: ',13,10,'$'
		cha db 13,10,'$'
		x db 5,0,5 dup(0)
		y db 5,0,5 dup(0)
		x_i dw ?
		y_i dw ?
		z dw ?
		ko dw ?
		ok dw ?
data	ends
code	segment
		assume cs:code,ds:data,ss:stack
start:	mov dx,data
		mov ds,dx
		mov ax,stack
		mov ss,ax
		lea dx,input_x
		mov ah,9
		int 21h
		mov ah,0ah
		mov dx,seg x
		mov ds,dx
		mov dx,offset x
		int 21h
		lea dx,cha
		mov ah,9
		int 21h
		call stoi
		;mov ax,[x_i]
		;call dis
		lea dx,input_y
		mov ah,9
		int 21h
		mov ah,0ah
		mov dx,seg y
		mov ds,dx
		mov dx,offset y
		int 21h
		lea dx,cha
		mov ah,9
		int 21h
		call stoi_y
		;mov ax,[y_i]
		;call dis
		mov ax,[x_i]
		push ax
		mov ax,[y_i]
		push ax
		call object
		mov [z],ax
		call dis
		mov ah,4ch
		int 21h
object	proc
		push bp
		mov bp,sp
		cmp [ok],1
		jnz nexte
		mov dx,0ffffh
nexte:	mov ax,[bp+6]
		mov bx,[bp+4]
		idiv bx
		mov dx,ax
		mov ax,[bp+6]
		mov bx,[bp+4]
		sub ax,bx
		add ax,dx
		pop bp
		ret
		object endp
stoi	proc
		mov dx,0
		mov bx,10
		mov si,2
		mov [ko],2
		mov [x_i],0
		mov ax,0
		cmp x[si],2dh
		jnz lloop
		inc si
		mov [ko],3
		mov [ok],1
lloop:	mov al,x[si]
		cmp al,13
		jz over
		sub al,30h
		cmp [x_i],0
		jz first
		push ax
		mov ax,[x_i]
		imul bx
		mov [x_i],ax
		pop ax
first:	add [x_i],ax
		mov ax,0
		inc si
		jmp lloop
over:	cmp [ko],3
		jnz overs
		not [x_i]
		add [x_i],1
overs:	ret
		stoi endp
stoi_y	proc
		mov dx,0
		mov bx,10
		mov si,2
		mov [ko],2
		mov [y_i],0
		mov ax,0
		cmp y[si],2dh
		jnz lloop1
		inc si
		mov [ko],3
lloop1:	mov al,y[si]
		cmp al,13
		jz over1
		sub al,30h
		cmp [y_i],0
		jz first1
		push ax
		mov ax,[y_i]
		imul bx
		mov [y_i],ax
		pop ax
first1:	add [y_i],ax
		mov ax,0
		inc si
		jmp lloop1
over1:	cmp [ko],3
		jnz over1s
		not [y_i]
		add [y_i],1
over1s:	ret
		stoi_y endp
dis		proc
		push dx
		mov cl,4
		mov dl,ah
		call dispa
		mov dl,ah
		call dispap
		mov dl,al
		call dispa
		mov dl,al
		call dispap
		pop dx
		push ax
		mov dl,10
		mov ah,2
		int 21h
		mov dl,13
		mov ah,2
		int 21h
		pop ax
		ret
dis		endp
dispa	proc
		push ax
		shr dl,cl
		or dl,30h
		cmp dl,39h
		jbe lab
		add dl,7
lab:	mov ah,2
		int 21h
		pop ax
		ret
dispa	endp

dispap	proc
		push ax
		and dl,0fh
		or dl,30h
		cmp dl,39h
		jbe laba
		add dl,7
laba:	mov ah,2
		int 21h
		pop ax
		ret
dispap	endp
code	ends
		end start

代码2:

stack	segment stack
		dw 512 dup(?)
stack	ends
data	segment
		entr db 'Input the integer'
		cha db 13,10,'$'
		input db 5,0,5 dup(0)
		x dw ?
		y dw ?
		z dw ?
		w dw ?
		ko dw ?
		ok dw ?
		maxx dw ?
data	ends
MAX		macro x,y,z,maxx
		local next1,next,next2
		mov ax,y
		mov bx,x
		cmp ax,bx
		jge next1
		mov maxx,bx
		jmp next
next1:	
		mov maxx,ax
next:	
		mov ax,z
		cmp maxx,ax
		jge next2
		mov maxx,ax
next2:	
		endm
code	segment
		assume cs:code,ds:data,ss:stack
start:	mov dx,data
		mov ds,dx
		lea dx,entr
		mov ah,9
		int 21h
		lea dx,input
		mov ah,0ah
		int 21h
		lea dx,cha
		mov ah,9
		int 21h
		call stoi
		mov ax,w
		; call dis
		mov x,ax
		lea dx,entr
		mov ah,9
		int 21h
		lea dx,input
		mov ah,0ah
		int 21h
		lea dx,cha
		mov ah,9
		int 21h
		call stoi
		mov ax,w
		; call dis
		mov y,ax
		lea dx,entr
		mov ah,9
		int 21h
		lea dx,input
		mov ah,0ah
		int 21h
		lea dx,cha
		mov ah,9
		int 21h
		call stoi
		mov ax,w
		; call dis
		mov z,ax
		MAX x,y,z,maxx
		mov ax,maxx
		call dis
		mov ah,4ch
		int 21h
stoi	proc
		mov dx,0
		mov bx,10
		mov si,2
		mov [ko],2
		mov [w],0
		mov ax,0
		cmp input[si],2dh
		jnz lloop
		inc si
		mov [ko],3
lloop:	mov al,input[si]
		cmp al,13
		jz over
		sub al,30h
		cmp [w],0
		jz first
		push ax
		mov ax,[w]
		imul bx
		mov [w],ax
		pop ax
first:	add [w],ax
		mov ax,0
		inc si
		jmp lloop
over:	cmp [ko],3
		jnz overs
		not [w]
		add [w],1
overs:	ret
		stoi endp
dis		proc
		push dx
		mov cl,4
		mov dl,ah
		call dispa
		mov dl,ah
		call dispap
		mov dl,al
		call dispa
		mov dl,al
		call dispap
		pop dx
		push ax
		mov dl,10
		mov ah,2
		int 21h
		mov dl,13
		mov ah,2
		int 21h
		pop ax
		ret
dis		endp
dispa	proc
		push ax
		shr dl,cl
		or dl,30h
		cmp dl,39h
		jbe lab
		add dl,7
lab:	mov ah,2
		int 21h
		pop ax
		ret
dispa	endp

dispap	proc
		push ax
		and dl,0fh
		or dl,30h
		cmp dl,39h
		jbe laba
		add dl,7
laba:	mov ah,2
		int 21h
		pop ax
		ret
dispap	endp
code	ends
		end start

代码3:

stack	segment stack
		dw 512 dup(?)
stack	ends
		intno equ 1ch
		useint = 1
data	segment
		oldisr dw ?,?
		timer db 100
		counter dw 0
		isdone db 0
data	ends
code	segment
		assume cs:code,ds:data,ss:stack
start:	mov dx,data
		mov ds,dx
		mov ax,0
		mov es,ax
		if useint
		mov al,intno
		mov ah,35h
		int 21h
		mov oldisr[0],bx
		mov ax,es
		mov oldisr[2],ax
		else
		cli
		mov ax,es:[intno*4]
		mov oldisr[0],ax
		mov ax:es:[intno*4+2]
		mov oldisr[2],ax
		endif
		if useint
		push ds
		mov dx,seg isr
		mov ds,dx
		mov dx,offset isr
		mov al,intno
		mov ah,25h
		int 21h
		pop ds
		else
		cli
		mov word ptr es:[intno*4],offset isr
		mov word ptr es:[intno*4+2],seg isr
		sti
		endif
waits:
		cmp isdone,1
		jnz waits
exit:	if useint
		push ds
		mov dx,oldisr[0]
		mov ax,oldisr[2]
		mov ds,ax
		mov al,intno
		mov ah,25h
		int 21h
		pop ds
		else
		cli
		mov ax,oldisr[0]
		mov es:[intno*4],ax
		mov ax,oldisr[2]
		mov es:[intno*4+2],ax
		sti
		endif
		mov ah,4ch
		int 21h
isr		proc far
		push dx
		push ax
		mov dx,data
		mov ds,dx
		sti
		inc timer
agaon:	cmp timer,1000/55
		jb done
		mov timer,0
		mov ah,2
		mov dl,13
		int 21h
		mov ax,counter
		mov dl,10
		div dl
		mov dx,ax
		mov ah,2
		add dl,30h
		int 21h
		mov dl,dh
		add dl,30h
		int 21h
		inc counter
		cmp counter,90
		jl done
		mov isdone,1
done:	pushf
		call dword ptr oldisr
		cli
		pop ax
		pop dx
		iret
		isr endp
code	ends
		end start
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值