汇编语言实验三 循环和子程序设计

										**实验三  循环和子程序设计**
  1. 编写一个子程序计算z=f(x,y)=x/y+x-y(x,y,z有符号数内存字数)。要求通过堆栈传送输入参数,输出参数通过AX传递。(要求输入输出实现,且有提示)。

stack   	segment stack
        	dw 20h dup (0)
stack  	ends
    
data		segment
mes1    	db 'Please input x,y: ',0dh,0ah,'$'
mes2    	db 'The result is: ',0dh,0ah,'$'
num   	db 10
        	db 0
        	db 10 dup(0)
x       	dw 4
y       	dw 2
z       	dw 0
data    	ends

code    	segment
        	assume cs:code,ds:data,ss:stack
start:  		mov ax, data
        	mov ds,ax

        	mov ah,09h
       	mov dx,offset mes1
        	int 21h

        call input
        mov ax,z
        mov x,ax

        call input 
        mov ax,z
        mov y,ax

        mov ax,x
        push ax
        mov ax,y
        push ax
        call f
        mov z,ax
        mov ah,09h
        mov dx,offset mes2
        int 21h
        mov ax,z
        call disDec
        
        mov ah,4ch
        int 21h

f       proc
        push bp
        mov bp,sp
        push bx
        push dx
        mov ax,[bp+6]
        cwd
        mov bx,[bp+4]
        idiv bx
        add ax,[bp+6]
        sub ax,[bp+4]
        pop dx
        pop bx
        pop bp
        ret 4
f       endp

disDec  proc          
        PUSH BX         
        PUSH CX  
        PUSH DX  
        MOV BX,10    
        XOR CX,CX    
        test ax,8000h  
        jz C0
        neg ax
        push ax
        mov ah,02h
        mov dl,'-'
        int 21h
        pop ax
C0:     XOR DX,DX        
        DIV BX        
        OR DX,0E30H   
        PUSH DX        
        INC CX          
        CMP AX,0      
        JNZ C0           
C1:     POP AX          
        INT 10H       
        LOOP C1         
        mov ah,2
        mov dl,10
        int 21h
        POP DX        
        POP CX  
        POP BX  
        RET
disDec  endp

input   proc
        push ax
        push bx
        push cx
        push dx
        push si
        mov ah,0ah
        mov dx,offset num
        int 21h
        
        mov ah,02h
        mov dl,10
        int 21h 
        
        mov al,num+1
        cbw
        mov cx,ax
        mov si,2
        mov ax,0
        mov dl,10
        xor bx,bx

        cmp num[si],'-'
        jnz again
        mov bl, 80h
        inc si
        dec cx

again:  imul dl
        add al,num[si]
        sub al,'0'
        inc si
        loop again
        cmp bl,80h
        jnz done
        neg ax
done:   mov z,ax
        
        pop si
        pop dx
        pop cx
        pop bx
        pop ax
        ret
input   endp

code    ends
end 		start

  1. 编写一个宏,求三个数的最大数,原型为:MAX3 x,y,z,max,最大值要求输出。
max3	macro	x,y,z,max
			mov ax,x
			cmp ax,y
			jnl next
			mov ax,y
next:	cmp ax,z
			jnl done
			mov ax,z
done:	mov max,ax
endm

stack 	segment stack
			db 1024	dup(?)
stack	ends
data		segment
x		dw 12
y		dw 25
z		dw 5
max 	dw ?,'$'
data		ends
code		segment
assume 	cs:code,ds:data
start:	mov ax,data
			mov ds,ax
			push sp
			mov bp,sp
			push ax
			push bx
			push dx
			max3 x,y,z,max

			mov ax,max
			mov bx,10
			push bx

again:	
cmp ax,0
			jz getnum
			sub dx,dx
			div bx
			add dx,0030h
			push dx
			jmp again
getnum:
		pop dx
			cmp dx,10
			jz exit
			mov ah,02h
			int 21h
			jmp getnum

exit:		pop dx
			pop bx
			pop ax
			mov ah,4ch
			int 21h
code		ends
end		start	

  1. 挂接1CH中断,正计时90秒后退出。要求屏幕显示0-89的秒数。
stack	segment stack
			db 1024 dup(?)
stack	ends 
intno	equ 1ch
data		segment
oldisr	dw ?,?
timer	db 100
counter	dw 90
isdone	db 0
data 	ends
code		segment
			assume cs:code,ds:data
start:	mov ax, data
			mov ds,ax
			mov ax,0
			mov es,ax
		
			cli
			mov ax,es:[intno*4]
			mov oldisr[0],ax
			mov ax,es:[intno*4+2]
			mov oldisr[2],ax
			sti
		
			cli
			mov word ptr es:[intno*4],offset isr
			mov word ptr es:[intno*4+2],seg isr
			sti
		
waithere:
			cmp isdone,1
			jnz	waithere
exit:	

			cli
			mov ax,oldisr[0]
			mov es:[intno*4],ax
			mov ax,oldisr[2]
			mov es:[intno*4+2],ax
			sti
		
			mov ax,4c00h
			int 21h
		
isr		proc far
			push dx
			push ax
			mov ax,data
			mov ds,ax
		
			sti
			inc timer
again:	cmp timer,1000/55
			jb done
			mov timer,0
		
			mov ah,2
			mov dl,13
			int 21h
		
			mov dx,counter
			mov ax,90
			sub ax,dx
		
			mov dl,10
			div dl
			mov dh,ah
			mov dl,al
		
			mov ah,2
			add dl,30h
			int 21h
		
			mov dl,dh
			add dl,30h
			int 21h
		
			dec counter
			jge done
			mov isdone,1
done:	pushf
			call dword ptr oldisr
			cli
			pop ax
			pop dx
			iret
			isr endp
code		ends
end		start

下载完整实验报告,请移步下载区:
https://download.csdn.net/download/qq_43284141/11289139

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值