我是小康小白,一個平平無奇的Java小白。熱愛有趣的文字,生活和遠方。
個人部落格:https://blog.csdn.net/weixin_45791445
有問題歡迎QQ聯繫:1059320343 (記得備註CSDN)
應用系統,
—>應用程式程式設計介面API(生態建設的起點)
操作系統,
—>指令系統ISA(生態建設的終點)
硬體系統,
—>工藝模型
電晶體
補充:在API和ISA中間還有一層應用程式二進制介面(ABI)。ABI是應用程式存取計算機硬體以及操作系統服務的介面。
應用軟體
基礎軟體
硬體邏輯
物理載體
指令系統介於軟體和硬體之間,是軟硬體互動的介面。
偵錯模式
根模式
客戶模式
根-核心模式和偵錯模式可以控制所有的處理器資源,
根-使用者模式和客戶-使用者模式只能控制各自模式的資源,
客戶-核心模式可以控制所有的客戶-使用者資源。
根據指令長度的不同,指令系統分爲:
指令集結構:
指令集時指令系統提供給軟體的直接介面。
指令系統有時也會狹義地理解爲指令集結構。
指令:
每條指令倒是一個操作的描述,主要包括操作碼和運算元。
操作碼包括指令系統,例如加減法。
操作數據指示操作物件,又包括數據型別,存取地址,定址方式等內容的定義。
訪存地址
訪存地址的對齊:
對齊存取是指對該數據的存取地址和結束地址都符合其數據長度。
如果支援不對齊存取,硬體就需要完成數據的拆分和拼合。
大小尾端?
big endian:大尾端,也稱大端(高位)優先儲存。最高有效位元組的地址較小的是大尾端。
little endian:小尾端,也稱小端(低位)優先儲存。最低有效位元組的地址較小的是小尾端。
如下對00000000 00000000 00000000 00000001的儲存?
大尾端: 00000000 00000000 00000000 00000001
addr+0 addr+1 addr+2 addr+3 //先存高有效位(在低地址)
小尾端: 00000001 00000000 00000000 00000000
addr+0 addr+1 addr+2 addr+3 //先存低有效位(在低地址)
Load和Store的區別?
以LOAD R1 A
和STORE C,R3這兩條命令進行講解。
在第一條指令中LOAD表示從記憶體中讀取數據A然後儲存到R1暫存器中
第二條指令中STORE表示將C儲存到記憶體R3中。
從功能上分,指令可分爲四大類:
運算指令:加減乘除,移位,邏輯運算等。
訪存指令:負責對記憶體的讀寫。
轉移指令:控製程式的流向。
(1)兩大要素:轉移條件和轉移地址。
(2)兩要素的組合構成了不同的轉移指令:
特殊指令: 用於操作系統的特定功能。
公共指令功能
對於跳轉指令:
PC 相對地址跳轉指令稱爲「分支」,絕對地址跳轉指令稱爲「跳轉「。
延遲槽:
RISC指令集中很多條件轉移採用了延遲槽技術。
程式中 轉移指令的後一條指令位延遲槽指令。
分支延遲槽 (Branch delay slot),簡單地說就是位於分支指令後面的一條指令,不管分支發生與否其總是被執行,而且位於分支延遲槽中的指令先於分支指令提交 (commit)。
addi/addiu:把一個暫存器的內容加上一個立即數add $1,$2,#3($1=$2+3);u爲不帶符號加。
sub/subu:把兩個定點暫存器的內容相減。
div/divu:兩個定點暫存器的內容相除。
mul/mulu:兩個定點暫存器的內容相乘。
and/andi:與運算,兩個暫存器中的內容相與and $1,$2,$3($1=$2 & $3);i爲立即數。
or/ori:或運算。
xor/xori:互斥或運算。
beq/beqz/benz/bne:條件轉移eq相等,z零,ne不等。
j/jr/jal/jalr:j直接跳轉;jr使用暫存器跳轉;
lui:把一個16位元的立即數填入到暫存器的高16位元,低16位元補零。
sll/srl:邏輯左移/右移sll $1,$2,#2。
slt/slti/sltui:如果$2的值小於$3,那麼設定$1的值爲1,否則設定$1的值爲0。slt $1,$2,$3。
mov/movz/movn:複製,n爲負,z爲零。mov $1,$2; movz $1,$2,$3($3爲零則複製$2到$1)。
trap:根據地址向量轉入管態。
eret:從異常中返回到使用者態。
add是有符號數加法,addu是無符號數加法。
區別:add指令執行附加的溢位檢測,如果運算結果溢位,會觸發異常。
C語言等高階語言編寫的程式必須經過編輯器轉化爲彙編語言,再由彙編器轉換爲指令碼才能 纔能在CPU上執行。
對下圖的解釋:
執行順序:
1.add:(add是被呼叫的子程式)
addu v0,a0,a1
addu:這是一個操作碼,把兩個定點暫存器的內容不帶符號相加add $1,$2,$3($1=$2+$3);(相似的指令見上文)
v0,a0,a1是三個暫存器
而這條指令是將會將輸入的參數儲存到a0,a1兩個暫存器中,並將結果儲存到v0暫存器中。
jr ra
jr:負責函數返回的指令,屬於間接跳轉指令,該指令的運算元爲暫存器,因此MIPS彙編中常見的函數返回指令是
JR RA
指令的後一條指令其延遲槽,延遲槽內的指令先於JR指令執行。
呼叫函數時纔會執行此指令。
ref:(函數)
addiu sp,sp,-32指令
addi/addiu:把一個暫存器的內容加上一個立即數add $1,$2,#3($1=$2+3);u爲不帶符號加。
這條指令給sp暫存器中加上-32,並將結果儲存到sp暫存器中。
sw ra,28(sp)
sw:sw rt,imm(rs)將rt暫存器中存放的值儲存到rs暫存器中存放的值
加上立即數imm進行符號擴充套件後得到的擴充套件立即數所得的記憶體地址的記憶體單元中,
即memory[rs + (SignExtend)immediate] <- rt
這條指令是
li a0,12
這條指令將12儲存到a0這個暫存器中。
li a1,34
這條指令將34儲存到a1
jal add
jal:呼叫函數,屬於絕對轉移指令,該指令在跳轉的同時還將下一條指令(延遲槽除外)的地址放入31號通用暫存器
(記爲RA)中,作爲函數放回地址。
在這條指令中,它呼叫了add函數。
lw ra,28(sp)
注:這個解釋未寫完,小白後面會補完的。
段式儲存管理的地址轉換的過程:
頁式儲存管理的地址轉換過程:
段頁式儲存管理的地址轉換過程(虛擬地址分爲段號,虛擬頁號和頁內偏移):
段裏面儲存的是多張頁表。
特權指令系統就其機制 機製而言,可以分爲以下幾類
(1)執行模式定義及轉換
(2)虛擬儲存管理
(3)異常和中斷處理
(4)控制暫存器
控制暫存器位於一個獨立的地址空間,是支撐前面3種機制 機製的具體實現。不同的指令系統差別較大。
使用LL(Load Linked)和SC(Store Conditional)指令來完成原子操作。由硬體維護一個LL bit,在LL指令存取莫記憶體地址後,若該地址被改寫則修改LL bit狀態,執行SC指令時檢查LL bit來確定原子性。