文档库 最新最全的文档下载
当前位置:文档库 › 微机原理实验程序

微机原理实验程序

微机原理实验程序
微机原理实验程序

实验一两个多位十进制数相减实验

一、实验要求:将两个多位十进制数相减,要求被减数,减数均以ASCII码形式按顺序

存放在以DATAI和DATA2为首的5个内存单元中(低位在前>,结果送回

DATAI处。

二、实验目的:1.学习数据传送和算术运算指令的用法。

2.熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。

三、实验步骤:连好实验箱后接通电源,打开上位机软件88TE进入软件调试界面:

点击“文件\打开”文件路径为C:

\88TE\cai\asm\Ruanjian\Rjexp1.asm。具体操作如图所示:

b5E2RGbCAP

点击编译连接生成可执行的exe文件。

通过单步运行调试程序,打开寄存器查看其变量变化情况。

四、实验程序框图:

五、实验程序:

文件路径为C:\88TE\cai\asm\Ruanjian\Rjexp1.asm

DATA SEGMENT

DATA1 DB 33H,39H,31H,37H,38H 。第一个数据<作为被减数)DATA2 DB 36H,35H,30H,38H,32H 。第二个数据<作为减数)MES1 DB '-','$'

MES2 DB '=','$'p1EanqFDPw Array DATA ENDS

STACK SEGMENT

STA DB 20 DUP(?>

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV SI,OFFSET DATA1

MOV BX,05

CALL DISPL

MOV AH,09H

LEA DX,MES1

INT 21H

MOV SI,OFFSET DATA2

MOV BX,05

CALL DISPL

MOV AH,09H

LEA DX,MES2

INT 21H

MOV SI,OFFSET DATA1

MOV DI,OFFSET DATA2

CALL SUBA 。减法运算

MOV SI,OFFSET DATA1

MOV BX,05 。显示结果

CALL DISPL

MOV DL,0DH

MOV AH,02H

INT 21H

MOV DL,0AH

MOV AH,02H

INT 21H

INT 21H

MOV AX,4C00H

INT 21H

DISPL PROC NEAR 。显示子功能

DSI: MOV AH,02

MOV DL,[SI+BX-1] 。显示字符串中一字符

INT 21H

DEC BX 。修改偏移量

JNZ DSI

RET

DISPL ENDP

SUBA PROC NEAR

MOV DX,SI

MOV BP,DI

MOV BX,05

SU1: SUB BYTE PTR[SI+BX-1],30H

SUB BYTE PTR[DI+BX-1],30H

DEC BX 。将ASCII 码表示的数字串DXDiTa9E3d

JNZ SU1 。转化为十六进制的数字串 MOV SI,DX

MOV DI,BP

MOV CX,05 。包括进位,共5位

CLC 。清进单位

SU2: MOV AL,[SI]

MOV BL,[DI]

SBB AL,BL 。带进位相减

AAS 。非组合BCD码的减法调整 MOV [SI],AL 。结果送被减数区

INC SI

INC DI 。指向下一位

LOOP SU2 。循环

MOV SI,DX

MOV DI,BP

MOV BX,05

SU3: ADD BYTE PTR [SI+BX-1],30H

ADD BYTE PTR [DI+BX-1],30H

DEC BX 。十六进制的数字串转化ASCII码表示的数字串 JNZ SU3

RET

SUBA ENDP

CODE ENDS

END START

实验二两个数相乘的实验

一、实验要求:

实现十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,算式结果在屏幕上显示出来。

二、实验目的:掌握乘法指令和循环指令的用法。

三、实验程序框图:

四、实验程序:

DATA SEGMENT

DATA1 DB 32H,39H,30H,35H,34H

DATA2 DB 34H

MES1 DB '*','$'

MES2 DB '=','$'

RESULT DB 6 DUP (00H>

DATA ENDS

STACK SEGMENT

STA DB 20 DUP (?>

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV SP,TOP

LEA SI,DATA1

MOV BX,05H

L1: MOV AH,02H

MOV DL,[SI+BX-1]

INT 21H

DEC BX

JNZ L1

MOV AH,09H

LEA DX,MES1

INT 21H

LEA SI,DATA2

MOV AH,02H

MOV DL,[SI]

INT 21H

MOV AH,09H

LEA DX,MES2

INT 21H

MOV SI,OFFSET DATA2 。显示算式

MOV BL,[SI] 。乘数DATA2→BL

AND BL,00001111B 。屏蔽高4位,ASCII码转化为十六进制数

MOV SI,OFFSET DATA1

MOV DI,OFFSET RESULT

MOV CX,05

LOOP1: MOV AL,[SI]

AND AL,00001111B 。取被乘数DATA1,ASCII变十六进制数

INC SI 。指向被乘数1的下一字符单元

MUL BL 。相乘

AAM 。AAM调整

ADD AL,[DI] 。结果低位与前次计算的进位相加

AAA 。AAA调整

MOV [DI],AL

INC DI 。结果送存到下一单元

MOV [DI],AH

LOOP LOOP1 。计算结果高位进位送存

MOV CX,06

MOV SI,DI

DISPL: MOV AH,02

MOV DL,[SI]

ADD DL,30H

INT 21H

DEC SI

LOOP DISPL 。显示结果

MOV AX,4C00H

INT 21H 。结束

CODE E NDS

END START

实验三 BCD码相乘实验

一、实验要求:

实现BCD码的乘法,要求被乘数和乘数以组合的BCD码形式存放,各占一个内存单元,乘积存入在另外两个内存单元中,由于没有组合的BCD码乘法指令,程序中采用将乘数1作为计算器,累加另一个乘数的方法得到计算结果。RTCrpUDGiT

二、实验目的:

掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算。

三、实验程序框图:<附后)

四、实验程序:

DATA SEGMENT

FIRST DB 99H

SECOND DB 25H

THIRD DB 2 DUP(?>

MES1 DB '*','$'

MES2 DB '=','$'

DATA ENDS

STACK S EGMENT PARA STACK 'STACK'

STAPN D B 100 DUP(?>

TOP EQU LENGTH STAPN

STACK E NDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV BL,FIRST 。被乘数送BL

MOV CL,SECOND 。乘数送CL

MOV DX,0 。部分积清0

MOV AL,BL

AGAIN: OR AL,AL

JZ DONE 。被乘数减到0则转结果显示 MOV AL,DL

ADD AL,CL

DAA 。乘数于部分积低位相加后调整 MOV DL,AL

MOV AL,DH

ADC AL,0

DAA 。往部分积高位送进位后调整

MOV DH,AL

MOV AL,BL

DEC AL

DAS 。组合BCD码减法调整

MOV BL,AL

JMP AGAIN

DONE: L EA BX,THIRD

MOV [BX],DX

LEA SI,FIRST

CALL DIS

XOR AX,AX

MOV AH,09H

LEA DX,MES1 。*

INT 21H

LEA SI,SECOND

CALL DIS

XOR AX,AX

LEA DX,MES2 。=

MOV AH,09H

INT 21H

LEA SI,THIRD

INC SI

CALL DIS

DEC SI

CALL DIS

MOV AX,4C00H 。返回DOS

INT 21H

DIS PROC NEAR 。显示子程序

MOV AL,[SI]

MOV CL,04H

SHR AL,CL

ADD AL,30H

MOV DL,AL

MOV AH,02H

INT 21H

MOV AL,[SI]

AND AL,0FH

ADD AL,30H

MOV DL,AL

MOV AH,02H

INT 21H

RET

DIS ENDP

CODE ENDS

END START

实验四字符匹配程序

一、实验要求:用串操作指令设计程序,实现在指定存储区6000:0-6000:100<长度为100H)中寻找匹配字符,遇空格字符<20H)结束,退出时给出是否找到的信息。5PCzVD7HxA

二、实验目的:掌握8086的串操作指令的使用方法。

三、实验说明:

1、8086中用于字符串检索的指令为SCAXB/SCASW,用AL中的字节或者AX中的字与位于ES段由DI寄存器所批的内存单元的字节或字相比较。通过前缀的控制,可以实现在DI所指的字母串中,寻找第一个与AL<或AX)的内容相同<或不同)的字节<或字)。jLBHrnAILg

2、对于所有的串操作指令,都要注意方向标志的设置,指令CLD使方向标志DF 清0,SI和DI自动增量修改,指令STD使DF置I,SI和DI作自动减量修改。xHAQX74J0X

四、实验程序框图:

五、实验程序:

DATA SEGMENT

MESS1 DB '按下回车后在6000:0-100范围内寻找空格

符!',0DH,0AH,'$'LDAYtRyKfE

MESS3 DB '找到空格符!',0DH,0AH,'$'

MESS4 DB '寻找范围内没有空格符!',0DH,0AH,'$'

DATA ENDS

STACK SEGMENT

STA DW 32 DUP(?>

TOP DW ?

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX 。初始化

MOV ES,AX

MOV AH,09H

MOV DX,OFFSET MESS1

INT 21H 。显示信息1

MOV AH,08H

INT 21H

MOV AX,6000H

MOV ES,AX

MOV DI,0 。偏移量送DI

CLD 。清方向标志

MOV CX,0100H 。长度为100H字节

MOV AL,20H 。空格符20H

REPNZ SCASB

JNZ AA 。全都不为20H则转AA

MOV AH,09H

MOV DX,OFFSET MESS3

INT 21H 。显示"找到"信息

JMP BBB

AA: MOV AH,09H

MOV DX,OFFSET MESS4

INT 21H 。显示"没找到"信息

BBB: MOV AX,4C00H

INT 21H 。结束

CODE ENDS

END START

实验五字符串匹配程序

一、实验要求:编写程序,实现两个字符串比较。如相同,则显示“MATCH”,否则,显示“NOMATCH”。Zzz6ZB2Ltk

二、实验目的:掌握提示信息的使用方法及键盘输入信息的用法。

三、实验程序框图:

四、实验程序:

CRLF MACRO 。显示回车

MOV DL,0DH

MOV AH,02H

INT 21H

MOV AH,02H

MOV DL,0AH

INT 21H

ENDM

DATA SEGMENT

MESS1 DB 'MATCH',0DH,0AH,'$'

MESS2 DB 'NO MATCH',0DH,0AH,'$'

MESS3 DB 'INPUT STRING1!',0DH,0AH,'$'

MESS4 DB 'INPUT STRING2!',0DH,0AH,'$'

MAXLEN1 DB 81

STRING1 DB 81 DUP(?>

MAXLEN2 DB 81

STRING2 DB 81 DUP(?>

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AH,09H

MOV DX,OFFSET MESS3

INT 21H 。显示输入提示信息1

MOV AL,MAXLEN1

MOV BX,OFFSET STRING1

MOV [BX],AL 。最大字符缓冲

MOV AH,0AH

MOV DX,OFFSET STRING1

INT 21H 。接收键入的字符串1

CRLF

MOV AH,09H

MOV DX,OFFSET MESS4

INT 21H 。显示输入提示信息2

MOV AL,MAXLEN2

MOV BX,OFFSET STRING2

MOV [BX],AL 。最大字符缓冲设置

MOV AH,0AH

MOV DX,OFFSET STRING2

INT 21H 。接收键入的字符串2

CRLF

CLD

LEA SI,STRING1 。字符串1的地址送给SI

MOV CL,[SI+1] 。字符串1的字符数送给CX

MOV CH,0

KKK: LEA DI,STRING2 。字符串2的地址送给DI

MOV DL,[DI+1] 。字符串2的字符数送给DX

MOV DH,0

ZJ2: MOV AL,[SI+2] 。字符串1的第一个字符在字符串2中匹配

CMP [DI+2],AL

JE ZJ3 。匹配成功则跳转

ZJ1: INC DI 。指向字符串2下一个字符

DEC DX

JZ GGG 。字符串2完,不匹配

JMP ZJ2 。字符串2没完,重新匹配

ZJ3: DEC CX

JZ MMM 。字符串1完,匹配

DEC DX

JZ GGG 。字符串2完,不匹配

INC SI 。指向串1下一个字符

INC DI 。指向串2下一个字符

MOV AL,[SI+2]

CMP [DI+2],AL

JE ZJ3 。匹配,跳转

DEC DX

JZ GGG 。字符串2完,不匹配

LEA SI,STRING1 。重新从串1的第一个字符匹配

MOV CL,[SI+1]

MOV CH,0

INC DI

JMP ZJ2

MMM: MOV AH,09H 。输出匹配信息

MOV DX,OFFSET MESS1

INT 21H

JMP PPP

GGG: MOV AH,09H 。输出不匹配信息

MOV DX,OFFSET MESS2

INT 21H

PPP: MOV AX,4C00H 。程序终止

INT 21H

CODE ENDS

END START

实验六从键盘输入数据并显示

一、实验要求:编写程序,将键盘接收到的四位十六进制数转换为等值的二进制数,

再显示在屏幕上。若输入的不是0-F间的数字,则显示出错信息,并

要求重新输入。dvzfvkwMI1

二、实验目的:掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII

码的原理,并在程序中设置错误出口。rqyn14ZNXI

三、实验程序框图:

四、实验程序:

CRLF MACRO

MOV AH,02H

MOV DL,0DH

INT 21H

MOV AH,02H

MOV DL,0AH

INT 21H

ENDM

DATA SEGMENT

MARK DB ?

MESS DB '输入四位十六进制数,按回车键转化为二进制数,空格键结

束!',0DH,0AH,'输入:$'EmxvxOtOco

ERROR DB 0DH,0AH, '输入错误!',0DH,0AH,'$'

DATA ENDS

STACK SEGMENT

STA DW 32 DUP(?>

TOP DW ?

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV SP,TOP

HEAD: CRLF

MOV MARK,0

MOV AH,09H

LEA DX,MESS

INT 21H 。显示提示输入的信息

CALL GETNUM 。接收键入数值送DX

CMP MARK,01H

JE HEAD

MOV CX,0010H 。16位

MOV BX,DX

TTT: ROL BX,1 。循环左移1位

MOV DL,BL

AND DL,01H 。屏蔽掉高7位

ADD DL,30H

MOV AH,02H

INT 21H 。显示二进制位对应的ASCII字符

LOOP TTT

JMP HEAD

FINI: MOV AX,4C00H

INT 21H 。返回DOS

GETNUM PROC NEAR 。子程序,接收键入数值送DX

PUSH CX

XOR DX,DX

GGG: MOV AH,01H

INT 21H

CMP AL,0DH 。输入为回车,则进行转换

JE PPP

CMP AL,20H 。输入为空格,则退回DOS

JE FINI

CMP AL,30H

JB KKK

SUB AL,30H

CMP AL,0AH

JB GETS

CMP AL,11H

JB KKK

SUB AL,07H

CMP AL,0FH

JBE GETS

CMP AL,2AH

JB KKK

CMP AL,2FH

JA KKK

SUB AL,20H

GETS: MOV CL,04

SHL DX,CL

XOR AH,AH

ADD DX,AX

JMP GGG

KKK: MOV AH,09H

MOV DX,OFFSET ERROR

INT 21H

MOV MARK,01H

PPP: PUSH DX

CRLF

POP DX

POP CX

RET

GETNUM ENDP

CODE ENDS

END START

实验七字符和数据的显示程序

一、实验要求:显示信息“输入字符串,回车或空格结束”,空格或回车后显示输入

字符串总字符数,数字字符<1-9)及非数字字符数。SixE2yXPq5

二、实验目的:掌握字符和数据的显示方法。

三、实验程序框图:

四、实验程序:

CRLF MACRO

MOV AH,02H

MOV DL,0DH

INT 21H

MOV AH,02H

MOV DL,0AH

INT 21H

ENDM

DATA SEGMENT

MESS1 DB 'input string,the end flag is $'

MESS2 DB 'int= $'

MESS3 DB 'nm= $'

MESS4 DB 'm= $'

TOTAL DW ?

DATA ENDS

STACK SEGMENT

STA DW 32 DUP (?>

TOP DW ?

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV SP,TOP 。初始化

MOV BX,0000H 。计数值清0

MOV AH,09H

MOV DX,OFFSET MESS1

INT 21H

CRLF

XXX: MOV AH,01H

INT 21H 。接收键入字符 CMP AL,20H

JZ UUU 。是空格键则转UUU

CMP AL,0DH

JNZ III

CRLF 。是回车键则转UUU

JMP UUU

III: CMP AL,30H

JB YYY

CMP AL,39H

JBE VVV 。`0-9`转VVV

YYY: INC BX 。计数值加1

VVV: INC TOTAL

JMP XXX

UUU: CRLF

MOV AH,09H

LEA DX,MESS2 。显示字符总数

INT 21H

MOV AX,TOTAL

CALL DISP

MOV AH,02H

MOV DL,'H'

INT 21H

CRLF 。回车换行

MOV AH,09H

MOV DX,OFFSET MESS3

INT 21H 。显示非数字字符总数

MOV AX,BX

CALL DISP

MOV AH,02H

MOV DL,'H'

INT 21H 。十六进制数标志

CRLF

MOV AH,09H

LEA DX,MESS4 。显示数字字符总数

INT 21H

MOV AX,BX

SUB TOTAL,AX

MOV AX,TOTAL

CALL DISP

MOV AH,02H

MOV DL,'H'

INT 21H

MOV AX,4C00H

INT 21H

DISPP PROC NEAR 。显示子程序,显示AL中的数按十六进制数方式MOV BL,AL 。AL中数送BL

KKK: MOV DL,BL

MOV CL,04

ROL DL,CL

AND DL,0FH

CALL DISPL 。显示字节高位

MOV DL,BL

AND DL,0FH

CALL DISPL 。显示字节低位

RET

DISPP ENDP

DISPL PROC NEAR

ADD DL,30H 。由数值转为参应字符的ASCII码

CMP DL,3AH

JB DDD 。是0-9转DDD

ADD DL,27H 。是A-F

DDD: MOV AH,02H

INT 21H 。显示DL中字符

RET 。返回

DISPL ENDP 。显示子程序,显示AX中的数按十六进制数方式DISP PROC NEAR

PUSH BX

PUSH CX

PUSH DX

PUSH AX 。入栈保存

MOV AL,AH

CALL DISPP 。显示高字节

POP AX

CALL DISPP

POP DX

POP CX

POP BX

RET 。出栈

DISP ENDP

CODE ENDS

END START

实验八响铃程序

一、实验要求:从键盘按收输入字符,如是数字N,则响铃N次,如不是数字或数字是0,则不响。

二、实验目的:掌握响铃符的使用方法。

三、实验程序框图:

相关文档