在之前的文章中介紹scr1時,對cpu ipic register操作指令是有限制的,只能用csrrw/csrrwi。那這堆指令到底什麼區別呢
針對csrs操作指令,我們來重新梳理一下。
首先明確,真正的機器碼只有6條指令:
csrrw (csr read and write) ,這是讀寫操作,csr中的值寫入rd,rs1的值寫入csr。
csrrwi是csrrw的立即數擴充套件,rs1暫存器儲存值變為乙個立即數,對csr的操作是一致的。
csrrs(csr read and set), 這是讀並置位操作,csr中的值寫入rd, rs1的值或上(or)csr中的值再寫入csr。
csrrsi是csrrs的立即數擴充套件,rs1暫存器儲存值變為乙個立即數,對csr的操作是一致的。
csrrc(csr read and clear),這是讀並清除操作,csr中的值讀入rd,根據rs1的值對csr中的值按位清0 再寫入csr中。
csrrci是csrrc的立即數擴充套件,rs1暫存器儲存值變為乙個立即數,對csr的操作是一致的。
各種資料中其他的csr指令均是偽指令,我們舉例gnu中的偽指令:
csrr rd,csr 讀乙個csr中的值到rd中,相當於
csrrw rd,csr,zero
csrw csr ,rs1 寫rs1暫存器的值到csr中,相當於
csrrw zero,csr,rs1
csrc csr, rs1 根據rs1中的值按位對csr的值清0,相當於
csrrc zero,csr,rs1
csrs csr, rs1 根據rs1的值按位對csr的值置1,相當於
csrrs zero,csr,rs1
以 i 結尾的偽指令,都是立即數指令,用立即數替換了rs1,操作是一致的。
總結起來很簡單:
1,想對csr連讀帶寫,可選用基礎的6條csr指令直接搞定;
2,僅僅是讀的話,哪條基礎指令都可以,一般會用偽指令;
3,以 i 結尾的,不管是基礎指令還是偽指令,都是立即數作為引數的,在指令中操作這個立即數替換了 rs1
4,csr基礎的操作,就簡單的3種區別,w (直接寫 ), s(設定) , c(清除),不計i的4字母指令都是偽指令;
5, ,上csr指令有些名字錯誤,主要看內容描述
6,偽指令僅僅是方便程式設計師讀寫**,最終編譯器還是都給轉成了基礎指令。
暫存器知識
一般暫存器 ax bx cx dx ax 累積暫存器,bx 基底暫存器,cx 計數暫存器,dx 資料暫存器 索引暫存器 si di si 索引暫存器,di 目的索引暫存器 堆疊 基底暫存器 sp bp sp 堆疊指標暫存器,bp 基底指標暫存器 eax ecx edx ebx 為ax,bx,cx,d...
暫存器總結
1.32位通用暫存器 eax 32 其低16位為ax ah 高8位 al 低8位 ebx bx bh bl ecx cx ch cl edx dx dh dl 2.32位通用暫存器 ebp 其低16位為 bp,但沒有對應的8位暫存器 ebp 32 bp 16 esp 32 sp 16 esi 32 ...
通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...