我正在尝试将以下汇编代码转换为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)指的是第二条指令。
答案 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">▼</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>