微机原理实验
本文档包含了微机原理汇编实验考试参考试题,仅供参考
e1.txt
;1:编程将(AX)=2387、(BX)=192FH、(CX)=9256中的无符号数按由大到
;小的顺序排序,上机编程调试出程序,并将排序结果记录在下面。
code segment
assume cs:code
start: mov ax,2387
mov bx,192fh
mov cx,9256
cmp ax,bx
jae next1
mov dx,ax
mov ax,bx
mov bx,dx
next1: cmp bx,cx
ja next2
mov dx,bx
mov bx,cx
mov cx,dx
next2: cmp ax,bx
jae next3
mov dx,ax
mov ax,bx
mov bx,dx
next3:
mov ah,4ch
int 21h
code ends
end start
*********************************
e2.txt
; 2:编程将(BX)=8600H、(CX)=3489H、(DX)=9235按有符号数由大到小
;排序,上机编程调试出程序,并将排序结果记录在下面。
code segment
assume cs:code
start: mov bx,8600h
mov cx,3489h
mov dx,9235
cmp bx,cx
jge next1
mov ax,bx
mov bx,cx
mov cx,ax
next1: cmp cx,dx
jge next2
mov ax,cx
mov cx,dx
mov dx,ax
next2: cmp bx,cx
jge next3
mov ax,bx
mov bx,cx
mov cx,ax
next3: mov ah,4ch
int 21h
code ends
end start
*********************************
e3.txt
; 3:在数据段中定义如下数据:32,34,89H,,编程将以上数据按有符号数
;进行排序,并将结果记录下来。
data segment
num db 32,34,89h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,num
mov al,[si]
cmp al,[si+1]
jge next1
mov bl,[si+1]
mov [si],bl
mov [si+1],al
next1: mov al,[si+1]
cmp al,[si+2]
jge next2
mov bl,[si+2]
mov [si+1],bl
mov [si+2],al
next2: mov al,[si]
cmp al,[si+1]
jge next3
mov bl,[si+1]
mov [si],bl
mov [si+1],al
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e4.txt
;4:在数据段中定义如下数据:99,25,86,编程将以上数据按无符号数进行排序,
;上机调试出程序,并将结果记录下来。
data segment
nums db 99,25,86
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea si,nums
mov al,[si]
cmp al,[si+1]
jae next1
mov ah,[si+1]
mov [si+1],al
mov [si],ah
next1: mov al,[si+1]
cmp al,[si+2]
jae next2
mov ah,[si+2]
mov [si+2],al
mov [si+1],ah
next2: mov al,[si]
cmp al,[si+1]
jae next3
mov ah,[si+1]
mov [si+1],al
mov [si],ah
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e5.txt
; 5:(AL)=86H,(AH)=34H,(BL)=78H,编程将以上数据按有符号数进行排序,
;上机调试出程序,并将结果记录下来。
code segment
assume cs:code
start: mov al,86h
mov ah,34h
mov bl,78h
cmp al,ah
jge next1
mov ch,al
mov al,ah
mov ah,ch
next1: cmp ah,bl
jge next2
mov ch,bl
mov bl,ah
mov ah,ch
next2: cmp al,ah
jge next3
mov ch,al
mov al,ah
mov ah,ch
next3: int 3
mov ah,4ch
int 21h
code ends
end start
*********************************
e6.txt
; 6:中断向量为:1234H:5678H,编程将此数据设置成为类型号0对应的中断向
;量,上机调试出程序,并将结果记录下来。(直接用MOV 指令写入即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
cli
mov [si],5678h
mov [si+2],1234h
sti
int 0
mov ah,4ch
int 21h
code ends
end start
*********************************
e7.txt
; 7:中断向量为:3456H:6678H,编程将此数据设置成为类型号60h对应的中断’
;向量,上机调试出程序,并将结果记录下来。(直接用MOV 指令写入即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,60h
mov bx,4
mul bx
mov si,ax
cli
mov [si],6678h
mov [si+2],3456h
sti
int 60h
mov ah,4ch
int 21h
code ends
end start
*********************************
e8.txt
; 8:中断向量为:编程将中断向量类型号为60H所对应的中断向量从中断向量表
;中取出来分别放在ES和DI中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,60h
mov bx,4
mul bx
mov si,ax
mov es,[si]
mov di,[si+2]
mov ah,4ch
int 21h
code ends
end start
*********************************
e9.txt
; 9:中断向量为:编程将中断向量类型号21H所对应的中断向量从中断向量表中
;取出来分别放在SI和BP中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,21h
mov bx,4
mul bx
mov di,ax
mov si,[di]
mov bp,[di+2]
mov ah,4ch
int 21h
code ends
end start
*********************************
e10.txt
; 10:中断向量为:编程将中断向量类型号45H所对应的中断向量从中断向量表
;中取出来分别放在DI和BP中,上机调试出程序,并将程序和结果记录下来。
;(直接用MOV 指令即可)
code segment
assume cs:code
start: mov ax,0
mov ds,ax
mov ax,45h
mov bx,4
mul bx
mov si,ax
mov di,[si]
mov bp,[si+2]
int 45h
mov ah,4ch
int 21h
code ends
end start
*********************************
11:利用实验箱中的8255并口芯片实现1个发光二极管的闪烁。
code segment
assume cs:code
start: mov dx,283h
mov al,80h
out dx,al
lop: mov al,00h
out dx,al
call delay
mov al,01h
out dx,al
call delay
jmp lop
mov ah,4ch
int 21h
delay proc
mov cx,60000
lop1: mov bx,200
lop2: dec bx
jnz lop2
loop lop1
ret
delay endp
code ends
end start
12:在交通灯实验中请使用8255的C口 按位输出,置1/置0 的功能实现如下现象: 南北路口的绿灯、东西路口的红灯同时亮30秒左右。
code segment
assume cs:code
start:
mov dx,283h
mov al,80h
out dx,al
mov al,00001011b
out dx,al
mov al,00000101b
out dx,al
mov cx,20000
k2: mov bx,18000
k1: dec bx
jnz k1
loop k2
mov dx,282h
mov al,0
out dx,al
mov ah,4ch
int 21h
code ends
end start
13:在交通灯实验中,请使用8255的C口 按位输出,置1/置0 的功能实现如下现象:东西路口的黄灯闪烁5次。
code segment
assume cs:code
start: mov di,5
mov dx,283h
mov al,80h
out dx,al
mov al,00000010b
out dx,al
lop: mov al,00000011b
out dx,al
mov cx,2000
k2: mov bx,3000
k1: dec bx
jnz k1
loop k2
mov al,00000010b
out dx,al
mov cx,2000
k3: mov bx,3000
k4: dec bx
jnz k4
loop k3
dec di
jnz lop
mov ah,4ch
int 21h
code ends
end start
14:利用8255A的PC7产生负脉冲:
code segment
assume cs:code
start: mov dx,283h
mov al,80h
out dx,al
mov al,0fh
out dx,al
call delay
mov al,0eh
out dx,al
call delay
mov al,0fh
out dx,al
call delay
mov ah,4ch
int 21h
delay proc
mov cx,3000
lop1: mov bx,2000
lop2: dec bx
jnz lop2
loop lop1
ret
delay endp
code ends
end start
15:在使用8个开关控制8个LED的实验中,请利用8255的A口 作为输入端口,C口作为输出端口实现原来的实验现象。
code segment
assume cs:code
start: mov dx,283h
mov al,90h
out dx,al
lop: mov dx,280h
in al,dx
mov dx,282h
out dx,al
mov ah,06h
mov dl,0ffh
int 21h
jz lop
mov ah,4ch
int 21h
code ends
end start
16:在交通灯实验中,请使用8255的C口 按位输出,置1/置0 的功能实现如下现象:南北路口的红灯、东西路口的绿灯同时亮30秒左右。
code segment
assume cs:code
start:
mov dx,283h
mov al,80h
out dx,al
mov al,00001111b
out dx,al
mov al,00000001b
out dx,al
mov cx,20000
k2: mov bx,9000
k1: dec bx
jnz k1
loop k2
mov ah,4ch
int 21h
code ends
end start
17:在交通灯实验中,请使用8255的C口 按位输出,置1/置0 的功能实现如下现象:南北路口的黄灯闪烁5次。
code segment
assume cs:code
start: mov di,5
mov dx,283h
mov al,80h
out dx,al
lop: mov al,00001101b
out dx,al
mov cx,2000
k2: mov bx,3000
k1: dec bx
jnz k1
loop k2
mov al,00001100b
out dx,al
mov cx,2000
k3: mov bx,3000
k4: dec bx
jnz k4
loop k3
dec di
jnz lop
mov ah,4ch
int 21h
code ends
end start
18: 在模/数转换器实验中,实现以下条件下的A/D转换,模拟量的输入通道:IN1;A/D转换器的地址:2B8H;显示结果中不出现大写字母。(此实验未经证实)
code segment
assume cs:code
start: nop
lop: mov dx,2B9h
out dx,al
mov cx,0ffh
delay: loop delay
in al,dx ;4c
mov bl,al
mov cl,4
shr al,cl ;04
call disp
mov al,bl
and al,0fh
call disp
mov dl,20h
mov ah,02h
int 21h
int 21h
mov ah,06h
mov dl,0ffh
int 21h
jz lop
mov ah,4ch
int 21h
disp proc
mov dl,al
cmp dl,9
jbe next
add dl,27h
next: add dl,30h
mov ah,02h
int 21h
ret
disp endp
code ends
end start
19:利用可编程计数定时器8253A的计数器0和计数器2,输出100Hz的的信号,连接必要的连线,编写初始化程序。上机调试出程序,并将程序记录下来。
code segment
assume cs:code
start: mov dx,283h
mov al,00010110b
out dx,al
mov al,100
mov dx,280h
out dx,al
mov dx,283h
mov al,10010110b
out dx,al
mov al,100
mov dx,282h
out dx,al
mov ah,4ch
int 21h
code ends
end start
20:利用可编程计数定时器8253A的计数器1和计数器2,输出50Hz的的信号,连接必要的连线,编写初始化程序。上机调试出程序,并将程序记录下来。
code segment
assume cs:code
start: mov dx,283h
mov al,01010110b
out dx,al
mov al,200
mov dx,281h
out dx,al
mov dx,283h
mov al,10010110b
out dx,al
mov al,100
mov dx,282h
out dx,al
mov al,ah
out dx,al
mov ah,4ch
int 21h
code ends
end start
e21.txt
;21:用A命令汇编一条INT 21H 指令,用命令T单步执行该指令, 比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况。
;此题见软件实验一的第五题
*********************************
e22.txt
;22:用命令A汇编下列程序段,用命令T 跟踪执行,判断程序段能否完成指定功能。
;程序段完成将DS:2000H开始的 5 个字节内存内容相加,
;并把相加的结果存放在DS:2005H 和 DS:2006H 内存单元中,注意:要考虑进位。
;修改后的程序如下,程序主要错误:没有考虑最高位进位
MOV CX,5
MOV AX,0
MOV BX,2000H
next: ADD AL,[BX]
INC BX
;DEC CX
JNC next1
inc ah
next1: LOOP next ; (CX)-1->(CX), (CX)≠0转next
MOV [BX],AL
inc bx
mov [bx],ah
在DEBUG——A命令下输入时按照下图框中输入,注意划线部分的关系
*********************************
e23.txt
;23:编写完整的汇编语言程序,实现两个双字的加法,
;假设第一个操作数是10008423H,放在2000H处,
;第二个操作数是2007F00H,放在了3000H处。
;本程序将结果高位放在了CX,低位放在了DX
;10008423h+2007f00h=12010323h
data segment
n db 2000h dup(?) ;为将加数放在2000H,凑出的数
add1 dw 8423h,1000h ;被加数
m db 0ffch dup(?) ;原因类似于上一个
add2 dw 7f00h,200h ;加数
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ax,ds:[2000h];直接寻址
mov bx,ds:[3000h]
add ax,bx
mov dx,ax
mov ax,ds:[2002h]
mov bx,ds:[3002h]
add ax,bx
mov cx,ax
mov ah,4ch
int 21h
code ends
end start
*********************************
e24.txt
;24:编写完整的汇编语言程序,
;实现:把“Hello,Liaocheng University”传送到另外一个段的内存单元处,
;注意:不准使用mov sb/mov sw指令。
data1 segment
lcu db 'Hello, liaochengUniversity','$' ;用$作为结束的标志
data1 ends
data2 segment
lcu2 db ?
data2 ends
code segment
assume cs:code,ds:data1
start: mov ax,data1
mov ds,ax
lea si,lcu
lea di,lcu2
lop: mov al,[si]
cmp al,'$'
je fin
mov es:[di],al
inc si
inc di
jmp lop
fin:
mov ah,4ch
int 21h
code ends
end start
*********************************
e25.txt
;25:用D命令查看中断向量表, 查找int 17h对应的中断向量,
并把中断向量修改为:1234H:5678H。
17*4=5ch 020a:058b
d 0000:5c
e 0000:5c
78 56 34 12
*********************************
e26.txt
;26:编写完整的汇编语言程序,把内存3000H:2000H起30个字节数据传送到内存 2000H:1000H开始处。
;用MOV S(或者直接用MOV )
code segment
assume cs:code
start: mov ax,3000h
mov ds,ax
mov ax,2000h
mov es,ax
mov cx,30
mov si,2000h
mov di,1000h
cld
rep mov sb
mov ah,4ch
int 21h
code ends
end start
*********************************
e27.txt
;27:编写完整的汇编语言程序,实现:显示字符串“Hello World!”,并利用debug跟踪该程序的执行过程。
;程序同31或者33
*********************************
e28.txt
;28:编写完整的汇编语言程序,
;实现子程序的功能演示
*********************************
e29.txt
;29:自编程序或者利用debug,
说明T、P、G命令的不同之处
*********************************
e30.txt
;30:说明可读写内存RAM和只读内存ROM的区别,并利用debug演示
;软件第一个实验的第四题
用D命令查看
1)DS:200~22FH和F000:200~22FH两内存块内容
2)用命令F将字符‘A’分别填入这两个内存块
温馨提示:F000:0之后的为ROM
*********************************
e31.txt
;31:编写完整的汇编语言程序,实现:显示字符串“Hello World!”,
;注意:不准使用AH=9的DOS系统功能调用,
;提示:可以使用AH=2的DOS系统功能调用(字符显示功能)。
data segment
string db 'Hello World!'
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov cx,12
lea si,string
lop: mov dl,[si]
mov ah,02h
int 21h
inc si
loop lop
mov ah,4ch
int 21h
code ends
end start
*********************************
e32.txt
;32:判断指令正误,并且把错误的指令改正过来。
1)ROR AX,8 ;8>1,8>>cl
2)LEA DI,[AX] ;bx,bp,si,di
3)MOV DS,2010 ;段寄存器不能直接赋植立即数
4)PUSH AL ;十六位操作数
5)OUT A00,AL ;A00>ff,A00>>DX
6)MOV [BX],0 ;未指明立即数的类型
7)POP CS ;不能给CS赋值
8)XCHG AL,[SI] ;
9)XCHG [DI],[SI];不能两个同为内存操作数
10)MOV AL,[DX] ;同2
*********************************
e33.txt
;33:找出下列程序段的错误(不止一处),并改正过来。
date segment
string db 'Hello, World !','$';定义字符串
date ends
code segment
assume cs:code, ds:date
start: mov ax,date ;data->date
mov ds,ax
mov dx,offset string;str->string
mov ah,9 ;调用09字符串显示功能
int 21h ;21->21h
mov ah,4ch ;ax->ah
int 21h ;21->21h
code ends
end start
*********************************
e34.txt
;34:将ASCII码形式表示的各位转换成为16进制的数,并且把结果合并后放在BX中。
;ASCII码:31h,41h,32h,42h
data segment
nums db 31h,41h,32h,42h
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ch,4
lea si,nums
lop: mov al,[si]
mov ah,0
sub ax,30h
cmp ax,9
jbe con
sub ax,7
con: add dx,ax
inc si
dec ch
jz fin
mov cl,4
shl dx,cl
jmp lop
fin: int 3 ;duan dian
mov ah,4ch
int 21h
code ends
end start
*********************************
e35.txt
;35:将16进制的数转换成为ASCII码,并且把结果显示出来。
;16进制数:1A2Bh
code segment
assume cs:code
start: mov bx,1A2Bh
mov ch,4
lop: mov cl,4
rol bx,cl
mov dl,bl
call disp
dec ch
jnz lop
mov ah,4ch
int 21h
disp proc
and dl,0fh
cmp dl,9
jbe next
add dl,7
next: add dl,30h
mov ah,2
int 21h
ret
disp endp
code ends
end start
*********************************
e36.txt
;36:下列程序完成两个5位十进制数的加法,分别放在data1和data2的符号地址处,
;请找出如下程序的错误之处,并改正过来。
data segment
data1 db 08h,02h,03h,03h,02h
data2 db 03h,05h,01h,04h,05h
data ends
code segment
assume cs:code
start: mov ax,data
mov ds,ax
lea si,data1
mov di,offset data2;更改mov di,seg data2
mov cx,5
clc ;添加
p1: mov al,[si]
add al,[di]
aaa
mov [si],al
inc di
inc si ;添加
loop p1 ;更改LOOP P2
mov ah,4ch
int 21h
code ends
end start
*********************************
e37.txt
;37:编写完整的汇编语言程序,实现:以二进制的形式显示BX寄存器的内容
code segment
assume cs:code
start: mov bx,1234h
mov cx,16
lop: shl bx,1
jc one
mov dl,30h
mov ah,02h
int 21h
jmp next
one: mov dl,31h
int 21h
next: loop lop
mov ah,4ch
int 21h
code ends
end start
*********************************
e38.txt
;38:编写完整的汇编语言程序,实现:从键盘输入4个字符。
data segment
max db 5
m db 6 dup(?)
n db 23,32,56 ;用户自定义,确保输入的四个数不会覆盖掉已存在的数
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea dx,max
mov ah,0ah
int 21h
mov ah,4ch
int 21h
code ends
end start
*********************************
e39.txt
;39:编写完整的汇编语言程序,实现:以十六进制的形式显示BX寄存器的内容
code segment
assume cs:code
start: mov bx,12abh
mov ch,4
lop: mov cl,4
rol bx,cl
mov dl,bl
call disp
dec ch
jnz lop
mov ah,4ch
int 21h
disp proc
and dl,0fh
cmp dl,9
jbe next
add dl,7
next: add dl,30h
mov ah,2
int 21h
ret
disp endp
code ends
end start
*********************************
e40.txt
;40:编写完整的汇编语言程序,实现:小写字母a,b,c,d到A,B,C,D的转换
data segment
res db 61h,62h,63h,64h ;小写字母的ASCII码
data ends
code segment
assume cs:code
start: mov ax,data
mov ds,ax
lea si,res
mov cx,4
lop: sub byte ptr [si],20h
inc si
loop lop
mov ah,4ch
int 21h
code ends
end start
这个寒冷的季节因你的关注而变得温暖;
最后,祝朋友们好好复习,考个考成绩!
领取专属 10元无门槛券
私享最新 技术干货