概念
指令:計(jì)算機(jī)硬件所能理解并服從的命令。
存儲程序概念:多種類型的指令和數(shù)據(jù)均以數(shù)字形式存儲于存儲器中的概念。
字:計(jì)算機(jī)中的基本訪問單位,通常是32位為一組,在MIPS體系結(jié)構(gòu)中與寄存器大小相同。
數(shù)據(jù)傳送指令:在存儲器和寄存器之間移動數(shù)據(jù)的命令
地址:用于在存儲器空間中指明某特定數(shù)據(jù)元素位置的值
對齊限制:數(shù)據(jù)地址與存儲器的自然邊界對齊的要求
程序計(jì)數(shù)器(PC):包含在程序中正在被執(zhí)行指令地址的寄存器
基本塊:沒有分支(可能出現(xiàn)在末尾者除外)并且沒有分支目標(biāo)/分支標(biāo)簽(可能出現(xiàn)在開始者除外)的指令序列
一、數(shù)字特征
1個字=? ? ?個字
MIPS指令集:
①按字節(jié)編址。?一個字4個字節(jié),一個字節(jié)8bit。
②寄存器大小為32位
③地址值為32位
④采用大端編址
數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中
二、指令的基本結(jié)構(gòu)
R型指令:
?rd是目的寄存器
如:算術(shù)運(yùn)算指令、邏輯操作
補(bǔ)碼運(yùn)算
add、sub、sll(邏輯左移)、and、or、slt(set on less than 小于則置位)
add $t0,$s0,$s1//$t0是目的寄存器
sub $t0,$s0,$s1//$t0是目的寄存器
sll? $t0,$s0,4 //$t0是目的寄存器
and $t0,$t1,$t2//$t0是目的寄存器
slt? $t0,$s3,$s4 //$t0是目的寄存器
I型指令:
rt是目的寄存器?
立即數(shù)指令(addi)、數(shù)據(jù)傳送指令(lw、sw):
注意16位立即數(shù)為有符號補(bǔ)碼,進(jìn)行計(jì)算時需要先進(jìn)行符號擴(kuò)展,此指令認(rèn)為寄存器內(nèi)的數(shù)據(jù)也為補(bǔ)碼形式。由于這里是有符號數(shù),所以沒有subi指令.
決策指令(beq、bne):
PC相對尋址,這里的地址為字地址,需要將16位地址乘以4,得到18位的字節(jié)地址,再進(jìn)行相加。這里同樣是有符號數(shù)的補(bǔ)碼形式,需要進(jìn)行符號擴(kuò)展。并且相對偏移的對象為PC+4
立即數(shù)邏輯操作指令(ori、andi)、取立即數(shù)高位指令(lui):
邏輯操作的立即數(shù)是通過變成32位數(shù)的低十六位,而高十六位補(bǔ)0形成的“無符號數(shù)”進(jìn)行運(yùn)算的;lui指令是直接把constant字段放入寄存器的高十六位,低十六位補(bǔ)0
lw $t0,23($s0) //$t0是目的寄存器
sw?$t0,43($s0) //$t0是目的寄存器
beq $t0,$t1,L1//$t0和$t1地位等價
bne $t0,$t1,L1//$t0和$t1地位等價
addi $s3,$s0,4 //$s3是目的寄存器
J型指令:
?
無條件跳轉(zhuǎn)?jump指令
PC+4的高四位與 Jump指令的立即數(shù)*4?的28位進(jìn)行拼接。
基址寄存器:
g=h+A[8] ,其中變量h的值存放在$s2中,變量g的值存放在$s1中
編譯為:
lw $t0,32($s3)
add $s1,$s2,$t0
$s3存放數(shù)組的首地址,即$s3為基址寄存器,32位偏移量,認(rèn)為該數(shù)組的每個元素的大小為一個字,所以偏移量為8*4。
符號擴(kuò)展:
????????需要符號擴(kuò)展的是需要進(jìn)行運(yùn)算的立即數(shù),如beq,lw,sw,addi他們的立即數(shù)都需要進(jìn)行加法運(yùn)算,beq的立即數(shù)需要與PC+4相加,lw和sw的立即數(shù)是需要與基址寄存器的地址相加,addi的立即數(shù)需要與指令中的源寄存器相加,這些都需要將立即數(shù)看作有符號數(shù)進(jìn)行符號擴(kuò)展再運(yùn)算。
????????而對于lui,ori,jump不直接進(jìn)行加法運(yùn)算的?就不需考慮符號擴(kuò)展。
例:
某條addi的機(jī)器碼為:
0010 00?01 001?1 0011 1011 0000 0010 0000?
若寄存器編號和寄存器數(shù)據(jù)值相同,則此指令為:
addi $19,$9,(1011000000100000)B
所以運(yùn)算結(jié)果應(yīng)該為:
0000 0000 0000 0000 0000 0000 0000?1001
+
1111 1111 1111 1111 1011 0000 0010 0000(有符號數(shù)16位符號擴(kuò)展為32位)
=
1111 1111 1111 1111 1011 0000 0010 1001
此結(jié)果存入$19中
PC相對尋址:
beq $t2,$t0,10 ;?假設(shè)此時PC中的值為01000000H
則目標(biāo)地址為:
? (H表示16進(jìn)制,D表示十進(jìn)制)
即0 100002C H
無條件跳轉(zhuǎn):
Jump 10;? 跳轉(zhuǎn)到10*4=40D=28H
目標(biāo)地址為:
0 0000028H
↑
PC高四位bit
32位立即數(shù):
lui指令(讀取立即數(shù)高位指令)+ori指令(立即數(shù)或)
lui指令將16位立即數(shù)常數(shù)放到寄存器高16位,低16位填充0
ori指令將16位立即數(shù)常數(shù)放到寄存器低16位,高16位填充0
立即數(shù):
在邏輯操作中:立即數(shù)與、立即數(shù)或的16位立即數(shù)是高16位補(bǔ)0形成32位進(jìn)行與或運(yùn)算(相當(dāng)于無符號數(shù))?如ori;
在加法下:立即數(shù)進(jìn)行符號擴(kuò)展,再運(yùn)算? ? 如addi;
遠(yuǎn)距離分支:
實(shí)現(xiàn)其他跳轉(zhuǎn)
為什么lw和sw的地址是字節(jié)地址(不乘以4),而beq和jump是字地址(偏移量*4)?
????????因?yàn)閎eq和jump都是程序計(jì)數(shù)器的跳轉(zhuǎn),是存放指令地址的,而指令是32位的,一條指令4個字節(jié),所以指令的存儲都是以4個字節(jié)為單位的,所以只需要字地址就可以找到一條指令。但是數(shù)據(jù)不一定是4個字節(jié)的,比如C語言中char類型是一個字節(jié)的,這樣的話,為了使得lw和sw能取到具體的數(shù)據(jù),需要具體到字節(jié)地址。
三、硬件設(shè)計(jì)的設(shè)計(jì)原則
①簡單源于規(guī)整 :
所有指令長度統(tǒng)一、算術(shù)指令總是需要三個寄存器操作數(shù)、寄存器字段在每種指令格式的位置相同②越小越快 :
寄存器只有32個。
③優(yōu)秀的設(shè)計(jì)需要適宜的折中方案:
指令長度相同的情況下,不同類型的指令采用不同的指令格式。
不同類型指令采用不同的解碼方式,但都是32位相同的指令長度,盡可能保持相似的指令格式。
一個 MIPS 例子是在指令中提供更大地址與常數(shù),并且保持所有的指令具有相同的長度之間的折中。
四、尋址方式
寄存器尋址:操作數(shù)在寄存器中,如add
立即數(shù)尋址:操作數(shù)在指令的立即數(shù)字段,如addi
基址尋址:操作數(shù)在基址寄存器中,如lw,sw
PC相對尋址:PC作為操作數(shù),如beq
偽直接尋址:無條件的跳轉(zhuǎn) jump
五、堆、棧數(shù)據(jù)空間
$gp的范圍為1000 0000H?到 1000 ffffH (遍歷十六進(jìn)制低4位)?
六、過程
過程運(yùn)行的6個步驟:
1.將參數(shù)放在過程可以訪問的寄存器里
2.將控制轉(zhuǎn)移給過程
3.獲得過程所需要的存儲資源
4.執(zhí)行過程的操作(請求的任務(wù))
5.將結(jié)果的值放在調(diào)用程序可以訪問到的寄存器
6.將控制返回到調(diào)用點(diǎn)
跳轉(zhuǎn)和鏈接指令:
jal ProcedureAddress//?jal Func();
跳轉(zhuǎn),跳轉(zhuǎn)至過程處,鏈接是將PC+4的值存入$ra
寄存器跳轉(zhuǎn)指令:
jr $ra//?無條件跳轉(zhuǎn)至$ra中程序的指令處。
七、C語言程序轉(zhuǎn)換為可執(zhí)行程序的步驟
記憶。
八、習(xí)題
A
?
①簡單源于規(guī)整?②越小越快?③優(yōu)秀的設(shè)計(jì)需要適宜折中的方案
B
×。
遍歷十六進(jìn)制的低4位,所以訪問空間是1000 0000~1000 ffff H
?
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-446531.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-446531.html
到了這里,關(guān)于第二章:指令:計(jì)算機(jī)的語言(防遺忘)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!