2014-05-14 49 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