如何将汇编代码转换为C?

时间:2017-04-23 16:31:12

标签: 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 (the screen).
    ret
void char_out(char P1)
{
    //insert here
}

1 个答案:

答案 0 :(得分:2)

char_out:
    # Allocate 8 bytes on the stack by subtracting 8 from the stack pointer.
    # 
    # This is done for conformance to the calling convention expected by the
    # 'putchar' function, which we're about to call.
    subq   $8, %esp

    # This is the weirdo AT&T mnemonic for the MOVSX instruction, which does a
    # move with sign extension. This means that it extends a small value
    # (here, a BYTE-sized value in DIL) into a larger value (here, a
    # DWORD-sized value in EDI), in a way that properly accounts for the
    # value's sign bit.
    # 
    # This is necessary because the 'putchar' function expects to be passed a
    # 32-bit 'int' parameter.
    movsbl  %dil, %edi

    # It's obvious what this does: it calls the 'putchar' function.
    call    putchar

    # Clean up the stack, undoing what we previously did to the stack pointer
    # at the top of the function (the 'subq' instruction).
    addq    $8, %rsp

正如Lashane已经评论过的,这个汇编代码等同于以下C代码:

void char_out(char P1)
{
    putchar(P1);
}

或者,我想你也可以说:

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

但C编译器会隐式为您执行此操作,因此没有必要显式地显示扩展转换。