创作日志
本学期的计算机原理与汇编语言课程设计题目之一,网上几乎搜不到,大家可以参考一下。想要课程设计报告的可以私我,里面有系统描述、功能模块结构、主要模块的算法说明、运行结果及分析、问题及解决办法和心得体会,比较详细。
目录
一、系统介绍
二、源代码
三、运行结果
① 实现了大小为 8 Byte 的存储系统
② 芯片连接采用字拓展的方式
③ 所有芯片均为RAM,可读可写,容量为2×8(即2 Byte)
④ CPU的数据线与芯片的数据线相连
⑤ CPU的WE端控制读写,WE=0是写,WE=1是读
⑥ 片选线在经过译码之后控制四个芯片的片选
⑦ 将选中的数据打印在屏幕上,来模拟CPU的数据接收
⑧ 输入三位地址线的数据,来模拟CPU向存储系统传输地址
内存较小的话演示起来很方便,可以体现存入不同芯片的效果
如果自己设计一个内存更大的存储器,那增加地址线就好咯
DATAS SEGMENT
;此处输入数据段代码
;************ CPU的模拟 *************
WE DB 0 ; 读写命令端:WE=0:写;WE=1:读
ADDRESS DB 8 ;预定义的空间,加一个回车
DB 0 ;待输入完成后,自动获得输入的字符个数
DB ? ;相当于地址线
;************ 存储器的模拟 *************
; 每个芯片的容量大小:2 个字节(2 * 8位)
CHIP_POINT DB 1 ; 芯片指针,指向当前允许存储数据的芯片(1/2/3/4)
POINT_IN DW 0 ; 片内指针,指向下一个能够存储的地址(0/1)
;..............芯片1..............
MEMO_1 DB 2 DUP(?)
;..............芯片2..............
MEMO_2 DB 2 DUP(?)
;..............芯片3..............
MEMO_3 DB 2 DUP(?)
;..............芯片4..............
MEMO_4 DB 2 DUP(?)
;************ 2:4 译码器 的模拟 *************
; A1 A2 = 00 : 选中芯片1
; A1 A2 = 01 : 选中芯片2
; A1 A2 = 10 : 选中芯片3
; A1 A2 = 11 : 选中芯片4
;************ 其他信息 *************
CRLF DB 0DH, 0AH,'$'
TIP_1 DB 0DH,0AH ;回车换行
DB 0DH,0AH ;回车换行
DB "--> Write or read memory ? ( 0:write | 1:read | 2:exit ) : $"
; 存储数据 还是 读取数据?
;............... 写过程 ................
FLAG DB 0 ; 用户输入是否正确的标志
ERROR_1 DB 0DH,0AH
DB "--> Please input 0 or 1 ! $" ; 请输入0或1!
TIP_2 DB 0DH,0AH ;回车换行
DB 0DH,0AH ;回车换行
DB "--> The message you want to storage (<=4 Byte) : $"
MESSAGE DB 5 ;预定义6字节的空间
DB ? ;待输入完成后,自动获得输入的字符个数
DB 4 DUP(0) ; 用户输入的信息
ERROR_2 DB 0DH,0AH
DB "--> Memory full! $" ; 内存满了!
;............... 读过程 ................
TIP_3 DB 0DH,0AH ;回车换行
DB 0DH,0AH ;回车换行
DB "--> CPU address (eg.011) : $"
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
USER_BEGIN:
PUSH DS
SUB AX,AX
PUSH AX
; 1.显示提示信息
MOV DX,OFFSET TIP_1
MOV AH,09H
INT 21H
; 2.等待用户输入
MOV AH,01H
INT 21H
; 3.给WE赋值
CMP AL,30H ;是写(0)吗?
CALL MAKE_WRITE
CMP AL,31H ;是读(1)吗?
CALL MAKE_READ
CMP AL,32H ;是结束(2)吗?
JZ FUNC_END
; 如果用户输入0或1,那么FLAG=1
CMP FLAG,1
JZ FUNC ; 那么开始运行相应功能
; 如果不是读也不是写,那么此时FLAG一定还为0
;ZF=0: 输出错误信息,并且跳转到程序起始位置
MOV DX,OFFSET ERROR_1
MOV AH,09H
INT 21H
JMP USER_BEGIN ; 程序重启
FUNC:
CMP WE,0 ; 是写吗?
JNZ READ ; 不是写,那就跳到读
WRITE:
CALL WRITE_PROC
JMP USER_BEGIN ; 程序重启
READ:
CALL READ_PROC
JMP USER_BEGIN ; 程序重启
; 手动结束程序
FUNC_END:
MOV AH,4CH
INT 21H
;************ 写——重置读写命令端--MAKE_WRITE *************
;不是写的话,就什么都不做,是的话,置 0
MAKE_WRITE PROC NEAR
JNZ RETURN
MOV WE,0
MOV FLAG,1 ;标志置1
RETURN: RET
MAKE_WRITE ENDP
;************ 读——重置读写命令端--MAKE_READ *************
;不是读的话,就什么都不做,是的话,置 1
MAKE_READ PROC NEAR
JNZ RETURN
MOV WE,1
MOV FLAG,1 ;标志置1
RETURN: RET
MAKE_READ ENDP
;************ WRITE *************
WRITE_PROC PROC NEAR
MOV DX,OFFSET TIP_2 ; 提示信息
MOV AH,09H
INT 21H
LEA DX,CRLF ; 回车换行
MOV AH,09H
INT 21H
LEA DX,MESSAGE ; 用户输入数据
MOV AH,0AH
INT 21H
;接下来写入数据
MOV CL,MESSAGE+1 ; 字符串长度
MOV CH,0
MOV AL,MESSAGE+1 ; 用作MESSAGE的下标索引
MOV AH,0
INC AX
;--------------------------- LOOP ----------------------------------
WRITE_LOOP:
MOV SI,AX
; 逐个写入数据
STORE_1:
CMP CHIP_POINT,1 ; 查看指针指向哪个芯片?
JNZ STORE_2 ; 不是1,跳转至2
; 是1的话
MOV DL,MESSAGE[SI] ; 将这个Byte的信息存到DL中,此时SI=AX
MOV SI,POINT_IN ; 片内地址,此时SI=POINT_IN
MOV MEMO_1[SI],DL ; 再将信息存到内存中
JMP CONTINUE
STORE_2:
CMP CHIP_POINT,2
JNZ STORE_3
MOV DL,MESSAGE[SI]
MOV SI,POINT_IN
MOV MEMO_2[SI],DL
JMP CONTINUE
STORE_3:
CMP CHIP_POINT,3
JNZ STORE_4
MOV DL,MESSAGE[SI]
MOV SI,POINT_IN
MOV MEMO_3[SI],DL
JMP CONTINUE
STORE_4:
CMP CHIP_POINT,4
CALL THE_END ; 不是4的话,一种是因为内存不够,此时CHIP=5,或者是字符串结束了
; 是4,继续存
MOV DL,MESSAGE[SI]
MOV SI,POINT_IN
MOV MEMO_4[SI],DL
CONTINUE:
DEC AX
CALL LOCATE_PROC
LOOP WRITE_LOOP
RET
WRITE_PROC ENDP
THE_END PROC NEAR
JUDGE:
CMP CHIP_POINT,5
JZ OVERFLOW ; 5:内存满了,输出提示,结束
JMP EXIT ; 其他:结束
OVERFLOW:
LEA DX,ERROR_2
MOV AH,09H
INT 21H
LEA DX,CRLF
MOV AH,09H
INT 21H
EXIT:
RET
THE_END ENDP
LOCATE_PROC PROC NEAR
; 确定下一个存储的位置
; 比如当前位置为第一个芯片的第二个存储区 前面已经填上数据了
; 所以下一个数据要填到第二个芯片的第一个存储区
CMP POINT_IN,0 ; 内部指针为0 的话,就+1
JNZ CONDITION1 ; 1 的话,换下一个芯片:CHIP_POINT++
INC POINT_IN
JMP EXIT
CONDITION1:
INC CHIP_POINT ; 指向下一个芯片
MOV POINT_IN,0 ; 内部指针指0
EXIT:
RET
LOCATE_PROC ENDP
;************ READ *************
READ_PROC PROC NEAR
; 1.显示提示信息
MOV DX,OFFSET TIP_3
MOV AH,09H
INT 21H
; 2.输入CPU地址线
MOV DX,OFFSET ADDRESS
MOV AH,0AH
INT 21H
; 3.回车换行
LEA DX,CRLF
MOV AH,09H
INT 21H
; 4.将字符串地址转换为数字地址
MOV CL,ADDRESS+1 ;字符串长度
MOV CH,0
MOV AL,ADDRESS+1 ;字符串长度(3)
CBW
INC AX ;(4)
AGAIN:
MOV SI,AX
SUB ADDRESS[SI],30H
DEC AX
LOOP AGAIN
;---------------------------------------------
; 4.处理地址——由最低一位 A0 获取芯片内偏移地址 BX
GET_POINT:
MOV BL,ADDRESS[4]
MOV BH,00H
MOV SI,BX
; 5.处理地址——由 A1A2 进行片选 DL+DH分别表示A1,A2
MOV DH,ADDRESS[3]
MOV DL,ADDRESS[2]
;------------------------- 6.根据片选端进行片选---------------------
READ_1:
CMP DX,0000H
JNZ READ_2 ; 不是1,跳转至2
; 6.读取内容
MOV DL,MEMO_1[SI] ; 读取内容并显示
MOV AH,02H
INT 21H
JMP USER_BEGIN ; 程序重启
READ_2:
CMP DX,0100H
JNZ READ_3 ; 不是2,跳转至3
MOV DL,MEMO_2[SI]
MOV AH,02H
INT 21H
JMP USER_BEGIN ; 程序重启
READ_3:
CMP DX,0001H ; 0000 0001(1) -》输入100
JNZ READ_4 ; 不是3,跳转至4
MOV DL,MEMO_3[SI]
MOV AH,02H
INT 21H
JMP USER_BEGIN ; 程序重启
READ_4: ; 0000 0011(3) -》输入110
MOV DL,MEMO_4[SI]
MOV AH,02H
INT 21H
JMP USER_BEGIN ; 程序重启
RET
READ_PROC ENDP
CODES ENDS
END START
选项: 0 写入信息 1 读取信息 2 退出程序
因为整个内存不大,所以我设计每次写入的信息不能超过4个字符,多出的不会存进去