0

以下代碼是從維基百科(http://en.wikipedia.org/wiki/Test-and-set爲什麼需要額外的`CMP`命令來實現測試和設置(TSL)?

enter_region:  ; A "jump to" tag; function entry point. 

    tsl reg, flag  ; Test and Set Lock; flag is the 
        ; shared variable; it is copied 
        ; into the register reg and flag 
        ; then atomically set to 1. 

    cmp reg, #0  ; Was flag zero on entry_region? 

    jnz enter_region ; Jump to enter_region if 
        ; reg is non-zero; i.e., 
        ; flag was non-zero on entry. 

    ret    ; Exit; i.e., flag was zero on 
        ; entry. If we get here, tsl 
        ; will have set it non-zero; thus, 
        ; we have claimed the resource as- 
        ; sociated with flag. 

leave_region: 
    move flag, #0  ;store 0 in flag 
    ret    ;return to caller 

據我所知,這些2個命令tsl reg, flagcmp reg, #0可以只合併成一個命令tsl reg, flag,其做三兩件事一起:(1)複製flagreg(2 )設置flag1(3)測試reg是否爲零。從tsl命令中分離(3)有什麼好處或必要性?有沒有人有關於此的想法?

回答

0

tsl實際上並沒有測試flag(除了它的名字)的內容;它只是原子地複製flagreg。在x86中,通常使用xchg或比較和交換指令來實現,當後者可用時。

相關問題