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

第一题:示例程序调试

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

实验内容:调试通过教材第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	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			;程序结束


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值