ASM到C:4(%esp)指的是什么

时间:2018-05-29 10:32:41

标签: c assembly

我正在尝试将以下汇编代码转换为C代码:

fct:
    movl 4(%esp), %eax
    cmpl $0,%eax
    jg n
    movl $-1,%eax
    ret
n:  movl $0,%ebx
    movl %eax, %ecx
    movl $0, %eax
    movl $0, %edx
l:  addl $2, %ebx
    addl %ebx, %eax
    addl $1, %edx
    cmpl %ecx, %edx
    jl l
    ret

我认为我可以很容易地翻译大部分内容,但我似乎无法找到第一行(movl 4(%esp), %eax)的作用。在这种情况下,4(%esp)指的是什么? 我知道%esp寄存器指的是桩的最后一条指令,而4(%esp)指的是第二条指令。

1 个答案:

答案 0 :(得分:2)

l是"移动"指令。 movl中的%esp表示它在" long"上运行值(在您的情况下为32位)。 (%esp)%esp周围的括号表示它不应移动寄存器%esp的内容,而应在寄存器4中的地址处加载内存。 4(%esp)中的%esp是指在取消引用之前添加到%esp + 4的偏移量。

因此该指令从地址%eax加载32位值并将其存储在寄存器%eax中。

因为在x86中所有函数参数都存储在线程堆栈上(大多数情况下,可以使用其他调用约定),所以此指令会在寄存器int fct(int val); 中加载函数参数。

在C中,参数按相反顺序(从最后一个到第一个)推送,因此它加载第一个参数。

似乎原始函数在C中定义如下:

jg

为签名的更大比较生成指令if (val > 0) ... ,因此第一行似乎是

<div class="dropdown">
    <span class="tag">
        <span class="tag-text">Talla</span>
        <span class="tag-caret">&#9660</span> 
    </span>
    <div class="dropdown-content">
        <input type="checkbox" name="talla[]" id="36" class="filtro">
        <label for="36" class="label">36</label>
        <br>
        <input type="checkbox" name="talla[]" id="37" class="filtro">
        <label for="37" class="label">37</label>
        <br>
        <input type="checkbox" name="talla[]" id="38" class="filtro">
        <label for="38" class="label">38</label>
        <br>
    </div>
</div>