#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), второе гигантское число - остаток строки.
Комментариев нет:
Отправить комментарий