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