2013-02-08 222 views
1

我想了解如何在彙編中使用指針。通過閱讀一些關於internel的教程,我認爲它有一些概念。但是當我去嘗試它時,它確實奏效了。下面是將C轉換成ASM的一些嘗試。彙編語言的指針

Ç

const char *s = "foo"; 
unsigned z = *(unsigned*)s; 
if(!(z & 0xFF)) 
do_something(); 
if(!(z & 0xFFFF)) 
do_b_something(); 

(這裏不完整的代碼,但它是一個字檢查,thefore,有更多個支桿,檢查0xFF0000,0xF000000 respectivily

ASM:

mov ebp,str 
mov eax,ebp 

mov eax,[eax] 
and eax,0xFF 
cmp eax,0 
je etc 

mov eax,[eax] 
and eax,0xFFFF 
cmp eax,0 
je etc 

它返回一個seg故障。

而且嘗試:

mov eax,dword ptr [eax] 

多數民衆贊成由gcc編譯器生成的,你可以看到它在其他一些組件的代碼,在FASM彙編返回

invalid symbol

。它不是真的被FASM所支持,或者我錯過了什麼?

+0

'dword ptr'是MASM所需要的,而不是其他的。只需使用普通的括號。 seg故障很可能是由於在銷燬它後使用'eax'作爲指針。提示:使用'測試' – harold 2013-02-08 14:09:45

+0

我不會說C - 你能提供一些解釋你想達到的結果嗎?我有一種感覺,在組裝中它非常簡單。 – johnfound 2013-02-08 15:09:13

回答

1

我認爲這是你正在嘗試做的:

mov ebp,str 
    mov eax,ebp 

    mov ebx,[eax] 
    test ebx,0xFF 
    jz low_byte_empty 

    do_something: 
     ; some code here... 

low_byte_empty: 
    test ebx,0xFFFF 
    jz low_word_empty 

    do_b_something: 
     ; some code here. 

low_word_empty: 

說明:

首先,JasonD在他的回答已經提到,要裝載一個指向eax,然後做一個邏輯and,那麼您仍然使用eax中的結果來尋址內存(某些內存偏移量在範圍0x0 ... 0xFF中)。

那麼你的代碼出了什麼問題:你不能在同一個寄存器中同時存儲一個指向內存地址和值的指針。所以我選擇從[eax]加載到ebx,你也可以根據你的需要使用其他一些32位通用寄存器(ecx,edx,esi,, edi)。

然後,您不需要使用cmp來檢查寄存器是否爲空,因爲所有cmp確實是它執行減法並設置標誌。但ZF(零標誌)已經由and設置,所以cmp在這裏絕對沒有必要。然後,因爲cmp而不是需要在這裏,我們也不需要結果,我們只想更新標誌,最好使用testtestand的邏輯AND完全相同,唯一的區別是test不存儲結果,它只更新標誌。

+0

真的!我不需要cmp。 '和'改變目標值,我忘記了一段時間,所以我永遠不會得到預期的結果!我之前解決的EAX錯誤。非常感謝。 – 2013-02-09 00:03:27

+0

通過注意測試ebx,0xff與測試bl,bl相同,並且測試ebx,0xffff與測試bx,bx相同,您還可以從此答案中擠出額外的性能和字節。最後,您可能希望使用像ECX或EDX這樣的寄存器而不是EBX,因爲通常應該通過函數調用保留EBX。 – SecurityMatt 2013-02-09 04:41:15

1

在原始代碼中你試圖做什麼並不十分清楚 - 看起來不正確。

然而這樣的:

mov eax,[eax] 
and eax,0xFF 
cmp eax,0 
je etc 

mov eax,[eax] 

是行不通的。使用存儲在EAX地址中的值覆蓋EAX的內容,操作該值,然後嘗試在沒有恢復原始指針的情況下重新加載它。

+0

非常感謝。 – 2013-02-09 00:03:57

1

以下變體更簡單,更小,更快,只使用一個寄存器。

mov eax, str 
    mov eax,[eax] 

    test al, al 
    jz low_byte_empty 

do_something_byte: 
    ; some code here... 

low_byte_empty: 
    test ah, ah 
    jz low_word_empty   

do_something_word: 
    ; some code here 

low_word_empty: