微机原理实验报告

更新时间:2024-06-06 07:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

实验一

1)………………………………………………………………(2) 2)………………………………………………………………(2) 3)………………………………………………………………(3) 实验二………………………………………………………………(4) 实验三

1)………………………………………………………………(5) 2)………………………………………………………………(5) 3)………………………………………………………………(6) 实验六

1)………………………………………………………………(6) 2)………………………………………………………………(7) 实验八

1)………………………………………………………………(8)

实验1 1)从0000:3100H内存单元存放0~15的平方数

STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS

CODE SEGMENT

ASSUME CS:CODE

START:MOV DI,3100H

MOV CX,16 MOV AX,0

MOV DX,0 ;中间寄存器DX(0~15) S1:MOV AX,DX

MUL AL ;ALXAL=AH AL MOV [DI],AL INC DI INC DX LOOP S1 S2:JMP S2 CODE ENDS

END START

分析:

MUL 乘数是8位的, 被乘数是AL=AH AL

16位的, 被乘数是AX=DX AX DIV 除数是 8位的, 被除数是AL=AL存放商,AH存放余数除数是16位的,被除数AX=AX存放商,DX存放余数

实验1 2)REP MOVSB 指令 修改实验1程序2

STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS CODE SEGMENT

ASSUME CS:CODE START:MOV CX,16

MOV AX,0 MOV ES,AX

MOV DS,AX ;赋初值 MOV SI,3100H MOV DI,3200H CMP SI,DI JA S1

ADD SI,CX ADD DI,CX DEC SI DEC DI

S2:STD ;SI

REP MOVSB JMP S0

S1:CLD ;SI>DI 从头部开始传 +1操作

REP MOVSB JMP S0 S0:JMP S0 CODE ENDS

1

END START 分析:

关于REP MOVSB指令,使用之前必须对DS:SI源数据块首地址,ES:DI目的数据块的首地址,CX数据块长度,通过指定DF标志位,当DF=0时,每搬一个数据地址指针+1,用于从首址开始搬,DF=1,每搬一个数据地址指针-1,用于从末尾地址开始搬

实验1 3)统计正数、零、负数的个数 STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS

CODE SEGMENT

ASSUME CS:CODE START:MOV DI,3000H MOV CL,[DI] XOR CH,CH MOV BL,CH INC DI

MOV DX,0 L1:MOV AL,[DI]

TEST AL,80H JZ L3

INC BL ;负数个数+1 JMP L2

L3:CMP AL,0

JE L4

INC DL ;正数个数+1 JMP L2

L4:INC DH ;0的个数+1 L2:INC DI

LOOP L1

MOV [DI],BL MOV [DI+1],DL MOV [DI+2],DH INT 03H

CODE ENDS

END START

分析:

1.取1个数

2.判断符号位是否为0?

Y-->不是负数,继续去判是0还是正数---〉3

N-->是负数,负数个数+1,地址指针+1取下个数---〉4 3.判断这个数是否为0?

Y-->是0,0的个数+1,地址指针+1取下个--〉4 N-->是正数,正数个数+1,地址指针+1取下个-〉4 4.地址指针+1取下个 5.是不是最后个数? Y-->去放结果 N-->2

2

4.实验2 去前导0

如果被除数小于除数,则除不尽,会产生前导0,直接不做除法,取下个除数,如果除得尽,以后就不再做被除数与除数之间的比较 STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS

DATA SEGMENT

DATA1 DW ? ;?为4位16进制数 SYS0 DW 10000,1000,100,10 DATA2 DB 5 DUP(20H) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA TTT PUSH DS

XOR AX,AX PUSH AX

MOV AX,DATA MOV DS,AX

MOV AX,DATA1 ;取字数据 LEA BX,SYS0 ;取除数地址 MOV DI,0 ;商首地址 T0: MOV CX,WORD PTR[BX] XOR DX,DX DIV CX

CMP AX,0 ;比较是否为0

JNE T2 ;若不为0,则跳至原程序逻辑 MOV AX,DX ;若为0继续找下一个 ADD BX,2

CMP CX,10 ;若查至十位数仍为0,则无论个位多少进入输出环节 JNE T0 JMP T3

T2: ADD AL,30H ;写入,有0会保留 MOV DATA2[DI],AL MOV AX,DX ADD BX,2 INC DI CMP CX,10 JNE T1 JMP T3

T1: MOV CX,WORD PTR[BX] XOR DX,DX DIV CX JMP T2

T3: ADD AL,30H

3

MOV DATA2[DI],AL INC DI

MOV BX,OFFSET DATA2 MOV AH,06H INT 10H INT 03H CODE ENDS END TTT

实验3 1)在自小到大排序中如果第一次小循环的首次在头部比较交换过后再没有交换过,那么排序在第一次小循环结束后就结束运行

STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK MMM:MOV CX,15 M4:MOV SI,3000H

MOV BL,0 PUSH CX

MOV AL,[SI] CMP AL,[SI+1] JBE M1

XCHG AL,[SI+1] INC SI

M2:MOV AL,[SI]

CMP AL,[SI+1] JBE M1

XCHG AL,[SI+1] MOV [SI],AL MOV BL,1 M1:INC SI

LOOP M2 CMP BL,0 JE M3 POP CX LOOP M4

M3: INT 03H CODE ENDS END MMM

实验3 2)有符号字数据排序

STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK MMM:MOV CX,15 M4:MOV SI,3000H

4

MOV BL,0 PUSH CX

M2:MOV AX,WORD PTR[SI] ;字数据

CMP AX,WORD PTR[SI+2] JLE M1 ;有符号比较 XCHG AX,WORD PTR[SI+2] MOV WORD PTR[SI],AX MOV BL,1 M1:ADD SI,2

LOOP M2 CMP BL,0 JE M3 POP CX LOOP M4 M3: INT 03H CODE ENDS

END MMM

实验3 3)找出和统计其中是0~9的数字字符,并同样将所有数字依次存放在A2数据区内。

STACK SEGMENT STACK DB 50 DUP(?) STACK ENDS DATA SEGMENT SL DB 0

A1 DB 'JLK2Fjkjl4jty48' N DB $-A1

A2 DB 20 DUP(20H),0 DATA ENDS CODE SEGMENT

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

MOV DS,AX LEA SI,A1 LEA DI,A2 MOV CL,N MOV CH,0 L2:MOV AL,[SI]

CMP AL,'0'; JB L1

CMP AL,'9'; JA L1

MOV [DI],AL INC SL INC DI L1:INC SI

LOOP L2

LEA BX,A2 ;显示数字 MOV AH,6 INT 10H HLT

CODE ENDS

5

END START

实验6 1)用REP MOVSB或REP MOVSW指令改写

STACK SEGMENT PARA STACK ‘STACK’ STACK_BUF DW 100 DUP(?) TOP EQU $-STACK_BUF STACK ENDS

DATA SEGMENT

TABLE1 DB 10 DUP(?) STRING DB ‘NO ERROR!’,00H DATA ENDS CODE SEGMENT

ASSUME SS:CODE,DS:DATA ASSUME SS:STACK,ES:DATA MAIN PROC FAR SSS:PUSH DS

XOR AX,AX PUSH AX

MOV AX,DATA

MOV DS,AX ;赋予初始值 MOV AX,2000H

MOV ES,AX ;赋予初始值 MOV CX,05

MOV SI,OFFSET TABLE1 MOV DI,0 L1:CLD

REP MOVSW

LEA BX,STRING

MOV SI,OFFSET TABLE1 MOV DI,0 MOV CX,05 L3:CLD

REP CMPSW JNZ L2 JMP L4

L2:ADD BX,2 L4:MOV AH,6

INT 10H INT 03H

MAIN ENDP CODE ENDS END SSS

实验6 2)若将6264片选接到My7,则该如何修改源程序。STACK SEGMENT PARA STACK ‘STACK’ STACK_BUF DW 100 DUP(?) TOP EQU $-STACK_BUF STACK ENDS

DATA SEGMENT

TABLE1 DB 10 DUP(?) STRING DB ‘NO ERROR!’,00H DATA ENDS

6

CODE SEGMENT

ASSUME SS:CODE,DS:DATA ASSUME SS:STACK,ES:DATA MAIN PROC FAR SSS:PUSH DS

XOR AX,AX PUSH AX

MOV AX,DATA MOV DS,AX

MOV AX,3800H ;将CE接到MY7后段地址ES=3800H MOV ES,AX MOV CX,5

MOV SI,OFFSET TABLE1

MOV DI,1200H ;要求将数据写到6264偏移地址为1200H开始的地方 L1:CLD

REP MOVSW

LEA BX,STRING

MOV SI,OFFSET TABLE1 MOV DI,1200H MOV CX,05 L3:CLD

REP CMPSW JNZ L2 JMP L4

L2:ADD BX,2 L4:MOV AH,6

INT 10H INT 03H MAIN ENDP CODE ENDS END SSS

实验八 8255并行口应用二

1. 请自行组合出数码管显示H、E、L、P 的七段码数据。 STACK SEGMENT PARA STACK ‘STACK’ DB 64 DUP(?) STACK ENDS

DATA SEGMENT

DISP1 DB 1,2,3,4 DISP2 DB 10,11,12,13 MARK0 DB 0

LED DB 0

TIME DW 200H ;其值可在100H---0FFFFH设置 TABLE DB 76H,79H,38H,73H,66H,6DH,7DH ;0~6

DB 07H,7FH,6FH,77H,7CH,39H,5EH ;7~d DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

BEGIN: MOV AX,DATA ;加载数据段 MOV DS,AX

MOV AL,88H ;设置8255的PA口、PC口低四位和 OUT 63H,AL ;PB口为输出,PC口高四位为输入 L0: MOV LED,0F7H ;先准惫选通第一个数码管

7

CMP MARK0,0 ;判标志位单元 JNZ L1

LEA SI,DISP1 ;为0,取DISP1首地址 JMP L2

L1: LEA SI,DISP2 ;非0,取DISP2首地址 L2: MOV BX,OFFSET TABLE ;取段码表首地址 MOV AL,[SI] ;取显示内容到AL XLAT ;查表换码 OUT 60H,AL ;送PA口输出 MOV AL,LED

OUT 62H,AL ;选通数码管,PC口低四位输出 CALL D5MS ;调用5MS延时 MOV AL,LED

TEST AL,1 ;判显示到最后一位? JZ L3 ;到了则重新开始

ROR AL,1 ;未到则右移到下一位数码管 MOV LED,AL

INC SI ;显示RAM地址+1 JMP L2 ;跳到取下一个显示内容 L3: IN AL,62H ;读PC7 AND AL,80H ;按过键否? JZ L0

NOT MARK0 ;按过键则MARK0取反 JMP L0

D5MS: MOV CX,TIME

DELAY:LOOP DELAY RET CODE ENDS END BEGIN

8

本文来源:https://www.bwwdw.com/article/7hd6.html

Top