2013-05-25 81 views
6

我需要將指針推入eax,並將一個指針推入ebx寄存器。我首先解決了這個問題:GCC將指針推入eax和ebx寄存器

register int eax asm("eax"); 
register int ebx asm("ebx"); 
int main() 
{ 
    eax = ptr1; 
    ebx = ptr2; 
} 

它像一個魅力工作。但是,當我將其添加到其他代碼中時,我發現了一些有關gcc無法找到寄存器以在類AREG中泄漏的奇怪錯誤,這些錯誤與代碼中無關的部分無關。我搜索了一下,結果發現它實際上是gcc -.-中的一個bug。所以,我需要另一種方法,將兩個指針推入eax和ebx寄存器。任何任何想法?謝謝!

編輯因爲人們一直在問我在這裏想要完成什麼,所以我想我會解釋一下。

我需要改變一些彙編代碼的eax和ebx,我試圖在我的程序中運行。我需要執行這個彙編代碼,並通過eax和ebx寄存器給出一個指向參數的指針。我通過在ebx中推送一個指向它的指針來執行彙編代碼,並調用ebx。當我不調用globaly全局寄存器的東西時,但是在本地,彙編代碼崩潰。如果我全局調用它,在隨機函數結束時會出現這個奇怪的錯誤。當我刪除該功能時,它會在另一個隨機函數中引發相同的錯誤。直到我用完功能,然後它工作,但然後我錯過了代碼的其餘部分:P

+0

請記住,EAX用於返回值。而且它只有32位,所以你不能在64位機器上的EAX中存儲指針。 –

+0

@joachimPileborg沒關係,它是一個32位的exe文件。任何想法如何我可以做到這一點? –

+3

「我搜索了一下,結果實際上是gcc中的一個bug」 - 不,幾乎肯定不是。當它不應該出現錯誤信息時,可能會出現錯誤,但這並不意味着每次得到該錯誤信息時,都是編譯器錯誤。有時候錯誤是有效的,錯誤信息提示你的代碼有什麼問題。 – hvd

回答

5

如果您有需要EAX/EBX具體參數(在線)彙編代碼,在GCC做到這一點的方法是使用下面的:

__asm__("transmogrify %0, %1\n" : "+a"(val_for_eax), "+b"(val_for_ebx)); 

該使用什麼樣的gcc調用內聯彙編約束它告訴彙編代碼編譯器 - 不管它是什麼 - 預計val_for_eax/val_for_ebxEAX/EBX(這是a/b部分),以及它會返回可能修改這些變量的版本(這是+)也在這些寄存器中。

除此之外,asm()語句中的實際代碼與編譯器無關 - 它只需要/想知道參數%0%1的存在位置。由於當前x86指令集中不存在transmogrify指令,因此上述示例將在彙編程序運行時失敗;只需用有效的東西代替它。

的解釋爲什麼GCC的行爲這樣的,正是你可以告訴它做的是在GCC手冊,網址爲:

您可以指定一個特定的寄存器變量,但由於道路GCC作品/路內聯彙編是在海灣合作委員會實現,這樣做並不意味着(!)的寄存器是從那時候開始保留(出)作爲gcc用於自己的目的。這隻能通過約束來實現,對於一個特定的單一塊asm()塊 - 約束告訴gcc如何寫入這些寄存器之前實際彙編代碼的位置,以及從它們讀取的內容之後

+0

嗯海灣合作委員會風格的大會是奇怪的,哦,搞亂了這個litle位它的作品! –

4

由於eax註冊需要在您的架構上有效的程序中的所有地方,您的策略不能工作全局變量綁定到特定的寄存器。不要這樣做,全球預訂註冊並不是一個好主意。

將綁定到寄存器的變量放在特定函數中,儘可能接近它們的使用。

+0

我試過這個,將它們從全局變爲局部變量,但是它不起作用。 –

+0

你必須更好地解釋問題是什麼,你的代碼試圖實現什麼等等。「不起作用」不是很有建設性。 –

+0

我需要更改一些彙編代碼的eax和ebx,我試圖在我的程序中運行。我需要執行這個彙編代碼,並通過eax和ebx寄存器給出一個指向參數的指針。我通過在ebx中推入指向它的指針來執行彙編代碼,並調用ebx。 –

相關問題