формат objdump для функции, написанной на C и asm

Рассмотрим следующий код C:

void zero_c(char* buffer, int bytes) {
  for (int i = 0; i < bytes; ++i) {
    *buffer = 0;
    ++buffer;
  }
}

И следующий ассемблерный код:

global zero_asm

segment .text
zero_asm:
  cmp rsi, 0x0
  jle end
  xor rax, rax
  mov rax, rdi
  add rax, rsi
me: 
  mov BYTE [rdi], 0x0
  inc rdi
  cmp rdi, rax
  jne me
end:
  ret

Я поставил обе эти функции в один бинарник, и смотрю сборку через objdump. Вот результат.

00000000004009b0 <zero_c(char*, int)>:
  4009b0:       85 f6                   test   esi,esi
  4009b2:       7e 17                   jle    4009cb <zero_c(char*, int)+0x1b>
  4009b4:       8d 46 ff                lea    eax,[rsi-0x1]
  4009b7:       48 8d 44 07 01          lea    rax,[rdi+rax*1+0x1]
  4009bc:       0f 1f 40 00             nop    DWORD PTR [rax+0x0]
  4009c0:       c6 07 00                mov    BYTE PTR [rdi],0x0
  4009c3:       48 ff c7                inc    rdi
  4009c6:       48 39 c7                cmp    rdi,rax
  4009c9:       75 f5                   jne    4009c0 <zero_c(char*, int)+0x10>
  4009cb:       c3                      ret    
  4009cc:       0f 1f 40 00             nop    DWORD PTR [rax+0x0]

00000000004009d0 <zero_asm>:
  4009d0:       48 83 fe 00             cmp    rsi,0x0
  4009d4:       7e 14                   jle    4009ea <end>
  4009d6:       48 31 c0                xor    rax,rax
  4009d9:       48 89 f8                mov    rax,rdi
  4009dc:       48 01 f0                add    rax,rsi

00000000004009df <me>:
  4009df:       c6 07 00                mov    BYTE PTR [rdi],0x0
  4009e2:       48 ff c7                inc    rdi
  4009e5:       48 39 c7                cmp    rdi,rax
  4009e8:       75 f5                   jne    4009df <me>

00000000004009ea <end>:
  4009ea:       c3                      ret    
  4009eb:       0f 1f 44 00 00          nop    DWORD PTR [rax+rax*1+0x0]

Как видите, objdump показывает функцию C в одном большом двоичном объекте, тогда как функцию asm, которую я написал, показывает в трех секциях. Есть ли способ, с помощью которого я могу написать свою сборку, чтобы она отображалась только как одна капля, как это делает функция C. (Я использую ассемблер nasm для компиляции моей сборки)


person skgbanga    schedule 28.01.2020    source источник
comment
Почему тебя это беспокоит? Процессор этого не делает. Это просто objdump форматирование вывода, разбивая метки.   -  person Jester    schedule 28.01.2020
comment
Единственное отличие заключается в том, что objdump вставляет пустую строку перед каждой из ваших меток (me, end). код, сгенерированный gcc, использует ассемблер GNU локальные символы, где символы, начинающиеся с .L, не включаются в качестве символов в объектный файл.   -  person Nate Eldredge    schedule 28.01.2020
comment
Очевидно, вы не можете сказать nasm не помещать все символы в таблицу. См. этот вопрос.   -  person Jester    schedule 28.01.2020
comment
@Jester Это праздное любопытство, но вы можете себе представить, что «я» и «конец» - это просто локальные символы, которые не должны появляться в выводе nm. (в настоящее время они видны). И спасибо за ссылку на этот вопрос!   -  person skgbanga    schedule 28.01.2020
comment
@NateEldredge, это имеет смысл. Вкупе с вопросом, которым поделился шут, думаю, это все объясняет.   -  person skgbanga    schedule 28.01.2020
comment
Затем я собираюсь закрыть как дубликат.   -  person Jester    schedule 28.01.2020