220 likes | 378 Views
例 : 一台简单计算机. 初步了解: 指令和指令系统 程序 / 指令的执行过程 汇编语言程序 数据通路. 8 位寄存器,用于存放被加 ( 减 ) 数和运算结果. 运算器. 完成 8 位加减法运算,被加 ( 减 ) 数是 A ,加 ( 减 ) 数是 M ,结果送累加器 A. 地址译码器. 存储器. ALU. 存储器容量为 32 个字节,地址码为 5 位. 控制器. 存放当前正在执行的指令和指令地址. +1. 例 : 一个简单的 8 位计算机. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
E N D
例: 一台简单计算机 • 初步了解: • 指令和指令系统 • 程序/指令的执行过程 • 汇编语言程序 • 数据通路
8位寄存器,用于存放被加(减)数和运算结果 运算器 完成8位加减法运算,被加(减)数是A,加(减)数是M,结果送累加器A 地址译码器 存储器 ALU 存储器容量为32个字节,地址码为5位 控制器 存放当前正在执行的指令和指令地址 +1 例: 一个简单的8位计算机 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 累加器A MUX 译码器 MUX 指令寄存器 指令计数器 读写寄存器M
7 6 5 4 3 2 1 0 操作码 存储器地址addr 指令格式与指令系统 指令格式: 指令系统: addr 表示内存地址 ; (addr)表示地址为addr的存储单元的内容 A 表示累加器 ; (A)表示累加器的内容
乘法程序 假设:(11)=被乘数; (12)=乘数; (13)=部分乘积; (14)=常数1; (15)=常数0
思想:用加法完成乘法运算 开始 A ← 0 保存部分乘积 13# ← A A← 12# 判断乘法是否结束 Y 重复执行n次 (A)=0? N HALT A ← (A)-1 乘数-1 12# ← A A ←13# 计算部分乘积 A← (A)+11# 算法流程 假设:(11)=被乘数 (12)=乘数n (13)=部分乘积 (14)=常数1(15)=常数0
8位数据线 5位地址线 控制线 地址译码器 ALU 被乘数 乘数 部分乘积 常数 常数 假设:(11)=被乘数7; (12)=乘数3 (13)=部分乘积 (14)=常数1(15)=常数0 乘法程序执行初态 LOAD15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 STORE 13 LOAD12 累加器 EQUAL15 程序代码区 HALT 算术逻辑部件 SUB 14 STORE12 LOAD13 ADD 11 JUMP1 控制命令 MUX 7 译码器 地址 3 MUX 数据 1 指令寄存器 指令计数器 0 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 0#指令LOAD的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:装入A ADD 11 JUMP1 MUX Step5:指令地址+1 7 3 MUX 1 LOAD 15 0 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 1#指令STORE的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:准备地址 运算器 STORE 12 LOAD 13 Step4:保存(A) ADD 11 JUMP1 MUX Step5:指令地址+1 7 3 MUX 0 1 STORE 13 1 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 2#指令LOAD的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 3 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:装入A ADD 11 JUMP1 MUX Step5:指令地址+1 7 3 MUX 0 1 LOAD 12 2 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +2 常数 3#指令EQUAL的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 3 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:进行比较 3 0 ADD 11 JUMP1 MUX Step5:不相等,指令地址+2 7 3 MUX 0 1 EQUAL 15 3 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 5#指令SUB的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 2 3 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:减法操作 3 1 ADD 11 JUMP1 MUX Step5:指令地址+1 7 3 MUX 0 1 SUB 14 5 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 6#指令STORE的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 2 累加器A Step2:指令译码 EQUAL15 HALT SUB 14 Step3:准备地址 运算器 STORE 12 LOAD 13 Step4:保存(A) ADD 11 JUMP 1 MUX Step5:指令地址+1 7 3 2 MUX 0 1 STORE 12 6 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 7#指令LOAD的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 0 2 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:装入A ADD 11 JUMP 1 MUX Step5:指令地址+1 7 2 MUX 0 1 LOAD 13 7 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 8#指令ADD的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 7 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:加法操作 0 7 ADD 11 JUMP 1 MUX Step5:指令地址+1 7 3 MUX 0 1 ADD 11 8 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 常数 9#指令JUMP的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 7 EQUAL15 Step2:指令译码 HALT SUB 14 运算器 Step3:修改指令地址 STORE 12 LOAD 13 ADD 11 JUMP1 MUX 7 3 MUX 0 1 JUMP 1 1 9 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 1#指令STORE的第2次执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 7 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:准备地址 运算器 STORE 12 LOAD 13 Step4:保存(A) ADD 11 JUMP1 MUX Step5:指令地址+1 7 2 MUX 7 0 1 STORE 13 1 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 常数 1#指令STORE的第3次执行后 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 STORE 13 LOAD 12 累加器A 14 EQUAL15 HALT SUB 14 运算器 STORE 12 LOAD 13 ADD 11 JUMP1 MUX 7 1 MUX 14 1 STORE 13 2 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 常数 1#指令STORE的第4次执行后 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 STORE 13 LOAD 12 累加器A 21 EQUAL15 HALT SUB 14 运算器 STORE 12 LOAD 13 ADD 11 JUMP1 MUX 7 0 MUX 21 1 STORE 13 2 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 2#指令LOAD的第4次执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 21 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:装入(A) ADD 11 JUMP1 MUX Step5:指令地址+1 7 0 MUX 21 1 LOAD 12 2 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 +1 常数 3#指令EQUAL的第4次执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 0 Step2:指令译码 EQUAL15 HALT SUB 14 Step3:取操作数 运算器 STORE 12 LOAD 13 Step4:比较操作 0 0 ADD 11 JUMP1 MUX Step5:相等,指令地址+1 7 0 MUX 21 1 EQUAL 15 3 0 指令寄存器 指令计数器 M
地址译码器 ALU 被乘数 译码器 乘数 部分乘积 常数 常数 4#指令HALT的执行 LOAD 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Step1:取指令 STORE 13 LOAD 12 累加器A 0 Step2:指令译码 EQUAL15 HALT Step3:停止 SUB 14 运算器 STORE 12 LOAD 13 乘法程序执行完毕,13#存储单元中是计算结果 ADD 11 JUMP1 MUX 7 0 MUX 21 1 HALT 0 4 0 指令寄存器 指令计数器 M
复 习 思 考 题 • 什么情况下结果不正确,为什么? • 如何加快乘法的速度? • 如果是带符号整数,算法应如何修正? • 编制一个能完成整数除法运算的汇编程序。