彙編下浮點數有關計算

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窗口中固定, pushpop看成是將環形棧的數據推動或拉動. 

這些看了之後還是有點不太理解,下圖中Cond,fcomp會改變它的值,ah的值擴展爲低八位取02467,分別給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值賦給標誌位來改變的。

![這裏寫圖片描述](https://img-blog.csdn.net/20170602160416317?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDcxNTU5OQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravi

0x03:總結

還是有很多疑惑的地方,這次就先分析這麼多,以後遇見再繼續總結。
感謝impressionw:http://blog.csdn.net/impressionw給我提供的幫助

參考文檔:http://blog.sina.com.cn/s/blog_7753c5fa0100q96l.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章