我在 godbolt.org 上寫了一個小 c 函式,我對程式集中的某行很好奇。這是功能:
unsigned long long foo(uint64_t a, uint8_t b){
// unsigned long long fifteen = 15 * b;
// unsigned long long result = a fifteen;
// unsigned long long resultfinal = result / 2;
// return resultfinal;
return (a (15*b)) / 2;
}
生成的程式集:
rsb r2, r2, r2, lsl #4
adds r0, r2, r0
adc r1, r1, #0
lsrs r1, r1, #1
rrx r0, r0
現在我不明白為什么會出現 ADC 指令。它將 0 添加到 64 位數字的高位。為什么這樣做?
如果你想自己玩,這里是鏈接: 鏈接到程式集
uj5u.com熱心網友回復:
arm32 只有 32 位。值“a”是 64 位。您看到的指令是允許計算大于 32 位的大小。
rsb r2, r2, r2, lsl #4 # 15*b -> b*16-b
adds r0, r2, r0 # a (15*b) !LOW 32 bits! could carry.
adc r1, r1, #0 # add a carry bit to the high portion
lsrs r1, r1, #1 # divide high part by 2; (a (15*b))/2
rrx r0, r0 # The opposite of add with carry flowing down.
注意:如果你被adc指令迷惑了,那么rrx也會迷惑嗎?它是加法/乘法的“對偶”。對于除法,您需要處理較高部分的下溢并將其放在下一個較低的值中。
我認為重要的一點是你可以將這個邏輯“攜帶”到任意大的值。它在密碼學、大額金融和其他高精度科學和工程應用中都有應用。
請參閱:Gnu 多精度庫、libtommath等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/437336.html
上一篇:C纖維在printf上崩潰
