上一次把 RAM 控制單元 ALU 時(shí)鐘結(jié)合在一起,做了簡化版的CPU虱肄。
給CPU 加指令運(yùn)行致板。
CPU 之所以強(qiáng)大是因?yàn)樗强删幊痰模瑢懭氩煌闹噶顖?zhí)行不同的任務(wù)咏窿。
CPU 是硬件 可以被軟件控制斟或。
上次的RAM 沒地地址存8位,前4位是操作碼集嵌,后四位是內(nèi)存地址萝挤,或寄存器。
地址換成指令方便理解:
- Load A 14 把3 放入寄存器A
- Load B 15 把14放入寄存器B
- ADD A B 把寄存器A 寄存器B 相加根欧,但順序很重要怜珍,因?yàn)榻Y(jié)果要4存入第二個寄存器中。
- store a 13 把寄存器A存如 RAM 13
4個指令也只能做這個了
新加指令:
Sub :兩個指令相減
JUMP :讓程序跳轉(zhuǎn)新位置凤粗,可以改變指令順序或跳過指令
jump 0 跳回開頭酥泛,底層實(shí)現(xiàn)方式是把指令后4位代表的內(nèi)存地址的值。覆蓋掉指令地址寄存器的值嫌拣。JUMP _ NEGATIVE : 特別版的jump
在ALU 的負(fù)數(shù)標(biāo)志 為真時(shí)進(jìn)線JUMP
算數(shù)標(biāo)志為負(fù)數(shù)才是真柔袁,結(jié)果不是負(fù)數(shù),負(fù)數(shù)標(biāo)志為假异逐。
如果是假捶索, JUMP _ NEGATIVE 不會執(zhí)行,程序繼續(xù)灰瞻。
- 停止 指令 HALT
計(jì)算機(jī)需要知道什么時(shí)候該停下來腥例。
指令和數(shù)據(jù)都是存才同一個內(nèi)存里面的
他們在根本層面上沒有區(qū)別辅甥,都是二進(jìn)制數(shù)。
HALT 能區(qū)分指令或是數(shù)據(jù)
使用JUMP 燎竖,從CPU視角走一遍程序
把Load A 14 的1 存如寄存器A
把Load B 15中的1 存入寄存器B
然后Add 把寄存器B和A相加璃弄,結(jié)果放到寄存器A里面,里面是2 底瓣,就是 0010
把 寄存器A的值存入內(nèi)存地址 13 值是 2 谢揪,0010
JUMP 2 ,把指令寄存器的值(現(xiàn)在是4 )改成2捐凭,先一步不是HALT 拨扶,還是ADD B A 相加。
寄存器 A是2 B 是1 相加是3茁肠,放入寄存器A 患民,然后存入 內(nèi)存地址12 是3,然后有碰到JUMP 2 垦梆。匹颤。。托猩。叫無限循環(huán)
所以 跳轉(zhuǎn)需要加上條件印蓖。
JUMP _ NEGATIVE
JUMP IF EQUAL 如果相等
JUMP IF GREATER 如果更大
修改下指令再來一遍。
執(zhí)行循序:
Load A 14 是 11 存寄存器A
Load B 15 是5 存寄存器B
SUB B A B- A 11 - 5 = 6 京腥,結(jié)果存入寄存器A
JUMP NEGATIVE 結(jié)果是6 假赦肃,CPU 不執(zhí)行跳轉(zhuǎn)。
JUMP 2 沒有條件直接執(zhí)行
回到 SUB B A B- A 6 - 5 = 1 公浪,結(jié)果存入寄存器A他宛。
JUMP NEGATIVE 5 結(jié)果是1 假,CPU 不執(zhí)行跳轉(zhuǎn)欠气。
回到 SUB B A B- A 1 - 5 = -4 厅各,結(jié)果存入寄存器A。
JUMP NEGATIVE 5 結(jié)果是-4 真预柒,CPU 執(zhí)行 指令5
ADD B A - 4 + 5 = 1 存入寄存器 A
STORE A 13 1 存入 內(nèi)存 13
HALT 停止
雖然只有7個指令但是CPU 執(zhí)行了13個指令队塘。
這個其實(shí)算余數(shù) 11 / 5 =1
如果多加幾行指令,我們可以跟蹤循環(huán)了多少次宜鸯。
軟件的好處讓任意兩個數(shù)可以執(zhí)行人灼,軟件讓我們做的硬件做不到的事情。
ALU 可以沒有除法功能顾翼,是程序給了我們這個功能。
別的程序也可以用我們的除法程序奈泪,來做其他事情 -意味著一層新 抽象适贸。
我們這里了假設(shè)的CPU 很基礎(chǔ)灸芳,指令都是8位的,前面4個是操作碼拜姿,最多也就16個指令烙样,后4位內(nèi)存地址也只有16個值。指令太少都不能jump 17蕊肥。
因此谒获,真正的現(xiàn)代CPU 兩種策略
- 用更多位代表指令,32 64 位 - 指令長度壁却。
- 可變指令長度 批狱,如 操作碼是8位,看到HALT 指令展东,HALT 指令不需要額外數(shù)據(jù)赔硫,馬上會執(zhí)行。
如果看到j(luò)ump 盐肃,要知道位置值爪膊,這個值在jump 的后面 叫立即值。
這樣設(shè)計(jì)指令可以是任意值砸王。
但會讓讀取階段復(fù)雜一點(diǎn)推盛。
我們拿來舉例的CPU 和指令集都是假設(shè)的。
是為了展示核心原理谦铃。
來看看真的CPU例子耘成。
1971 年 Intel 發(fā)布了 4004 處理器,第一次把CPU 做成一個芯片荷辕。
給后來的Intel 處理器打下基礎(chǔ)凿跳。
支持46 個指令。
有常用的指令疮方,也用8位的 “立即值” 來執(zhí)行JUMP 標(biāo)識更多的地址控嗜。
從1971 - 至今發(fā)展巨大。CPU I7有上千個指令和指令變種骡显,長度從1 - 15個字節(jié)疆栏。
光 ADD 指令就有很多變種。
指令越多就是給cpu 設(shè)計(jì)了越來越多的的功能惫谤。