Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Объясните выхлоп асма: откуда $8583909746840200520 при создании “Hello, world!\n”

#cpp #ассемблер


Не могу понять ассемблерный код, получаемый в результате компиляции простейшей программы:

int main(int argc, char* argv[]) {
    char str[] = "Hello, world!\n";
}


При использовании gcc6.3 x86_64 получается такой результат:

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    %edi, -20(%rbp)
    movq    %rsi, -32(%rbp)
    movabsq $8583909746840200520, %rax
    movq    %rax, -16(%rbp)
    movl    $1684828783, -8(%rbp)
    movw    $2593, -4(%rbp)
    movb    $0, -2(%rbp)
    movl    $0, %eax
    popq    %rbp
    ret


Откуда берётся $8583909746840200520? 

Замечу, что если написать так:

int main(int argc, char* argv[]) {
    char str[] = "Hello, world!\0";
}


то получается совсем другое:

.LC0:
    .string "Hello, world!"
    .string ""
main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    %edi, -20(%rbp)
    movq    %rsi, -32(%rbp)
    movq    .LC0(%rip), %rax
    movq    %rax, -16(%rbp)
    movl    .LC0+8(%rip), %eax
    movl    %eax, -8(%rbp)
    movzwl  .LC0+12(%rip), %eax
    movw    %ax, -4(%rbp)
    movzbl  .LC0+14(%rip), %eax
    movb    %al, -2(%rbp)
    movl    $0, %eax
    popq    %rbp
    ret

    


Ответы

Ответ 1



8583909746840200520(dec) == 77202C6F6C6C6548(hex) == "w ,olleH"(str), второе гигантское число - остаток строки.

Комментариев нет:

Отправить комментарий