Ассамблея. Почему G CC создает дополнительные инструкции в конце секции .text? - PullRequest
0 голосов
/ 14 апреля 2020

Я изучаю 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), программа перестает работать правильно. Пожалуйста, объясните мне, что происходит! Заранее спасибо!

...