arm指令集—swp指令
swp和swpb是arm指令集中對儲存單元的原子操作,即對儲存單元的一次讀和一次不可被分割。swp和swpb分別完成儲存器和暫存器之間 乙個字(32bit)和乙個位元組(8bit)的資料交換。
swp指令主要是完成arm體系架構處理器的同步操作,在linux作業系統中實現訊號量的操作。但是此指令在armv6架構後就沒有採用了,而是通過擴充套件的ldrex和strex實現。本片文章主要介紹swp的功能,對於ldrex和strex以後再介紹。
swp的指令格式如下:
swp {} rd, rm, [rn]
其中rd是目的暫存器,從儲存器中讀到的值存放於此暫存器中
rm暫存器是運算元,會將此暫存器中的值存放於儲存單元中
[rn]是暫存器間接定址,rn儲存的是某個儲存單元的位址
假設[rn]中存放的是訊號量,當某程式要修改訊號量時,則會呼叫swp指令完成對訊號量的操作,即對這個儲存單元的讀和寫是乙個原子操作,不會被打斷,命令的執行過程如下圖1所示:
當多個程式要訪問他們共享的資源時,我們必須要做好同步機制以保證資料的安全。通常,共享的資源可以是一段共享記憶體或者是外部裝置,訪問這些資源的可以使cpu、程序或者是執行緒。為了完成同步機制,會採用乙個原子變數來儲存資源的狀態。例如下圖2所示,用乙個二元訊號量(0或者1)來實現共享資源的同步,當程序a 和 程序b都要訪問訊號量semaphore。
對於a程序,
下面的彙編**是通過swp實現互斥的例子
export lock_mutex_swp
lock_mutex_swp proc
ldr r2, =locked
swp r1, r2, [r0] ; swap r2 with location [r0], [r0] value placed in r1
cmp r1, r2 ; check if memory value was 『locked』
beq lock_mutex_swp ; if so, retry immediately
bx lr ; if not, lock successful, return
endp
export unlock_mutex_swp
unlock_mutex_swp
ldr r1, =unlocked
str r1, [r0] ; write value 『unlocked』 to location [r0]
bx lr
endp
當然,除了上面的情況,還可能由於中斷的產生導致讀和寫的操作被打斷。在一些任務比較簡單的系統中,可以在關鍵的**中利用禁止中斷的方式來保證對資料操作的原子性,然而對於現在複雜的多工作業系統,禁止中斷的做法顯然不是有效的解決方法。所以swp通過特殊的訪問方式,不需要禁止中斷,但是這樣也會延長中斷的響應時間。隨著處理器的快速發展,多核處理器已經顯示出了強大的優勢,同步的問題顯得更加明顯。如圖3所示,乙個系統由乙個cortex-a8和cortex-m4組成,他們都會訪問一同一段儲存空間。
swp指令在這種模式下,就顯得很尷尬了,如果依然採用原來的特殊訪問模式,可能會大大降低多核處理的效能。所以從armv6架構以後,不再使用swp指令實現同步的功能,而是增加了ldrex和strex指令完成相關的操作。具體使用情況,會在ldrex和strex的文章中詳細說明。
ARM 指令集 比較指令
譯註 cmp 和 cmp 是算術指令,teq 和 tst 是邏輯指令。把它們歸入一類的原因是它們的 s 位總是設定的,就是說,它們總是影響標誌位。compare negative cmn status op 1 op 2 cmn同於cmp,但它允許你與小負值 運算元 2 的取負的值 進行比較,比如難...
Arm指令集 偽指令
目錄 arm指令集 跳轉指令 資料處理 程式狀態暫存器傳輸指令 load srote指令 協處理器指令 異常中斷產生指令 gnu arm偽指令 資料定義 彙編控制 其他指令 blx register string abcd efgh hello asciz qwer sun world ascii ...
ARM偽指令集
一 符號定義 symbol definition 偽指令 符號定義偽指令用於定義arm 匯程式設計序中的變數 對變數賦值以及定義暫存器的別名等操作。常見的符號定義偽指令有如下幾種 用於定義全域性變數的gbla gbll 和gbls。用於定義區域性變數的lcla lcll 和lcls。用於對變數賦值的...