如何将汇编代码翻译成C?

如何将汇编代码翻译成C?,c,assembly,x86,C,Assembly,X86,我很难理解如何将这个汇编代码翻译成C。它很短,只有几行,答案应该是一行 char_out: subq $8, %esp movsbl %dil, %edi # Parameter 1 in %dil / %edi call putchar # put char is a C function that writes (prints) addq $8, %rsp # a single char to stdout (th

我很难理解如何将这个汇编代码翻译成C。它很短,只有几行,答案应该是一行

char_out:
    subq   $8, %esp
    movsbl  %dil, %edi    # Parameter 1 in %dil / %edi
    call    putchar       # put char is a C function that writes (prints)
    addq    $8, %rsp      # a single char to stdout (the screen).
    ret
正如Lashane所评论的,此汇编代码相当于以下C代码:

void char_out(char P1)
{
    putchar(P1);
}
或者,我想你也可以说:

void char_out(char P1)
{
    int temp = (int)P1;     // movsbl
    putchar(temp);
}

但是C编译器会隐式地为您执行该操作,因此不必显式地显示该转换。

它将只是
putchar(P1)要求某人做你工作的问题不适用于StackOverflow。向我们展示您迄今为止所做的尝试以及遇到的困难,我们将很乐意帮助您。@olivercharlesworth这是一个很好的笑话,但您为什么要更改链接?我知道汇编代码中有一个指针。第一行subq设置标志。但我不确定下一行对movsbl有什么作用。下一行将调用定义的put char方法,addq将为%rsp=%rsp+8请勿将代码作为图像发布。谢谢,这非常有用。我唯一的困惑是subq和addq在程序集中的用途。你能详细说明一下吗?我不知道还有什么我没有说的。查看堆栈在x86体系结构上的工作方式。当您想要在堆栈上分配空间时,可以从堆栈指针中减去;当您想要释放该空间时,可以将其添加到堆栈指针中。堆栈指针始终存储在
ESP
寄存器中,因此
sub
add
指令就是这样做的。我还解释了为什么它会这样做,即使您没有使用堆栈:
putchar
函数显然希望这是其调用约定的一部分。这取决于实现,所以我不能多说了。@ninchicken:因为需要它。在第3.2.2节堆栈帧中,它表示“输入参数区域的末端应在16(如果堆栈上传递了_m256或_m512,则为32或64)字节边界上对齐。换句话说,值(%rsp+8)始终是16(32或64)的倍数。”当控制转移到函数入口点时。堆栈指针%rsp始终指向最近分配的堆栈帧的末尾“
void char_out(char P1)
{
    putchar(P1);
}
void char_out(char P1)
{
    int temp = (int)P1;     // movsbl
    putchar(temp);
}