第一次实验
1. 写出完成下列功能的指令序列
(1)传送20H到AL寄存器 MOV AL , 20H
(2)将(AL)*2 MOV AL , 02H MUL AL
(3)传送25H到BL寄存器 MOV BL , 25H
(4)(AL)*BL MUL BL
问最后结果(AX)=?
AX=0940H
2. 分别写出完成下列指令要求的指令
(1)将BX的低4位清零 AND BX , F0H
(2)将AX的高4位置1 OR AX , F0H
(3)将DX的低4位取反; XOR DX , 0FH
(4)将CX的中间八位清零 AND CX , 0FF0H
(5)将AX中与BX中的对应位不相同的位均置1 XOR
AX , BX
3.上机运行下面指令序列,分析运行后(AX)=?
mov ax ,4312
mov cl , 8
sar ax ,cl
dec ax
mov cx ,8
mul cx
ax=210.9h
4. 4.设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300-304H连续单元装入0AH 0BH 0CH 0DH 0EH。在DEBUG状态下送入下面的程序,并用单步执行的方法,分析每条指令原源地址的形成过程?当数据传送完毕时,AX中的内容是什么?
8.编程:求两个数的平均值。这两个数分别放在X单元和Y单元中,而平均值放在Z单元中。即Z=(X+Y)/2
data segment
x db 2
y db 6
z db ?
data ends
code segment
assume cs:code, ds;data
start:
mov ax, data
mov ds,ax
mov al, x
mov ah,0
add al,y
adc ah,0
mov bl,2
div bl
mov z,al
mov ah,4ch
int 21h
code ends
end start
9.输入下面源程序,并对程序进行会变,连接,调式并说明程序的功能。
data segment
number dw 0168h
data ends
code segment
assume cs;code, ds: data
org 0100h
start:
mov ax, data
mov ds, ax
mov dx,0
mov bx, 0001h
mov di, 8000h
mov si, 0
mov ax, number
mov cx, 16
next;
test ax, bx
jz continue
or dx, di
inc si
continue:
rol bx, 1
ror di, 1
loop next
mov ah,4ch
int 21h
code ends
end start
1. 编写程序: 求1+2+3+…..+100的和 data segment
number db 01h
data ends
code segment
assume cs:code , ds:data
start:
mov ax , data
mov ds , ax
mov ax , data
mov bx , number
mov ax , 0
mov cx , 64h
next:
add ax ,bx
inc bx
loop next
mov ah , 4ch
int 21h
code ends
end start
2.在内存中tab为首的地方存有1-9的平方值,从键盘输入一个数(1-9),将该数存入X单元,立方值存入XXX单元中
data segment
tab db 0,1,4,9,16,25,36,49,64,81
x db 10dup(?)
xxx db 10dup(?)
data ends
code segment
assume cs:code ,ds: data
start:
mov ax ,data
mov ds , ax mov ax , data
mov cx ,09h
next:
mov ah , 1
int 21h
and ah ,0fh
mov bx ,ah
mov si , offset tab
mov sp , offset x
mov di , offset xxx
mov dx , byte ptr[bx+si]
mov al, bl
mul dx
mov [bx+di] ,ax
mov [sp+bx] , bx
loop next
mov ah , 4ch
int 21h
code ends
end start
第二次实验
顺序程序设计
从键盘输入两个1位十进制数,求这两个数的和,并将结果显示在屏幕上 data segment
infor1 db 'please input the first data (<10):$'
infor2 db 0ah,0dh,'please input the second data (<10):$'
infor3 db 0ah,0dh,'the result is:$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset infor1
mov ah,9
int 21h
mov ah,1
int 21h
and al,0fh
mov ah,00000000000000000000
mov bl,al
mov dx,offset infor2
mov ah,9 int 21h
mov ah,1 int 21h
and ax,000fh add al,bl aaa
or ax,3030h push ax
mov dx,offset infor3 mov ah,9 int 21h
pop ax
mov dl,ah push ax
mov ah,2 int 21h
pop ax
mov dl,al mov ah,2 int 21h
mov ah,4ch int 21h
code ends
end start
1.从键盘输入0-9中任意一个自然数,将其立方值在屏幕上显示出来 data segment
number db 'please input one data (<10):$'
result db 0ah,0dh,'cube result is :$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset number
mov ah,9
int 21h
mov ah,1
int 21h
and ax,000fh
mov bx,ax
mul bl
mul bl
mov cl,64h
div cl
or al,30h
push ax
mov dx,offset result
mov ah,9
int 21h
pop ax
mov dl,al
push ax
mov ah,2
int 21h
pop ax
mov cl,0ah
mov al,ah
mov ah,0
div cl
or ax,3030h
mov dl,al
push ax
mov ah,2
int 21h
pop ax
mov dl,ah
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start
分支程序设计
1.某程序可从键盘接收命令(0-5),分别专项6个子程序,子程序入口地址分别为p0-p5,编制程序,用跳转表实现分支结构程序设计,记录实验结果
data segment
message db 'please input key (0-5):$'
crmessage db 0ah,0dh,'$'
errormessage db 'you hit error key !',0ah,0dh
db 'please try again(0-5):$'
message0 db 'you hit the key 0',0ah,0dh,'$'
message1 db 'you hit the key 1',0ah,0dh,'$'
message2 db 'you hit the key 2',0ah,0dh,'$'
message3 db 'you hit the key 3',0ah,0dh,'$'
message4 db 'you hit the key 4',0ah,0dh,'$'
message5 db 'you hit the key 5',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,9
lea dx,message
int 21h
tryagain:
mov ah,1
int 21h
mov bl,al
mov ah,9
mov dx,offset crmessage int 21h
cmp bl,'0'
jz key0
cmp bl,'1'
jz key1
cmp bl,'2'
jz key2
cmp bl,'3'
jz key3
cmp bl,'4'
jz key4
cmp bl,'5'
jz key5
error:
mov ah,9
mov dx,offset errormessage int 21h
jmp tryagain
key0:
lea dx,message0 mov ah,9
int 21h
jmp exit
key1:
lea dx,message1 mov ah,9
int 21h
jmp exit
key2:
lea dx,message2 mov ah,9
int 21h
jmp exit
key3:
lea dx,message3
mov ah,9 int 21h jmp exit key4:
lea dx,message4 mov ah,9 int 21h jmp exit key5:
lea dx,message5 mov ah,9 int 21h
exit:
mov ah,4ch int 21h code ends
end start
第三次实验
循环程序设计
1. 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入N单元,把累加和送入SUM单元。
data segment
n dw ?
sum dw ?
x db 'n is :$'
y db 0Ah,0Dh,'sum is :$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,9
mov dx,offset x
int 21h
mov ax,0
mov bx,0
mov cx,0
mov dx,0
again:
add bx,1
add ax,bx
add cx,1
cmp ax,3e8h
jbe again
mov n,cx
mov sum,ax
mov si,ax
mov ax,cx
mov bl,10
div bl
mov bh,ah
mov dl,al
call zg
mov dl,bh
call zg
mov ah,9
mov dx,offset y
int 21h
mov ax,si
mov dx,0
mov bx,1000 div bx mov bx,dx mov dl,al call zg mov ax,bx mov bl,100 div bl mov bh,ah mov dl,al call m mov al,bh mov ah,0 mov bl,10 div bl mov bh,ah mov dl,al call zg mov dl,bh call zg
mov ah,4ch int 21h zg proc or dl,30h mov ah,2 int 21h ret m endp code ends end start
子程序设计
2.编制计算n个(n<=50续偶数之和(2+4+6...)的程序。 data segment
buf db 10
db ?
db 10 dup(?)
data ends
code segment
main proc far
assume cs:code ,ds:data
start:
mov ax,data
mov ds,ax
mov ah,0ah
mov dx,offset buf
int 21h
mov cl,buf+1
mov ch,0
mov si,offset buf+2
mov ax,0
again:
mov bl,10
mul bl
sub byte ptr [si],30h
add al,[si]
adc ah,0
inc si
loop again
call qh call xs
mov ah,4ch int 21h ret
main endp
qh proc near mov cx,ax mov ax,0 mov dx,0 again1: add dx,2 add ax,dx loop again1 ret qh endp
xs proc near mov dx,0 mov bx,1000 div bx mov bx,dx mov dl,al call p
mov ax,bx mov bl,100 div bl mov bh,ah mov dl,al call p mov al,bh mov ah,0 mov bl,10 div bl mov bh,ah mov dl,al call p mov dl,bh call p ret
xs endp
p proc near
or dl,30h
mov ah,2
int 21h
ret
p endp
code ends
end start
第四次实验
PC机内部8259中断实验
编写中断处理程序,要求主程序运行时,设10秒响一次。同时屏幕上显示信息“the bell is ring!”
data segment
count dw 1
mess db 'the bell is ring!',0dh,0ah,'$'
data ends
stack segment
db 100 dup (?)
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start:
mov ax,stack mov ss,ax push ds sub ax,ax push ax mov ax,data mov ds,ax mov al,1ch mov ah,35h int 21h push es push bx push ds
mov dx,offset ring mov ax,seg ring mov ds,ax mov al,1ch mov ah,25h int 21h pop ds
mov al,10110110b out 43h,al mov ax,533h out 42h, al mov al,ah out 42h,al
in al,21h and al,0feh out 21h,al sti
d:
mov ah,0 int 16h cmp al,1bh jnz d
pop dx pop ds mov al,1ch mov ah,25h int 21h
ret
main endp
ring proc near push ds push ax push cx push dx mov ax,data mov ds,ax sti
dec count jnz exit
mov dx,offset mess mov ah,09 int 21h
mov dx,2000h in al,61h and al,0fch
sound:
xor al,03h out 61h,al mov cx,9600h
wait1:
loop wait1 dec dx
jnz sound mov count,91
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret
ring endp code ends end start
第五次实验
外部8259中断实验
编写一实验程序,使用实验装置提供的中断源,完成按键中断响应。每产生一次按键中断,向显示器输出一个字符“The is a 8259 inturrupt!”。
data segment
message db 'The is a 8259 inturrupt!',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
cli
mov al,0dh
mov ah,35h
int 21h
push es
push bx
push ds
mov ax,seg int_proc
mov ds,ax
mov dx,offset int_proc mov al,0dh mov ah,25h int 21h
pop ds
in al,0a1h
and al,0fbh out 0a1h,al sti
mov al,00110111b mov dx,3003h out dx,al
mov ax,5000 mov dx,3000h out dx,al
mov al,ah
out dx,al
waitt:
mov ah,01h int 16h
jz wait
mov ah,0
int 16h
cmp al,1bh jnz waitt
in al,0a1h
or al,4h
out 0a1h,al
pop dx
pop ds
mov al,0dh mov ah,25h int 21h
mov ah,4ch int 21h
int_proc proc
push ax
push ds
mov ax,data
mov ds,ax
sti
mov dx,offset message
mov ah,9
int 21h
cli
mov al,20h
mov dx,0a0h
out dx,al
mov al,20h
out 20h,al
pop ax
pop ds
iret
int_proc endp
code ends
end start
第六次实验
8255A并行接口实验
1.使8255的端口A口为输出,B口为输入,完成拨动开关到数据灯的数据创送。 code segment
assume cs:code
start:
mov dx,3003h
mov al,10000010b
out dx,al
mov dx,3001h
in al,dx
mov dx,3000h
out dx,al
mov ah,4ch
int 21h
code ends
end start
2.1使8255的B口为输出,实现8位数据灯左移循环显示,单行。
code segment
assume cs:code
start:
mov dx,3003h
mov al,10000000b
out dx,al
mov dx,3001h
mov al,01111111b
l:
out dx,al
mov cx,3000h
a:
mov bx,2000h
b:
dec bx
jnz b
loop a
ror al,1
jmp l
mov ah,4ch
int 21h
code ends
end start
2.2使8255的B口为输出,实现8位数据灯左移循环显示,两行。 code segment
assume cs:code
start:
mov dx,3003h
mov al,10000000b
out dx,al
l:
mov dx,3000h
call xu
mov cx,3000h
a:
mov bx,2000h
b:
dec bx
jnz b
loop a
mov dx,3001h
call xu
jmp l
mov ah,4ch
int 21h
xu proc near
mov cx,8
mov al,01111111b
out dx,al
ll:
push cx
mov cx,3000h
c:
mov bx,2000h
d:
dec bx
jnz d
loop c
pop cx
ror al,1
out dx,al
loop ll
mov al,11111111b
out dx,al
ret
xu endp
code ends
end start
3.使8255的A口节4个开关,K3~K0,B口接一个七段LED显示器,用来显示4个开关所拔通的16进制数0~F,开关都合上时,显示0,都断开时显示F。 data segment
f db 3fh,6h,5bh,4fh,66h,6dh,7dh,7h,7fh,67h,77h,0ffh,39h,0bfh,79h,71h
data ends
code segment
assume ds:data,cs:code
start:
mov dx,3003h
mov al,10010000b
out dx,al
mov dx,3000h in al,dx
mov bx,ax
mov al,byte ptr f[bx] mov dx,3001h out dx,al
mov ah,4ch int 21h
code ends end start