2014-05-14 65 views
-1

我試圖將以下代碼轉換爲使用leal的單行代碼。簡化組裝指令

movl 4(%esp), %eax 
sall $2, %eax 
addl 8(%esp), %eax 
addl $4, %eax 

我的問題是3個部分組成:

  1. 是否在寄存器前面的「%」簡單地定義如下字符串作爲註冊?
  2. 整數前面的'$'是否將下列值類型定義爲int?
  3. leal 4(%rsi, 4, %rdi), %eax上述程序集的正確轉換? (忽略從32位到64位的變化)

編輯:另一個問題。

unsigned int fun3(unsigned int x, unsigned int y) 
{ 
    unsigned int *z = &x; 
    unsigned int w = 4+y;   
    return (4*(*z)+w);    
} 

生成上面的代碼?我不熟悉指針。

+0

您的帖子中沒有任何&符號。不確定你的意思是什麼字符。 –

+2

我認爲他寫「和號」時他的意思是'%'。 –

+1

[起點](http://wiki.osdev.org/Opcode_syntax)AT&T彙編語法。檢查底部的「來源」鏈接。 – DevSolar

回答

1

1:如果%是

2:有沒有整數或浮點數或ASM布爾或char或...。你正在處理機器。這意味着它是一個常數

3:1將(esp-4)中的值移動到eax。 esp是堆棧指針,eax是c函數用來返回值的寄存器。

2左移兩次。在相同的由4作爲乘法

3加法值(ESP - 8)在EAX

4加入4 eax中重視到值

X * 4 + Y + 4 = EAX x是(尤-4),y是(ESP-8)

利爾是一樣的,4個+ RSI + 4 * RDI = EAX

所以是它的方式是相同的。

這取決於編譯器,但是,這是有效的翻譯。 4 * x + y + 4