Рассмотрим следующий код 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 для компиляции моей сборки)
objdump
форматирование вывода, разбивая метки. - person Jester   schedule 28.01.2020me
,end
). код, сгенерированный gcc, использует ассемблер GNU локальные символы, где символы, начинающиеся с.L
, не включаются в качестве символов в объектный файл. - person Nate Eldredge   schedule 28.01.2020nasm
не помещать все символы в таблицу. См. этот вопрос. - person Jester   schedule 28.01.2020nm
. (в настоящее время они видны). И спасибо за ссылку на этот вопрос! - person skgbanga   schedule 28.01.2020