所以這里我有以下代碼(ARMv6程式集):
wait$:
ldr r2,[r0,#24] //read 32 bits from addr 24 in r0 and store in r2
tst r2,#0x80000000 //????
bne wait$
我理解tst指令以外的所有行。我在網上做了一些研究,我能找到的最好的定義是:
測驗暫存器是零還是負。在暫存器和自身之間執行邏輯與。
我在理解它的含義時遇到了一些麻煩,所以我嘗試使 C 等同于一條tst指令,這就是我得到的:
if(valRead & 0x80000000 != 0){}
上面的代碼似乎不起作用。什么是更容易理解的定義tst以及在 C 中與它等效的定義是什么?
uj5u.com熱心網友回復:
什么是更容易理解的定義
tst以及在 C 中與它等效的定義是什么?
一些背景
C 中沒有等效項,因為高級語言的作業方式與具有“狀態暫存器”(例如 ARM 或 x86)的 CPU 不同:
在 C 或 C 等高級語言中,可以直接執行條件代碼:
if(a < b) ...
在帶有“狀態暫存器”的 CPU 上,條件代碼執行分兩步完成:
- 在第一步中,您執行一些計算(例如
a-b)。
在所謂的“狀態暫存器”中,CPU 存盤一些關于結果的“相關”資訊(例如符號)。 - 第二步,完成實際的條件代碼執行。
這只能根據“狀態暫存器”中的資訊來完成。
一個簡化的例子:
if(a < b) ...可以在具有“狀態暫存器”的 CPU 上按以下方式執行操作:
/* Subtract b from a */
c = a - b;
/* (a < b) means that (a - b) is negative */
if(status.last_result_was_negative) ...
...但是,c不需要操作的結果(在示例中)。
該 TST 和 CMP 說明
要執行一個if(...)操作,通常需要兩個操作:
- 減法:
它是需要==,<,>,<=,>=和!=。 - AND 運算:
需要檢查值中的某些位是否已設定:
if(a & 0x8000) ...
...并且在這兩種情況下,都不需要運算的結果(AND 運算的差異或結果)。
因此,有兩條指令 ( CMPand TST) 執行運算(CMP執行減法和TST執行 AND 運算)但丟棄結果:
該TST操作執行與操作,根據結果設定“狀態暫存器”中的資訊,但丟棄實際結果。
這在諸如if(a & 0xF000) ...您只對“狀態暫存器”保存操作a & 0xF000結果為零與否的資訊感興趣的行中是有意義的,但您對a & 0xF000.
if(valRead & 0x80000000 != 0){}
你需要括號:
if((valRead & 0x80000000) != 0){}
否則編譯器會理解:
if(valRead & (0x80000000 != 0)){}
...與以下內容相同:
if((valRead & 1) != 0){}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313753.html
上一篇:為什么帶有IMUL的32位立即數在NASM中給出警告而在GCC中給出錯誤?
下一篇:如何確定是否應保留暫存器
