**实验三 循环和子程序设计**
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
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
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