一. 实验目的
- 掌握子程序、宏和中断程序的设计方法;
- 熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二. 实验内容
- 编写一个子程序计算z=f(x,y)=x/y+x-y(x,y,z有符号数内存字数)。要求通过堆栈传送输入参数,输出参数通过AX传递。(要求输入输出实现,且有提示)。
- 编写一个宏,求三个数的最大数,原型为:MAX3 x,y,z,min,最大值要求输出。
- 挂接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