32位Linux汇编代码

时间:2014-03-31 21:45:42

标签: linux assembly x86

我对汇编代码有几个问题

  1. movmov1有什么区别?

  2. 你能解释一下这个输出吗?


  3.  804879a:  -    push   %ebp    
     804879b:       mov    %esp,%ebp    
     804879d:       sub    $0x14,%esp       <-allocating space for local variables in heap     
     80487a0:       mov    0x8(%ebp),%eax    
     80487a3:       mov    %al,-0x14(%ebp)    
     80487a6:       movl   $0x79,-0xc(%ebp)    
     80487ad:       movl   $0x5,-0x8(%ebp)    
     80487b4:       movl   $0xc,-0x4(%ebp)    
     80487bb:       mov    -0x8(%ebp),%eax    
     80487be:       mov    -0xc(%ebp),%edx    
     80487c1:       add    %edx,%eax              <- adding edx to eax     
     80487c3:       mov    %eax,%edx    
     80487c5:       sub    -0x4(%ebp),%edx    
     80487c8:       movsbl -0x14(%ebp),%eax    
     80487cc:       cmp    %eax,%edx    
     80487ce:       sete   %al    
     80487d1:       movzbl %al,%eax    
     80487d4:       leave    
     80487d5:       ret    
       ^    
       |    
    (memory addresses)
    

    我理解前几行是为局部变量分配内存。

    我最不理解的是$0x79数字。它们是什么?

    另外,如果有人可以向我解释sete会是什么样的很好

1 个答案:

答案 0 :(得分:1)

这是ATT或类似语法(与Intel语法相对)。 “$”表示立即值(对于Intel语法,“$”表示当前位置,因此对自身的循环将是|循环$ |)。 movl表示长(32位),如果操作数都不包含操作数大小而不是寄存器名称(al = 8位,ax = 16位,eax = 32位,rax = 64位),则需要后缀。如果当前条件代码表示“相等”(由前一个cmp指令设置),则SETE将AL设置为1,否则将AL设置为零。 movsbl将扩展的带符号8位值移动到32位操作数。