0x01:前言
有關整數的運算在彙編中很常見,這次機緣巧合遇見了浮點數的相關運算,確實懵了一下,不過還是覺得很有必要總結一下相關知識點,下面藉助一個ctf題,簡單瞭解浮點數的相關知識。
0x02:代碼參考
下面代碼是直接從ida中拷貝出來的,很多彙編語句就不一一介紹了,把其中浮點數相關着重解釋一下。
.call near ptr 48CACDh
.text:00401267 xor ax, 7
.text:0040126B movsx eax, byte ptr [ebp-1Ah]
.text:0040126F sub eax, ecx
.text:00401271 mov [ebp-4], eax
.text:00401274 movsx eax, byte ptr [ebp-1Ch]
.text:00401278 fild dword ptr [ebp-4]
這部分代碼理解起來就一些異或以及寄存器操作就不詳解了fild 浮點數相關彙編指令是將整數轉化爲長雙精FP80壓棧(壓到st0)
.text:0040127B sub eax, ecx
.text:0040127D mov [ebp-4], eax
.text:00401280 movsx eax, byte ptr [ebp-1Bh]
.text:00401284 fild dword ptr [ebp-4]
這部分跟上面一樣
.text:00401287 sub eax, ecx
.text:00401289 mov [ebp-4], eax
.text:0040128C fidiv dword ptr [ebp-4]
這部分是除法指令 fidiv 就是st0 = st0 /st1
.text:0040128F movsx eax, byte ptr [ebp-19h]
.text:00401293 sub eax, ecx
.text:00401295 mov [ebp-4], eax
.text:00401298 fsubp st(1), st
這部分是減法指令 fsubp 就是 st = st(1)- st ;st1 = 0
.text:0040129A fimul dword ptr [ebp-4]
乘法指令 fimul st0 = st0 * 所指向ss段寄存器的值
.text:0040129D fmul ds:flt_40711C
fmul st0 = st0 * 所指向ds段寄存器的值
.text:004012A3 fstp dword ptr [ebp-4]
fstp pop 出棧操作
.text:004012A6 jz short near ptr loc_4012AA+1
.text:004012A8 jnz short near ptr loc_4012AA+1
004012B3 . D945 FC fld dword ptr ss:[ebp-0x4]
fld 取ss段寄存器中的值到st0
004012B6 . D81D 18714000 fcomp dword ptr ds:[0x407118]
fcomp st0 與ds段寄存器值比較
最後看了大半天還是沒徹底搞懂zf標誌位最後怎麼變得。sahf也能改變zf標誌位
浮點寄存器(FPU,Float Process Register, 存在與CPU的FPU中)在IA-32體系下有8個.
彙編指令用ST0~ST7表示. ST0一般簡寫作ST.
其狀態標記我自己測試發現有4種:
Empty: 就是空狀態 , 沒有使用.
Valid: 就是正在使用. 這兩種最常用.
Zero: 當ST寄存器的值爲0時,即置此狀態.
Bad: 髒數據的意思, 當我多次fld的時候, 超過了7次就會覆蓋以前.
浮點寄存器貌似是一種環形的堆棧. 可以這樣來理解:傳統的堆棧看作是移動esp指針, 這裏的堆棧可看成是指針固定,即ST0~ST7這8個寄存器始終在我們OD窗口中固定, push和pop看成是將環形棧的數據推動或拉動.
這些看了之後還是有點不太理解,下圖中Cond,fcomp會改變它的值,ah的值擴展爲低八位取0,2,4,6,7,分別給C、P、A、Z、S
st0>ds:[0x407118]
cond 0 0 0 0 fst 0020 ah = 00 標誌位 AH=00 (S0 Z0 A0P0 C0)
st0 = ds:[0x407118]
cond 1 0 0 0 (未改變) fst 4020 ah = 40 標誌位 AH=00 (S0 Z1 A0P0 C0)
st0< ds:[0x407118]
cond 0 0 0 1 fst 0120 ah = 01 標誌位 AH=00 (S0 Z0 A0P0 C1)
zf標誌位就是將fst的值傳給eax之後,將ah值賦給標誌位來改變的。
0x03:總結
還是有很多疑惑的地方,這次就先分析這麼多,以後遇見再繼續總結。
感謝impressionw:http://blog.csdn.net/impressionw給我提供的幫助