微机原理实验参考答案(航大)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《微机原理》实验参考答案
实验1 汇编基本指令及顺序程序设计实验
实验2 分支与DOS中断功能调用程序设计实验
实验3 循环结构程序设计实验
实验4 存储器扩展实验
实验5 8259应用编程实验
实验1汇编基本指令及顺序程序设计实验
一、实验目的
1、掌握汇编语言的开发环境和上机过程;
2、掌握DEBUG命令;
3、掌握顺序程序设计方法;
4、掌握寻址方式;
5、理解和掌握汇编基本指令的功能。

二、实验内容
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。

要求:用3种方法实现。

答:方法一CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
MOV CX,AX
MOV AX,BX
MOV BX,CX
CODE ENDS
END START
方法二CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
XCHG AX,BX
CODE ENDS
END START
方法三CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
PUSH AX
PUSH BX
POP AX
POP BX
CODE ENDS
END START
2、分别执行以下指令,比较寄存器寻址,寄存器间接寻址和相对寄存器寻址间的区别。

MOV AX,BX 寄存器寻址,将BX内容送AX
MOV AX,[BX] 寄存器间接寻址,将DS:BX内存单元内容送AX
MOV AX,10[BX] 寄存器相对寻址,将DS:BX+10内存单元内容送AX 在DEBUG调试模式,用A命令直接编辑相应指令并用T命令单步执行,执行后查询相应寄存器的值并用D命令查内存。

3、已知有如下程序段:
MOV AX,1234H
MOV CL,4
在以上程序段的基础上,分别执行以下指令:
ROL AX,CL AX=2341H
ROR AX,CL AX=4123H
SHL AX,CL AX=2340H
SHR AX,CL AX=0123H
SAR AX,CL AX=0123H
RCL AX,CL 带进位标志位的循环左移
RCR AX,CL 带进位标志的循环右移
4、设有以下部分程序段:
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 3

LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]

要求:(1)将以上程序段补充成为一个完整的汇编程序。

答:DATA SEGMENT
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 3
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)AX=3000H
实验2 分支与DOS中断功能调用程序设计实验
一、实验目的
1、掌握条件转移、无条件转移指令的功能及应用;
2、掌握分支程序的设计、编写、调试和运行方法。

3、掌握1号、2号和9号功能调用及其程序设计方法。

二、实验内容
1、编程求|X-Y|,结果放在RESULT单元中。

X和Y都为16位操作数。

DA TA SEGMENT
X DW 1234H
Y DW 5678H
RESULT DW ?
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV AX,X
SUB AX,Y
JAE NEXT;设X,Y是不带符号数,X>=Y转移
MOV AX,Y
SUB AX,X
NEXT: MOV RESYLT,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、编写一程序,实现从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是,请输出“这不是一个大写字母”的英文信息(要求:能连续输入)。

DATA SEGMENT
MS1 DB ‘IT IS A BIG CAPITAL$’
MS2 DB ‘IT IS NOT A BIG CAPITAL$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA
START:MOV AX,DATA
MOV DS,AX
NEXT: MOV DX,OFFSET MS2
MOV AH,1
INT 21H; 1号功能调用
CMP AL,0DH
JZ EXIT
CMP AL, ‘A’
JB NO
CMP AL, ‘Z’
JA NO
MOV DX,OFFSET MS1
NO: MOV AH,9
INT 21H
IMP NEXT
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
3、请编写一程序,实现将大写字母字符串转换成小写字母字符串。

设字符串的首地址为STRING,字符串的长度在N单元内。

DA TA SEGMENT
STRING DB 'I AM A STUDENT!$'
N EQU $-STRING
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET STRING
MOV CX,N
NEXT: MOV AL,[BX]
CMP AL,'A'
JB NEXT1
CMP AL,'Z'
JA NEXT1
ADD AL,20H
MOV [BX],AL
NEXT1:INC BX
LOOP NEXT
MOV AH,9
MOV DX,OFFSET STRING
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
4、编程显示任一寄存器(如BX)的最高位。

即若BX的最高位为1,则在屏幕上输出“1”;若BX的最高位为0,则在屏幕上输出“0”。

CODE SEGMENT
ASSUME CS:CODE
START: MOV DL,'1'
MOV BX,8234H
CMP BX,0
JS SHOW
MOV DL,'0'
SHOW: MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
实验3 循环结构程序设计实验
一、实验目的
1、掌握循环指令LOOP、LOOPZ、LOOPNZ指令的功能及使用方法。

2、掌握循环程序的设计、编写、调试和运行方法。

二、实验内容
1、循环结构程序设计
编写一个程序,将内存1000H开始的连续100个字节送往2000H开始的连续100个内存单元中。

要求使用三种不同的方法(不用串操作指令、用单一的串操作指令、用带重复前缀的串操作指令),下面已给出一种实现方法,请给出另外两种实现方法的源程序清单:
实验程序参考清单:
方法一带重复前缀的串操作指令
DATA SEGMENT
ORG 1000H
DB 100 DUP(…A‟)
ORG 2000H
DB 100 DUP(…B‟)
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE
START: MOV AX,DA TA
MOV DS,AX
MOV ES,AX
MOV SI,1000H
MOV DI,2000H
MOV CX,100
CLD
REP MOVSB
MOV AH,4CH
INT 21H
CODE ENDS
END START
方法二不带重复前缀的串操作指令
DATA SEGMENT
ORG 1000H
DB 100 DUP(…A‟)
ORG 2000H
DB 100 DUP(…B‟)
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE START: MOV AX,DA TA
MOV DS,AX
MOV ES,AX
MOV SI,1000H
MOV DI,2000H
MOV CX,100
CLD
NEXT: MOVSB
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
方法三不用串操作指令,而用MOV指令
DATA SEGMENT
ORG 1000H
DB 100 DUP(…A‟)
ORG 2000H
DB 100 DUP(…B‟)
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE START: MOV AX,DA TA
MOV DS,AX
MOV SI,1000H
MOV DI,2000H
MOV CX,100
NEXT: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、编程计算1+2+3+…+100的和。

答:用AX存放结果
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,0
MOV BX,1
MOV CX,100
NEXT: ADD AX,BX
INC BX
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
如果想以十进制输出显示AX中的结果则需要增加显示输出程序(感兴趣同学参考,不要求):
DA TA SEGMENT
MS DB 5 DUP(?)
DB '$'
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA
START:MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV BX,1
MOV CX,100
NEXT: ADD AX,BX
INC BX
LOOP NEXT
MOV SI,OFFSET MS
ADD SI,4
NEXT1:MOV DX,0
MOV BX,10
DIV BX
ADD DL,30H
MOV [SI],DL
DEC SI
CMP AX,0
JZ EXIT
JMP NEXT1
EXIT: MOV AH,9
MOV DX,OFFSET MS
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
实验4 存储器扩展实验
code segment
assume cs:code
org 1000h
Start: mov bx,8000h ;外部存储器起始地址BX
mov cx,2048 ;初始化计数器
RamWR: mov [bx],55aah ;将数据写入外部存储器inc bx ;地址+2
inc bx
loop RamWR ;地址不到8FFF则继续
jmp $ ;结束
code ends
end Start
实验5 8259应用编程实验
outseg equ 0ffdch ;字形控制口
outbit equ 0ffddh ;字位控制口
m8259 equ 0ffe0h ;8259控制口
c8259 equ 0ffe1h ;8259命令口
code segment
assume cs:code
org 1000h
start: cli ;清中断标志
call intsvr ;分配中断向量
call init ;8259初始化
sti ;置中断标志
mov dx,outbit ;选中LED第6位
mov al,000001b
out dx,al
call show_p ;显示"P."
jmp $ ;循环等待
;设置中断向量,写N=15的中断向量,中断向量表003CH-003FH单元intsvr: mov ax,0000h
mov es,ax
mov di,003ch
lea ax,irq7
stosw
mov ax,0000h
stosw
ret
;8259初始化
init: mov dx,m8259
mov al,13h
out dx,al ;边沿触发
mov dx,c8259
mov al,08h
out dx,al ;基地址
mov al,09h
out dx,al ;写命令字
mov al,7fh
out dx,al ;设置IMR,只开放IQR7,屏蔽其他
ret
;显示"0"
show_p: mov al,0 ;'0'
call disp ;显示
ret
;查表显示子程序
disp: mov dx,outseg ;字形控制口
mov bx,offset led
xlat ;查表
out dx,al ;送显示
ret
;IRQ7中断服务程序
irq7: cli ;清中断标志,关中断
inc al ;加一计数
and al,0fh ;只保留低4位,清零高位
push ax ;AX进栈保存
call disp ;显示
mov dx,m8259
mov al,20h
out dx,al ;写结束字
pop ax ;恢复AX
sti ;置中断标志,开中断
iret ;从中断返回
;字形代码表
led db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h ; 0 1 2 3 4 5 6 7 db 80h,90h,88h,83h,0c6h,0a1h,86h,8eh ;8 9 A B C D E F
db 0ch ;'P.'
code ends
end start。

相关文档
最新文档