搜索
您的当前位置:首页正文

微机原理实验报告

来源:六九路网


物理与信息工程学院

微机原理

实 验 报 告

实验一

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中的内容是什么?

实验二

1. 编程:求两个数的平均值。这两个数分别放在X单元和Y单元中,而平

均值放在Z单元中。

程序实验报告已给出,在此只给出运行结果:

3. 编写程序:求1+2+3+……+100的和 程序如下:data segment number dw 0001h data ends code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax

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 实验

结果:

1+2+3+……+100=5050 (5050)10=(13BA)16

实验三

1.从键盘输入两个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,'THERESULT IS:$' DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS:DATA START:MOV AX,DATA

MOV DS,AX MOV DX,OFFSET INFOR1 MOV AH,09H INT 21H

MOV AH,01H INT 21H

AND AL,0FH AND AL,0FH MOV BL,AL

MOV DX,OFFSET INFOR2 MOV AH,09H INT 21H

MOV AH,01H INT 21H

AND AL,0FH

SUB AL,30H MOV AH,0 XOR AH,AH ADD AL,BL AAA

PUSH AX

MOV DX,OFFSET INFOR3 MOV AH,09H INT 21H POP AX PUSH AX PUSH AX MOV DL,AH ADD DL,30H MOV AH,02H INT 21H POP AX

MOV DL,AL ADD DL,30H MOV AH,02H INT 21H

MOV AH,4CH INT 21H CODE ENDS END START 实验

结果:

2.从键盘输入0~9中任意一个自然数,将其立方值在屏幕上显示出来。 程序如下:

data segment

table dw 0,1,8,27,64,125,216,343,512,729 buf db'please input a number(0~9):',0dh,0ah,'$' data ends code segment

assume cs:code,ds:data start:mov ax,data mov ds,ax

mov dx,offset buf mov ah,9h int 21h mov ah,01 int 21h and ax,0fh add ax,ax

mov bx,offset table mov ah,0 add bx,ax mov ax,[bx] mov ax,4c00h int 21h code ends end start 实验结果:

9*9*9=(729)10=(02D9)16 5*5*5=(125)10=(007D)16

实验四

1.编程实现符号函数。 程序如下:

DATA SEGMENT X DB -25 Y DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:

MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JG NEXT1 JL NEXT2 MOV Y,0 JMP EXIT NEXT1:MOV Y,1 JMP EXIT

NEXT2:MOV Y,-1 EXIT:MOV AH,4CH INT 21H CODE ENDS END START 实验结果:

输入CD的值为-25时的结果

输入CD的值为25时的结果

实验五

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 实验结果:

编程序统计学生的数学成绩,分别归类90~99分,80~89分,70~79分,60~69分及60分以下,并将各段的人数送入内存单元中。 程序如下:

DATA SEGMENT

BUF DB 95,91,64,85,79,66,35 S9 DB ? S8 DB ? S7 DB ? S6 DB ? S5 DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:

MOV AX,DATA MOV DS,AX MOV CX,7 LEA SI,BUF AGAIN:

MOV AL,[SI] CMP AL,90 JB NEXT INC S9 JMP EXIT NEXT:

CMP AL,80 JB NEXT1

INC S8 JMP EXIT NEXT1:

CMP AL,70 JB NEXT2 INC S7 JMP EXIT NEXT2:

CMP AL,60 JB NEXT3 INC S6 JMP EXIT NEXT3: INC S5 EXIT: INC SI

LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START 实验结果:

实验六

1.编程计算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 实验结果:

四个偶数的和:2+4+6+8=20

实验七

代码转换:设计将十六位二进制数转换成4位压缩型BCD码的算法。 实验程序: datas segment datas ends stacks segment stacks ends codes segment

assume cs:codes,ds:datas,ss:stacks start:

mov ax,datas mov ds,ax mov ax,1345h cwd

mov bx,1000 div bx mov cx,dx mov dl,al call disp mov al,bh mov bl,10 mov ah,0 div bl mov bh,ah mov dl,al call disp mov dl,bh

call disp mov ah,4ch int 21h ret

disp proc near or dl,30H mov ah,2 int 21h ret

disp endp codes ends end start 实验结果:

一、PC机内部8259中断实验

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 jne sound mov count,91 exit:cli pop dx pop cx pop ax pop ds iret

ring endp code ends end start 实验结果:

程序写完后保存,然后直接运行。该实验每隔10秒响铃一次,外部响铃,内部显示如上图所示

8254可编程定时中断实验

实验程序: data segment

message db 'this is a 8254 ',0ah,0dh,'$' data ends

code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax cli

mov al,72h 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 ax,2572h int 21h pop ds

in al,0a1h and al,0fbh out 0a1h,al in al,21h

and al,0fbh out 21h,al

mov al,00110100b mov dx,3003h out dx,al

mov aX,5000h mov dx,3000h out dx,al mov al,ah out dx,al

LL:MOV AH,0 INT 16H JZ LL

MOV AH,0 INT 16H

CMP AL,1BH JNZ LL

IN AL,0A1H OR AL,04H OUT 0A1H,AL IN AL,21H OR AL,04H OUT 21H,AL CLI

POP DX POP DX

MOV AL,72H MOV AH,25H INT 21H

MOV AH,4CH INT 21H

INT_PROC PROC

PUSH DX PUSH AX

MOV AX,DATA MOV DS,AX

MOV DX,OFFSET MESSAGE MOV AH,09H INT 21H

MOV AL,20H OUT 20H,AL OUT 0A0H,AL

POP AX POP DX IRET

INT_PROC ENDP

CODE ENDS END START 实验结果:

8255并行接口实验

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

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.使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 jmp l

mov ah,4ch int 21h code ends end start

3.使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:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top