我正在關注這個編譯的代碼(我不知道編譯器也沒有源代碼)。以下彙編代碼是做什麼的?
Sub1:
mov edx,[esp+04h]
and edx,00000300h
or edx,0000007Fh
mov [esp+06h],dx
fldcw word ptr [esp+06h]
retn
我的理解:
Sub1(4byte param1)
edx=param1&0x00000300|0x0000007F
higher 2 bytes of param1 = lower 2 bytes of edx
fldcw ???????
fldcw
加載控制字。但是什麼是浮點控制字?
結果存儲在param1的高2字節中。我對嗎?
這個子程序的目的是什麼?
非常感謝。我正在閱讀文章。然而,現在我想知道如果這個函數等同於'round(x)',爲什麼輸入參數是4個字節而不是8個字節? – barej
由於你顯示的代碼將舍入控制'RC'設置爲0(舍入到最近或偶數),所以我沒有看到這個代碼如何與'floor()'相關。 'floor()'函數向下舍入,即負無窮大,這對應於1的RC值,而不是0.這裏的代碼看起來像是爲編譯器的庫設置了x87默認值,但是沒有額外的上下文這是純粹的猜測。 FPU控制字是一個16位整數,可能上面的代碼來自一個子程序,該子程序在[esp + 4]處作爲零擴展的4字節整數自變量傳入控制字值,但在此子程序存在之前也是推測 – njuffa
稱爲一行'fstcw word ptr [esp]'被執行。可能與你的意思有關。如果將FPU控制字傳遞給該函數,那麼浮點數的四捨五入是什麼?它在'FPU'的ST(0)中嗎? – barej