Я изучаю GAS Assembler на Windows с MinGW-64, и у меня есть вопрос о MinGW. Почему этот компилятор генерирует дополнительные инструкции в конце раздела .text? Я нашел несколько ответов, в которых люди объясняют, что это требуется по причинам выравнивания (компилятор делает это для выравнивания следующей функции по границе 8, 16 или 32). Но у меня есть следующий простейший код
.text
.global _start
_start:
xorq %rax, %rax
retq
objdump показывает это
test.exe: file format pei-x86-64
Disassembly of section .text:
0000000000401000 <.text>:
401000: 48 31 c0 xor %rax,%rax
401003: c3 retq
401004: 90 nop
401005: 90 nop
401006: 90 nop
401007: 90 nop
401008: 90 nop
401009: 90 nop
40100a: 90 nop
40100b: 90 nop
40100c: 90 nop
40100d: 90 nop
40100e: 90 nop
40100f: 90 nop
401010: ff (bad)
401011: ff (bad)
401012: ff (bad)
401013: ff (bad)
401014: ff (bad)
401015: ff (bad)
401016: ff (bad)
401017: ff 00 incl (%rax)
401019: 00 00 add %al,(%rax)
40101b: 00 00 add %al,(%rax)
40101d: 00 00 add %al,(%rax)
40101f: 00 ff add %bh,%bh
401021: ff (bad)
401022: ff (bad)
401023: ff (bad)
401024: ff (bad)
401025: ff (bad)
401026: ff (bad)
401027: ff 00 incl (%rax)
401029: 00 00 add %al,(%rax)
40102b: 00 00 add %al,(%rax)
40102d: 00 00 add %al,(%rax)
...
Если это сделано из соображений выравнивания, то я мог бы просто заменить эти дополнительные инструкции любыми байтами, кроме нулевых байтов и программа будет работать правильно, верно? Но когда я заменяю все эти дополнительные байты, например, на 90 (инструкция nop), программа перестает работать правильно. Пожалуйста, объясните мне, что происходит! Заранее спасибо!