一、指令和數據的尋址方式
操作數或指令在存儲器中的地址:某個操作數或某條指令存放在某個存儲單元時其存儲單元的編號
在存儲器中,操作數或指令字寫入或讀出的方式,有地址指定方式、相聯存儲方式和堆棧存取方式。
尋找方式:當采用地址指定方式時,形成操作數或指令地址的方式。
尋址方式分為兩類:指令尋址和數據尋址。
1)指令尋址:確定下一條預執行指令的指令地址
a、順序尋址:(PC)+1->PC 程序計數器自動加1
b、跳躍尋址:由轉移指令指出
2)數據尋址:確定本條指令的操作數地址
指令中所給出的地址碼,並不一定是操作數的有效地址。
尋址過程就是把操作數的形式地址,變換為操作數的有效地址。
例如:一種單地址指令的結構如下所示,其中用X I D各字段組成該指令的操作數地址。
二、尋址方式
1、隱含尋址(操作數在累加寄存器中)
在指令中不明顯的給出而是隱含着操作數的地址
例如:單地址的指令格式,沒有在地址字段指明第二操作數地址,而是規定累加寄存器AL或AX作為第二操作數地址,AL或AX對單地址指令格式來說是隱含地址
eg: MOV AL ,LSRC_BYTE
MUL RSRC_BYTE
ADD | 尋址特征 | A |
操作數地址隱含在操作碼中,(尋址特征指明尋址類型)。
另一個操作數隱含在ACC中
先在內存中地址為A的地方找到一個操作數,另一個操作數隱含在寄存器ACC里,從ACC里取出另外一個操作數,然后和給出的A地址中的數相加暫存在ACC中。
2、立即尋址
形式地址A就是操作數本身
OP | 立即尋址特性 # | A |
- 指令執行階段不訪存
- A的位數限制了立即數的范圍
3、直接尋址
EA=A
直接根據讀內存找到操作數,形式地址不需要經過任何處理。
- 執行階段訪問一次存儲器
- A的位數決定了該指令操作數的尋址范圍
MOV AX,[2222H]:將有效地址為2222H的內存單元的內容讀到累加器AX中
4、間接尋址
EA=(A)
有效地址由形式地址間接提供,形式地址是操作數的地址的地址
OP | 間接尋址標識 | A |
根據A的內容到內存中尋找到的是操作的數地址,再根據這個地址去找操作數。
- 執行指令階段2次訪存
- 可擴大尋址范圍
5、寄存器尋址
EA=R1
形式地址是寄存器的編號,直接去寄存器中尋址操作數。
- 執行階段不訪存,只訪問寄存器,執行速度快
6、寄存器間接尋址
操作數里存放的是寄存器的編號,寄存器中存的不是操作數而是操作數的有效地址。所以操作數在存儲器里。
- 有效地址在寄存器中,操作數在存儲器中,執行階段訪存。
7、偏移尋址
一種強有力的尋址方式 EA=A+(R) 形式地址需要和另一個寄存器中的地址相加
形式地址A是顯示的
另一個地址字段隱含在某個專用的寄存器R中。
常用的三個偏移尋址方式是:相對尋址 基址尋址 變址尋址(根據寄存器的不同類型來區分的)
7.1 相對尋址
A是相對於當前指令的位移量(可正 可負 補碼)
EX=A+(PC) ----PC程序計數器 PC存儲當前正在執行指令的地址
- A的位數決定操作數的尋址范圍
7.2、基址尋址
EA=A+(BR) BR為基地址寄存器 (Base Register)
- 可擴大尋址范圍
7.3、變址尋址
EA=A+(IX) IX為變址寄存器(專用) 通用寄存器也可以作為變址寄存器
- 可擴大尋址范圍
- 在程序執行的過程中IX內容可變,形式地址A不變
- 便於處理數組問題
8、堆棧尋址
例:某16位機器所使用的指令格式和尋址方式如下所示,該機有兩個20位基址寄存器,4個16位變址寄存器,十六個16位通用寄存器,指令匯編格式中S(源),D(目標)都是通用寄存器。M是主存中的一個單元。三種指令的操作碼分別是MOV(OP)=(A)h ,STA(OP)=(1B) LDA(OP)=3C)h MOV是傳送指令,STA為寫數指令 LDA為讀數指令
要求:1、分析三種指令的指令格式和尋址方式特點
2、CPU完成哪一種操作鎖化時間最短?哪一種操作所花時間最長,第二種指令的執行時間有時會等於第三種指令的執行時間嗎?
3、下列情況下每個十六進制指令分別代表什么?如果有編碼不正確,如何改進才能成為合法指令?
- (F0F1)H(3CD2)H ---32位
- (2856)H --16位
- (6FD6)H --16位
- (IC2)H --16位
答:1、MOV:單字長,二地址指令屬於RR指令
STA:雙字長,二地址指令,RS指令 S為基址寄存器或變址寄存器
LDA:雙字長,二地址指令,RS指令 S為20位地址。
2、MOV單字長取出只需要一次訪存,第一個不訪問存儲器要快。第二種還需要計算有效地址並對存儲器進行訪問。第二種指令所花費的時間不等於第三種,第三種無需進行有效地址的計算。
3、根據條件。MOV(OP)=(A)h=001010
STA(OP)=(1B)h =011011
LDA(OP)=(3C)h=111100
(F1F1)h(3CD2)h=(1111 0000 1111 0001 0011 1100 1101 0010)b
正確,表明吧主存(13cd2)h地址單元的內存取至15號寄存器
(2856)H=(0010 1000 0101 0110)b 單字長指令表明吧寄存器6的內容傳送到寄存器5號
(6FD6)H=0110 1111 1101 0110b操作碼不對 應修改為(28D6)h
(1C2)H=00000001 1100 0010b操作碼不對 應修改為(28C2)h
三、CISC何如RISC
復雜性指令系統計算機和精簡型指令系統計算機
1、精簡指令系統:選取使用頻率最高的一些簡單指令,指令條數少, 長度固定,指令少。
例:在SPARC中,有一些指令沒有選入指令系統,但很容易使用指令集中的另外一條指令來替代實現
下表左半部列出了6條指令的功能,請在表的右半部填入替代指令及實現方法
答:因為SPARC約定R0的內容恆為0,而且立即數可以作為一個操作數來處理,所以某些指令可以替代實現。
指令 | 功能 | 替換指令 | 實現方法 |
MOVE | 寄存器間傳送數據 | ADD | Rs+R0->Rd |
INC | 寄存器內容加1 | ADD | 立即數imm13=1,作為操作數 |
DEC | 寄存器內容減1 | SUB | 立即數imm13=-1 作為操作數 |
NEG | 取負數 | SUB | R0-Rs->Rd |
NOT | 取反碼 | XOR | 立即數imm13=-1 作為操作數 |
CLR | 清除寄存器 | ADD | R0+R0=Rd |
例、一條指令存儲在存儲器中的地址為300的地方,其操作數地址字段為301,地址字段的值為400,處理器中寄存器R1中包含數據200,在以下指令尋址方式下,求操作數的有效地址。
1)直接尋址
2)立即數尋址
3)相對尋址
4)寄存器(R1)間接尋址
5)以R1為變址寄存器的變址尋址
300中是操作碼 301是地址碼說明占兩個地址
答、1)400
2) 400是數本身 其地址是301
3)PC+400
4)寄存器間接尋址,寄存器里存的就是有效地址200
5)以R1為變址寄存器的變址尋址:操作數的有效地址為=200+400
格式表明有8個通用寄存器(產后度為16位),X指定尋址方式,主存實際容量為156K字。
1)假設不用通用寄存器也能直接訪問主存中的每一個單元,並假設操作碼域OP=6為,請問地址碼域應
分配多少位?指令字長度應有多少位?
2)假設X=11時,指定的某個通用寄存器用做基址寄存器,請提出一個硬件設計規則,使得被指定的通用寄存器能訪問1M主存空間中的每一個單元
答:1)主存容量為256K 地址域碼為18位,指令的長度為6+2+3+18=32位
2)1M需要20位地址
此時指定的通用寄存器用做基址寄存器,長度為16位,不能覆蓋1M字空間,可采用基址寄存器左移4位,低位補0,形參20位的基地址,然后與質量字形式地址相加得到有效地址,可以訪問1M字空間的任意一個單元。
例:假設寄存器中R中的數值為1000,地址為1000的寄存器中存儲的數據為2000,地址2000的存儲器中存儲的數據為3000,問在以下尋址方式中訪問的指令操作數的值是什么?
1)寄存器尋址R
寄存器尋址,寄存器中的值就是操作數所以值為1000
2)寄存器間接尋址(R)
R中存的是地址,所以數據是2000
3)直接尋址1000
形式地址是1000,操作數是2000
4)存儲器的間接尋址(1000)
地址1000中存放的2000是形式地址 2000中存放的才是數據,所以操作數是3000
5)立即數尋址 #2000
立即尋址里面存放的就是操作數本身,所以操作數是2000
例、某計算機字長為16位,主存地址空間大小為128k,按字編址,采用單字長指令格式,指令各字段定義如下
轉移指令采用相對尋址,相對偏移是用補碼表示,尋址方式定義如下
Ms/Md | 尋址方式 | 助記符 | 含義 |
000B | 寄存器直接 | Rn | 操作數=(Rn) |
001B | 寄存器間接 | (Rn) | 操作數等於((Rn)) |
010B | 寄存器間接。自增 | (Rn)+ | 操作數=((Rn)) (Rn)+1->Rn |
011B | 相對 | D(Rn) | 轉移目標地址=(PC)+(Rn) |
(X)表示有存儲地址X或寄存器X的內容
1)該指令系統最多可有多少指令?該計算機最多有多少個通用寄存器?存儲地址的寄存器(MAR)和存儲數據的寄存器(MDR)至少各徐多少位?
答:操作碼有4位所以指令最多有1的四次方16條指令,
指令操作數占6位,其中3位指示尋址方式,寄存器編號為3位,所以該計算機最多可有2的三次方也就是8個通用寄存器
計算機字長16位,所以存儲器寄存器(MDR)至少為16位。
主存空間為128KB,按字(16位)編址,則尋址范圍為0~64K 存儲器地址寄存器(MAR)需16位(2的16次方=64K)
2)轉移指令的目標地址范圍是多少?
答:16位計算機通用寄存器也是16位,則指令中尋址范圍至少可達0~2的16次方-1
另一方面,主存地址空間為2的16次方(64K)則尋址范圍也應該大於等於64K,故轉移指令的目標范圍為0~2的16次方-1
3)若操作碼0010B表示加法操作(助記符為add),寄存器R4和R5的編號分別為100B和101B,R4的內容為1234H,R5的內容為5678H,地址1234H的內容為5678H,5678H中的內容為1234H,則匯編語言為add(R4),(R5)+
對應的機器碼是什么(十六進制)?該指令操作執行后,哪些寄存器和存儲單元的內容會改變?改變后的內容是什么?
答:R4是間接尋址 R5是間接尋址+自增
操作碼 源尋址方式 源寄存器 目標尋址方式 目標寄存器
0010 001 100 010 101
該指令的功能是將R4內容所指存儲器單元的內容(源)與R5內容所指存儲器單元(目標)的內容相加后,寫到R5內容所指的存儲器單元,即
R4的內容:1234H,R4內容所指存儲器單元內容:5678H
R5的內容:5678H,R5內容所指存儲器單元內容:1234H
目標寄存器R5自加:5678H+1=5679H
所以執行后,目標寄存器R5目標寄存器內容所指的存儲器單元將改變,新R5=5679H
R5所指存儲單元(地址5678H的內容)=68ACH
例:某機器字長16位,主存按字節編址,轉移指令草原相對尋址,由兩個字節組成,第一字節為操作碼字段,第二字節為相對位移量字段,假定取指令時,每取一個字節PC自動+1,若某轉移指令所在主存地址為2000H,相對位移量字段的內容為06H,則該轉移指令成功轉以后的目標地址是
A:2006H B2007H C:2008H D:2009H
答:1個字節8位,機器字長16位 轉移指令占2個字節, 讀操作碼是PC+1=2001 讀偏移地址又+1變為2002H ,用2002和偏移量06相加,得2008H 選D