指令设计
计算机组成原理课程设计
1、完成以下9条指令的设计:
- LDI Rd,#data,
- LDA Rd,adr,
- STA @adr,Rs,
- LDR Rd,@Rs,
- ADD Rd,Rs,
- XOR Rd,Rs,
- JMP adr,
- JZ adr,
- HALT
2.指令设计
序号 | 指令助记符 | 功能介绍 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 地址 |
1 | LDI Rd,#data | 立即数寻址(双字节指令16位) | 立即数传输 Rdß#data | 0001 | LDI R0 ,48H | 0001 00 00 0100 1000 | 00 01 | 00B22000 | 01H |
2 | LDA Rd,adr | 直接寻址(取数) | R1 <-[adr] | 0010 | LDA R1 ,[01H] | 0010 01 00 0000 0001 | 02 03 | 00B02020 00122000 | 02H 20H |
3 | STA @adr,Rs | 间接寻址(存数,将Rs中的内容给[adr]地址) | R0-> [adr] | 0011 | STA [0FH] ,R0 | 0011 00 00 0000 1111 | 04 05 | 00B02021 1F102022 1F011000 | 03H 21H 22H |
4 | LDR Rd,@Rs | 寄存器间接寻址(将RS地址中的数据存到Rs中) | Rd <-[Rs] | 0100 | LDR R1,[R0] | 0100 01 00 | 06 | 1A001023 00122000 | 04H 23H |
5 | ADD Rd,Rs | 寄存器寻址(计算RD和RS的值结果放到Rd中) | Rd <-Rd+Rs | 0101 | ADD R1<-R1+R0 | 0101 01 00 | 07 | 89021000 | 05H |
6 | XOR Rd,Rs | 寄存器间接寻址(异或指令) | Rd<-Rd异或Rs | 0110 | XOR R0<-R0+R1 | 0110 00 01 | 08 | 16021000 | 06H |
7 | JMP adr | 无条件跳转 | PC<-adr | 0111 | JMP PC<-adr | 0111 0000 0000 1101 | 09 10 | 00F02000 | 07H |
8 | HALT | 停机 | 1111 | 11110000 | 11 | 00040000 | 0FH | ||
9 | HALT | 停机 | 1111 | 11110000 | 12 | 00040000 | 0FH | ||
10 | LDI Rd,#data | 立即数寻址(双字节指令16位) | 立即数传输 Rdß#data | 0001 | LDI R1 , | 0001 01 00 11100010 | 13 14 | 00B22000 | 01H |
11 | ADD Rd,Rs | 寄存器寻址(计算RD和RS的值结果放到Rd中) | Rd <-Rd+Rs | 0101 | ADD R1<-R1+R0 | 0101 01 00 | 15 | 89021000 | 05H |
12 | JZ adr | 条件转移指令(结果为0的转移) | If ZF=1,PC<-adr | 1000 | 为0跳转到停机的位置 | 1000 0000 00010011 | 16 17 | 00902224 00E02000 00200000 | 08H 25H 24H |
13 | ADD Rd,Rs | 寄存器寻址(计算RD和RS的值结果放到Rd中) | Rd <-Rd+Rs | 0101 | ADD R1<-R1+R0 | 0101 01 00 | 18 | 89021000 | 05H |
14 | HALT | 停机 | 1111 | 11110000 | 19 | 00040000 | 0FH |
3.每条指令的微指令和仿真图
1. LDI Rd,#data
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
1 | LDI Rd,#data | 立即数寻址(双字节指令16位) | 立即数传输 Rdß#data | 0001 | LDI R0 ,48H | 0001 00 00 0100 1000 | 00 01 | 取指令:00B82080 执行指令:00B22000 立即数送R0 | 00H 01H |
通过测试的将48H放到R0寄存器。
2. LDA Rd,adr
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
2 | LDA Rd,adr | 直接寻址(取数) | R1 <-[adr] | 0010 | LDA R1 ,[01H] | 0010 01 00 0000 0001 | 02 03 | 取指令:00B82080 取adr送bus:00B02020 取adr中的内容给R1:00122000 | 00H 02H 20H |
直接寻址,将adr地址对应的内容送到R1寄存器中。通过测试的将[01H]= 48H放到R1寄存器。
3.立即数寻址
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
3 | STA @adr,Rs | 间接寻址(存数,将Rs中的内容给[adr]地址) | R0-> [adr] | 0011 | STA [0FH] ,R0 | 0011 00 00 0000 1111 | 04 05 | 取指令:00B82080 取[adr]:00B02021 取R0的值:1F102022 将R0的值写到[adr]:1F011000 | 00H 03H 21H 22H |
间接寻址,将adr地址内的内容做有效地址。将R0中的内容存到[adr]对应的地址中。
需要更正一下:是将adr取出来送BUS,然后才是adr存AR,取R0送BUS,最后把R0的值存到adr中
更正的截图
4. LDR Rd,@Rs
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
3 | LDR Rd,@Rs | 寄存器间接寻址(将RS地址中的数据存到Rs中) | Rd <-[Rs] | 0100 | LDR R1,[R0] | 0100 01 00 | 06 | 取指令:00B82080 R0中的内容到bus:1A001023 将[R0]地址内的内容取出来存到R1中:00122000 | 00H 04H 23H |
寄存器间接寻址,将Rs中的内容作为地址,从[Rs]地址中取数,将取出来的数存到Rd中。
测试的是将@R0中的内容给了R1。且[48H]=0E。
5. ADD Rd,Rs
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
3 | ADD Rd,Rs | 寄存器寻址(计算RD和RS的值结果放到Rd中) | Rd <-Rd+Rs | 0101 | ADD R1<-R1+R0 | 0101 01 00 | 07 | 取指令:00B82080 相加结果送R1:89021000 | 00H 05H |
将Rd和Rs相加的结果送Rd中。测试的是R0+R1结果送R1,实际上加的两个数是48H+0E=56H。
6. XOR Rd,Rs
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
3 | XOR Rd,Rs | 寄存器间接寻址(异或指令) | Rd<-Rd异或Rs | 0110 | XOR R0<-R0异或R1 | 0110 00 01 | 08 | 取指令:00B82080 异或结果送R1:16021000 | 00H 06H |
将Rd和Rs异或的结果送Rd中。测试的是R0异或R1结果送R0,实际上加的两个数是48H异或56H=1E。
7. JMP adr
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
7 | JMP adr | 无条件跳转 | PC<-adr | 0111 | JMP PC<-adr | 0111 0000 0000 1101 | 09 10 | 取指令:00B82080 取出Adr给Pc:00F02000 | 00H 07H |
8 | HALT | 停机 | 1111 | 11110000 | 11 | 取指令:00B82080 停机:00040000 | 00H 0F | ||
9 | HALT | 停机 | 1111 | 11110000 | 12 | 取指令:00B82080 停机:00040000 | 00H 0F | ||
10 | LDI Rd,#data | 立即数寻址(双字节指令16位) | 立即数传输 Rdß#data | 0001 | LDI R1 ,E2 | 0001 01 00 11100010 | 13 14 | 取指令:00B82080 执行指令:00B22000 立即数送R1 | 00H 01H |
通过一个JUMP指令跳转到指定的位置,按照正常的执行顺序的话下一个指令的地址应该就是11H,执行到11H就会停机,而现在通过跳转直接跳转到0000 1101=13H地址处去执行LDI指令。
下图是JMP的执行过程:
执行JMP后的LDI过程:为下面的JZ做铺垫的!
8. JZ adr
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
11 | JZ adr | 条件转移指令(结果为0的转移) | If ZF=1,PC<-adr | 1000 | 为0跳转到停机的位置
| 1000 0000 00010011 | 16 17 | 取指令:00B82080 取出Adr给Pc:00902224 adr->PC:00E02000 | 00H 08H 25H 24H |
12 | ADD Rd,Rs | 寄存器寻址(计算RD和RS的值结果放到Rd中) | Rd <-Rd+Rs | 0101 | ADD R1<-R1+R0 | 0101 01 00 | 18 | 取指令:00B82080 相加结果送R1:89021000 | 00H 05H |
13 | HALT | 停机 | 1111 | 11110000 | 19 | 取指令:00B82080 停机:00040000 | 00H 0F |
当ZF=1的时候就是结果为0的标志,测试JZ adr的时候用的是ADD R1,R0的结果,上面算出来为0。当不是0的时候就正常的PC+1,否则就是跳转到指定的位置。比如我写的这个ZF=1的时候直接跳转到停机的位置(第一张图),不是0的时候就正常往下执行(第2张图)。
第1张图:ZF=1。
第二张图:我通过修改第序号等于10的那一步R1的值[对应的地址是0EH,由E2H改为E3H]。从而使得ZF=0。
9. HALT
序号 | 指令助记符 | 功能 | 实现的功能 | 操作码 | 指令举例 | 二进制机器代码 | 地址 | 微指令 | 微指令地址 |
13 | HALT | 停机 | 1111 | 11110000 | 19 | 取指令:00B82080 执行指令:00B22000 立即数送R1 | 00H 01H |
当执行HALT指令时机器就会停止运行。
10.完整的仿真图