您的位置:首页 > 理论基础

计算机组成第一次上机作业

2014-03-17 23:31 411 查看
第一题:示例程序调试

实验目的:掌握汇编程序的基本结构

实验内容:调试通过教材第5章第137页的示例程序,并增加如下功能:

(1)    程序开始时,在屏幕上显示本人的姓名全拼和学号,格式如下:

NAME: Xiao Wanzi

ID:1202102910

(2)    程序结束时,在屏幕上显示“Good Bye!”

DATA SEGMENT							;数据段
NUM    DW 0011101000000111B			;3A07H
MYNAME DB 'NAME:Pei Mingyuan','$'	;姓名
MYID   DB 'ID:1200012896','$'		;学号
MYBYE  DB 'Good Bye!','$'			;结束语
NOTES  DB 'The result is:','$'
DATA ENDS
STACK SEGMENT STACK						;堆栈段
STA     DB 50 DUP(?)
TOP     EQU LENGTH STA
STACK ENDS
CODE SEGMENT							;代码段
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN:  MOV AX, DATA
MOV DS, AX			;为DS赋初值
MOV AX, STACK
MOV SS, AX			;为SS赋初值
MOV AX, TOP
MOV SP, AX			;为SP赋初值

MOV DX, OFFSET MYNAME
MOV AH, 09H			;显示字符串MYNAME
INT 21H				;DS:DX=串地址,'$'结束字符串

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

MOV DX, OFFSET MYID
MOV AH, 09H			;显示字符串MYID
INT 21H				;DS:DX=串地址,'$'结束字符串

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

MOV DX, OFFSET NOTES
MOV AH, 09H			;显示字符串NOTES
INT 21H				;DS:DX=串地址,'$'结束字符串

MOV BX, NUM			;将数装入BX
MOV CH, 4			;共4个十六进制数字
ROTATE:   MOV CL, 4			;CL为位移位数
ROL BX, CL
MOV AL, BL
AND AL, 0FH			;AL为1个十六进制数
ADD AL, 30h			;转化为ASCII码
CMP AL, '9'			;是0~9之间的数?
JL  DISPLAY
ADD AL, 07H			;在A~F之间
DISPLAY:  MOV DL, AL			; DL=输出字符(十六进制数)
MOV AH, 2
INT 21H				;调用DOS中断,显示字符
DEC CH
JNZ ROTATE

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

MOV DX, OFFSET MYBYE
MOV AH, 09H			;显示字符串MYBYE
INT 21H				;DS:DX=串地址,'$'结束字符串

MOV AX, 4C00H		;带返回码结束,AL=返回码
INT 21H
CODE ENDS
END BEGIN			;程序结束


第二题:用DOS功能调用实现简单输入输出

实验目的:掌握在PC机上利用DOS功能调用实现简单输入输出的方法。

实验内容:利用DOS功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:

(1)    如果输入的是字母(A~Z,不区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表

(2)    若输入的不是字母或数字,则在屏幕上输出字符“*”

(3)    每输入一个字符,即时转换并在屏幕上显示,需考虑显示结果的清晰美观

(4)    支持反复输入,直到按ESC键退出程序返回DOS命令行

(5)    程序结束时,在屏幕上显示本人的姓名全拼和学号

例:在键盘上输入“PKU2011/”,对应输出内容为“Papa Kilo Uniform two zeroone one *”

A

Alpha

N

November

1

one

B

Bravo

O

Oscar

2

two

C

Charlie

P

Papa

3

three

D

Delta

Q

Quebec

4

four

E

Echo

R

Romeo

5

five

F

Foxtrot

S

Sierra

6

six

G

Golf

T

Tango

7

seven

H

Hotel

U

Uniform

8

eight

I

India

V

Victor

9

nine

J

Juliet

W

Whisky

0

zero

K

Kilo

X

X-ray

 

 

L

Lima

Y

Yankee

 

 

M

Mike

Z

Zulu

 

 

DATA SEGMENT							;数据段
A	DB 'Alpha $'					;A~Z依次为大写字母A~Z和小写字母a~z对应的字符串
B	DB 'Bravo $'
C	DB 'Charlie $'
D	DB 'Delta $'
E	DB 'Echo $'
F	DB 'Foxtrot $'
G	DB 'Golf $'
H	DB 'Hotel $'
I	DB 'India $'
J	DB 'Juliet $'
K	DB 'Kilo $'
L	DB 'Lima $'
M
4000
DB 'Mike $'
N	DB 'November $'
O	DB 'Oscar $'
P	DB 'Papa $'
Q	DB 'Quebec $'
R	DB 'Romeo $'
S	DB 'Sierra $'
T	DB 'Tango $'
U	DB 'Uniform $'
V	DB 'Victor $'
W	DB 'Whisky $'
X	DB 'X-ray $'
Y	DB 'Yankee $'
Z	DB 'Zulu $'
NUM0	DB 'zero $'					;NUM0~NUM9依次为数字0~9对应的字符串
NUM1	DB 'one $'
NUM2	DB 'two $'
NUM3	DB 'three $'
NUM4	DB 'four $'
NUM5	DB 'five $'
NUM6	DB 'six $'
NUM7	DB 'seven $'
NUM8	DB 'eight $'
NUM9	DB 'nine $'
NAME_AND_ID	DB 'NAME:Pei Mingyuan; ID:1200012896.$'	;作者的姓名和学号
DATA ENDS
STACK SEGMENT STACK						;堆栈段
STA     DB 50 DUP(?)
TOP     EQU LENGTH STA
STACK ENDS
CODE SEGMENT							;代码段
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN:  MOV AX, DATA
MOV DS, AX			;为DS赋初值
MOV AX, STACK
MOV SS, AX			;为SS赋初值
MOV AX, TOP
MOV SP, AX			;为SP赋初值
ROTATE:	MOV AH, 07H			;每次从这里开始输入字符
INT 21H
CMP AL, 1BH			;若输入字符为esc,则退出
JNE	HANDLE			;否则进入字符转换流程
JMP	NEAR PTR STOP
HANDLE:	CMP	AL, 'z'			;若为小写字母,将其转化为大写字母,以节省工作量
JBE	HDL_
JMP	NEAR PTR OTHER
HDL_:	CMP	AL, 'a'
JB	C_D				;字符转化为大写字母之后,跳转到大写字母与数字处理流程
SUB	AL, 20H
C_D:	CMP	AL, 'A'
JAE	CAPITAL
JMP	NEAR PTR DIGIT	;若ASCII码小于A则直接跳转到数字处理流程
CAPITAL:CMP	AL, 'I'			;大写字母处理流程的开始,其中为方便跳转起见,将其以I、R为界分为3部分进行处理
JAE	CAP_I
CMP AL, 'A'
JE	PA
CMP AL, 'B'
JE	PB
CMP AL, 'C'
JE	PC
CMP AL, 'D'
JE	PD
CMP AL, 'E'
JE	PE
CMP AL, 'F'
JE	PF
CMP AL, 'G'
JE	PG
CMP AL, 'H'
JE	PH
PA:	MOV DX, OFFSET A	;对于不同的字母,输出相应的字符串,下同
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE	;处理完一个字符之后继续等待键盘输入,下同
PB:	MOV DX, OFFSET B
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PC:	MOV DX, OFFSET C
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PD:	MOV DX, OFFSET D
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PE:	MOV DX, OFFSET E
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PF:	MOV DX, OFFSET F
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PG:	MOV DX, OFFSET G
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PH:	MOV DX, OFFSET H
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
CAP_I:	CMP	AL, 'R'
JAE	CAP_R
CMP AL, 'I'
JE	PI
CMP AL, 'J'
JE	PJ
CMP AL, 'K'
JE	PK
CMP AL, 'L'
JE	PL
CMP AL, 'M'
JE	PM
CMP AL, 'N'
JE	PN
CMP AL, 'O'
JE	PO
CMP AL, 'P'
JE	PP
CMP AL, 'Q'
JE	PQ
PI:	MOV DX, OFFSET I
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PJ:	MOV DX, OFFSET J
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PK:	MOV DX, OFFSET K
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PL:	MOV DX, OFFSET L
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PM:	MOV DX, OFFSET M
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PN:	MOV DX, OFFSET N
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PO:	MOV DX, OFFSET O
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PP:	MOV DX, OFFSET P
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PQ:	MOV DX, OFFSET Q
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
CAP_R:	CMP AL, 'R'
JE	PR
CMP AL, 'S'
JE	PS
CMP AL, 'T'
JE	PT
CMP AL, 'U'
JE	PU
CMP AL, 'V'
JE	PV
CMP AL, 'W'
JE	PW
CMP AL, 'X'
JE	PX
CMP AL, 'Y'
JE	PY
CMP AL, 'Z'
JE	PZ
JMP	NEAR PTR OTHER	;若ASCII码大于A却不是大写字母,那一定是非字母数字符号
PR:	MOV DX, OFFSET R
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PS:	MOV DX, OFFSET S
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PT:	MOV DX, OFFSET T
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PU:	MOV DX, OFFSET U
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PV:	MOV DX, OFFSET V
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PW:	MOV DX, OFFSET W
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PX:	MOV DX, OFFSET X
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PY:	MOV DX, OFFSET Y
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
PZ:	MOV DX, OFFSET Z
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE	;大写字母流程完毕
DIGIT:	CMP AL, '0'			;数字处理流程开始
JE	P0
CMP AL, '1'
JE	P1
CMP AL, '2'
JE	P2
CMP AL, '3'
JE	P3
CMP AL, '4'
JE	P4
CMP AL, '5'
JE	P5
CMP AL, '6'
JE	P6
CMP AL, '7'
JE	P7
CMP AL, '8'
JE	P8
CMP AL, '9'
JE	P9
JMP	NEAR PTR OTHER	;剩下的都是非字母数字符号
P0:	MOV DX, OFFSET NUM0
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P1:	MOV DX, OFFSET NUM1
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P2:	MOV DX, OFFSET NUM2
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P3:	MOV DX, OFFSET NUM3
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P4:	MOV DX, OFFSET NUM4
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P5:	MOV DX, OFFSET NUM5
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P6:	MOV DX, OFFSET NUM6
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P7:	MOV DX, OFFSET NUM7
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P8:	MOV DX, OFFSET NUM8
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE
P9:	MOV DX, OFFSET NUM9
MOV AH, 09H
INT	21H
JMP	NEAR PTR ROTATE	;数字处理流程完毕
OTHER:	MOV DL, '*'			;非字母数字符号输出*即可
MOV AH, 02H
INT	21H
JMP	NEAR PTR ROTATE
STOP:	MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

MOV	DX, OFFSET NAME_AND_ID	;程序末尾输出我的姓名和学号
MOV	AH, 09H
INT 21H

MOV AX, 4C00H		;带返回码结束,AL=返回码
INT 21H
CODE ENDS
END BEGIN			;程序结束

第三题:字符串查找比较

实验目的:掌握串指令的基本功能及应用

实验内容:利用DOS功能调用从键盘输入一个字符串,然后输入单个字符,利用串扫描指令查找该字符串中是否有该字符。具体要求如下:

(1)    如果找到,则在屏幕上显示:

Success!!!Location: X

其中,X为该字符在字符串中第一次出现的位置

(2)    如果没找到,则在屏幕上显示:

Fail!!!

(3)    输入一个字符串后,可以反复输入希望查询的字符,直到按ESC键退出程序返回DOS命令行

(4)    程序结束时,在屏幕上显示本人的姓名全拼和学号

DATA SEGMENT							;数据段
BUFFER		DB	81					;用于接受从键盘输入的字符串的BUFFER数组,最长可接受81个字符
DB	0					;用于储存实际输入字符串的长度
STRING		DB	81	DUP(0)			;实际接收到的字符串
NAME_AND_ID	DB	'NAME:Pei Mingyuan; ID:1200012896.$'	;作者的姓名和学号
SUC			DB	'Success!!! Location: $'				;查找成功时输出的信息
FAI			DB	'Fail!!!$'								;查找失败时输出的信息
DATA ENDS
STACK SEGMENT STACK						;堆栈段
STA     DB 50 DUP(?)
TOP     EQU LENGTH STA
STACK ENDS
CODE SEGMENT							;数据段
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN:  MOV AX, DATA
MOV DS, AX			;为DS赋初值
MOV AX, DATA
MOV ES, AX			;为ES赋初值
MOV AX, STACK
MOV SS, AX			;为SS赋初值
MOV AX, TOP
MOV SP, AX			;为SP赋初值

MOV	DX, OFFSET BUFFER	;从键盘缓冲区接受字符串
MOV	AH, 0AH
INT	21H

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

ROTATE:	MOV AH, 07H			;轮询开始的地方
INT 21H
CMP AL, 1BH			;若字符为esc,则退出
JNE	HANDLE			;否则进入处理流程
JMP	NEAR PTR STOP
HANDLE:	MOV	DI, OFFSET STRING	;设置好源操作串
MOV	BX, OFFSET BUFFER
ADD	BX, 1H				;得到记录串长度的地址
CLD
MOV	CL,	BYTE PTR[BX];	;将串长度付给CX
MOV CH, 0
NEXT:	REPNE SCASB				;使用串操作指令进行寻找
JZ	FOUND				;若找到,则进入FOUND流程
NOTFOUND:	MOV	DX,	OFFSET FAI		;否则进入NOTFOUND流程
MOV AH,	09H				;输出FAI串
INT	21H

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

JMP	NEAR PTR ROTATE		;继续查找下一个字符
FOUND:	MOV	DX,	OFFSET SUC		;输出SUC串
MOV AH,	09H
INT	21H
MOV	DX,	[BX]			;根据现存的CX的值与串的长度,计算出该字符的位置
SUB	DX,	CX
ADD	DX,	30H				;将该位置转化为ASCII码,并输出
MOV	AH,	2H
INT 21H

MOV DL, 0DH			;输出回车
MOV AH, 2
INT 21H
MOV DL, 0AH			;输出换行
MOV AH, 2
INT 21H

JMP	NEAR PTR ROTATE		;继续查找下一个字符
STOP:	MOV	DX, OFFSET NAME_AND_ID	;程序末尾输出我的姓名和学号
MOV	AH, 09H
INT 21H

MOV AX, 4C00H		;带返回码结束,AL=返回码
INT 21H
CODE ENDS
END BEGIN			;程序结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算机 汇编 string dos