汇编语言 存储器系统设计 源代码(注释详细)

创作日志

本学期的计算机原理与汇编语言课程设计题目之一,网上几乎搜不到,大家可以参考一下。想要课程设计报告的可以私我,里面有系统描述、功能模块结构、主要模块的算法说明、运行结果及分析、问题及解决办法和心得体会,比较详细。

目录

 一、系统介绍

 二、源代码

三、运行结果


 一、系统介绍

                      ①  实现了大小为 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个字符,多出的不会存进去

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值