存器。 左移门L 直通门D 右移门R 用来实现相应数据左移一位的运算,并能够控制该运算后的结果是否输出到数据总线。 用来控制ALU的执行结果是否输出到数据总线。 用来实现相应数据右移一位的运算,并能够控制该运算后的结果是否输出到数据总线。 控制程序按顺序正常执行;当执行转移指令时,从数据线接收要跳转的地址,使程序能够按需要自动执行。当要从EM中读取数据时,由PC提供地址。 存储指令代码和数据。 向微程序存储器μM提供相应微指令的地址。 程序计数器PC 存储器EM 微程序计数器μPC 微程序存储器μM 存储微程序。 堆栈ST 当存储于累加器A的值将要受到破坏时,将其数据保存在堆栈ST中,使程序能够正常地执行。 4.在COP2000集成开发环境下设计全新的指令/微指令系统
设计结果如表所示(可按需要增删表项),在这里我需要说明一下,因为刚开始做的是4位的乘法,导致后来修改为8位乘法时,又添加了好多指令。在声明一个地方,就是关于加法的一条指令AD A,R?这条指令算是系统指令,本来是能够避免的,但是考虑到程序的复杂程度,所以就用了一下,改了一个名字。 (1) 新的指令集
(设计两个不同指令集要分别列表) 助记符 机器码1 机器码2 II 指令说明 实验机占用,不可修改。复位后,所有寄存器清0,首先执行 _FATCH_ 指令取指。 将累加器A中的数加入到寄存器R?中,并影响标志位。 将立即数II加入到寄存器R?中,并影响标志位。 从寄存器R?中减去累加器A中的数,并影响标志位。 _FATCH_ 000000xx ADD R?,A ADD R?,#II SUB R?,A SUB R?,#II TEST R?,#II PUSH A POP A MOV A,R? MOV R?,#II SHL R? 000001xx 000010xx 000011xx 000100xx 000101xx 000110xx 000111xx 001000xx 001001xx 001010xx II II II 从寄存器R?中减去立即数II,并影响标志位。 寄存器R? “与” 立即数II,只改变标志位,并不改变R?中的数值。 将累加器A中的数据压入堆栈寄存器ST。 将堆栈寄存器ST中的数据弹出到累加器A中。 将寄存器R?中的数放入累加器A中。 将立即数II存放到寄存器R?中。 寄存器R?中的数不带进位向左移一位,并不影响标志位。 SHR R? JC MM JZ MM GOTO MM ENDP ADC A,#II SLL R? SL R? AD A,R?
001100xx 001101xx 001110xx 001111xx 010000xx 010001xx 010010xx 010011xx MM MM MM II 001011xx 寄存器R?中的数不带进位向右移一位,并不影响标志位。 若进位标志位置1,跳转到MM地址。 若零标志位置1,跳转到MM地址。 跳转到MM地址。 程序结束。 带进位的加法运算 带进位的左移运算 带进位的左移运算 不带进位的加法运算 (2) 新的微指令集 助记符 状态 微地址 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 微程序 CBFFFF FFFFFF FFFFFF FFFFFF FFF7EF FFFA98 CBFFFF FFFFFF FFF7F7 C7FFEF FFFA98 CBFFFF FFFF8F FFF7F7 FFFA99 CBFFFF 数据输出 寄存器值R? ALU直通 寄存器值R? 存贮器值EM ALU直通 ALU直通 寄存器值R? ALU直通 数据打入 指令寄存器IR 寄存器W 地址输出 运算器 移位控制 ?PC PC输出 A输出 A输出 A输出 A输出 A输出 PC _FATCH_ T0 写入 +1 +1 +1 +1 +1 +1 ADD R?,A T2 ADD R?,#II T1 T0 T3 T2 T1 T0 寄存器R? 标志位C,Z 指令寄存器IR 寄存器A 寄存器W PC输出 PC输出 加运算 A输出 A输出 A输出 A输出 写入 +1 +1 +1 +1 +1 +1 寄存器R? 标志位C,Z 指令寄存器IR 寄存器W 寄存器A PC输出 加运算 A输出 A输出 A输出 写入 +1 +1 +1 +1 SUB R?,A T3 T2 T1 T0 寄存器R? 标志位C,Z 指令寄存PC输出 减运算 A输出 写入 +1 器IR SUB R?,#II TEST R?,#II PUSH A POP A T3 T2 T1 T0 T3 T2 T1 T0 T1 T0 T1 T0 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 FFF7F7 C7FFEF FFFA99 CBFFFF C7FFFF FFF7F7 FFFE93 CBFFFF FFEF9F CBFFFF FFFFFF FFFFFF FFFF57 CBFFFF FFFFFF FFFFFF FFF7F7 CBFFFF FFFFFF FFFFFF C7FBFF CBFFFF FFFFFF FFFFFF FFF7F7 寄存器值R? 存贮器值EM ALU直通 存贮器值EM 寄存器值R? ALU直通 ALU直通 堆栈寄存器ST 寄存器值R? 存贮器值EM 寄存器值R? 寄存器A 寄存器W PC输出 A输出 A输出 +1 +1 +1 +1 寄存器R? 标志位C,Z 指令寄存器IR 寄存器W 寄存器A PC输出 PC输出 减运算 A输出 A输出 A输出 写入 +1 +1 +1 +1 +1 寄存器R? 标志位C,Z 指令寄存器IR 堆栈寄存器ST 指令寄存器IR 寄存器A 指令寄存器IR 寄存器A 指令寄存器IR PC输出 PC输出 PC输出 PC输出 与运算 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 写入 +1 +1 写入 +1 +1 +1 +1 写入 +1 +1 +1 +1 MOV A,R? T1 MOV R?,#II SHL R? T0 T1 T0 T2 写入 +1 +1 +1 寄存器R? PC输出 指令寄存器IR 寄存器A PC输出 写入 +1 +1 +1 +1 SHR R? JC MM JZ MM T1 T0 T2 T1 T0 T1 T0 T1 T0 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 FFF9DF CBFFFF FFFFFF FFF7F7 FFF9BF CBFFFF FFFFFF C6FFFF CBFFFF FFFFFF FFFFFF C6FFFF CBFFFF FFFFFF FFFFFF C6FFFF CBFFFF FFFFFF FFFFFF CBFFFF FFFFFF FFFFFF FFFFFF C7FFEF FFFE94 CBFFFF FFFFFF FFF7EF FFFBDF ALU左移 寄存器值R? ALU右移 存贮器值EM 存贮器值EM 存贮器值EM 存贮器值EM ALU直通 寄存器值R? ALU左移 寄存器R? 指令寄存器IR 寄存器A PC输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 A输出 左移 右移 +1 写入 +1 +1 +1 +1 寄存器R? 指令寄存器IR 寄存器PC 指令寄存器IR 寄存器PC 指令寄存器IR 寄存器PC 指令寄存器IR 指令寄存器IR 寄存器W PC输出 PC输出 PC输出 PC输出 PC输出 PC输出 PC输出 PC输出 PC输出 写入 +1 +1 +1 写入 写入 +1 +1 +1 +1 写入 写入 +1 +1 +1 +1 写入 GOTO MM T1 ENDP ADC A,#II SLL R? T0 T0 T2 T1 T0 T2 T1 写入 +1 +1 +1 写入 +1 +1 +1 +1 +1 +1 +1 寄存器A, 标志位C,Z 指令寄存器IR 寄存器A 寄存器R? PC输出 带进位 加运算 A输出 A输出 A输出 带进位左写入 +1 +1 +1 移 SL R? AD A,R?
5.用设计完成的新指令集编写实现无符号二进制乘法、除法功能的汇编语言程序 (1)乘法
8位乘法的汇编语言程序与算法流程图:
MOV R0,#8AH ;初始化被乘数8AH MOV R1,#16H ;初始化乘数16H MOV R2,#00H ;初始化部分积 MOV R3,#00H ;初始化部分积 MOV A,R2 ;把R2送入A寄存器 PUSH A ;暂存起来 LOOP : TEST R1,#FFH ;测试乘数是否为0 JZ LAST ;是0跳转,程序结束
TEST R1,#01H ;测试乘数末位是否为0
T0 T2 T1 T0 T2 T1 T0 46 47 48 49 4A 4B 4C 4D 4E 4F CBFFFF FFFFFF FFF7F7 FFFADF CBFFFF FFFFFF FFF7EF FFFE90 CBFFFF FFFFFF 寄存器值R? ALU左移 寄存器值R? ALU直通 指令寄存器IR 指令寄存器IR 寄存器A 寄存器R? 指令寄存器IR 寄存器W PC输出 PC输出 A输出 A输出 A输出 A输出 A输出 带进位左移 写入 +1 +1 +1 写入 +1 +1 +1 寄存器A, 标志位C,Z PC输出 加运算 A输出 写入 +1 JZ NEXT ;是0跳转,不用加被乘数 MOV A,R0 ;被乘数送累加器 ADD R3,A ;被乘数加到部分积
POP A ;弹出保存的结果