Why are some lines added and some deleted when running :%!xxd and :%!xxd -b commands on vim
Поскольку vim
считается 0x0a
новой строкой, а двоичный файл содержит эти (74 в вашей версии ls
... ), поэтому при переключении между необработанным двоичным файлом и какой-либо другой формой, эти 74 «строки» в двоичном файле будут удалены, а новые строки будут добавлены для (гораздо более подробного )шестнадцатеричного отображения. vim
просто подсчитывает число 0x0a
, которое он видит.
Now i wonder how the processor determines each instruction's opcode and operands
Магия! Это сложно, и есть много книг на эту тему. Вкратце, компоновщик(или эквивалент)для конкретного бинарного формата (ELF в вашем случае, хотя существуют и другие форматы — a.out, Mach -O,... )укажет на начальный адрес
$ readelf -h /bin/ls
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x37f0
...
что после того, как программа будет загружена в память, начнется выполнение кодов операций. Начальный адрес обычно (, но не может быть ), расположенным где-то в секции .text
двоичного файла :
$ objdump -DS /bin/ls | less -p.text
...
Что в моей системе OpenBSD показывает:
Disassembly of section.text:
00000000000037f0 <revnamecmp-0x460>:
37f0: 49 89 e4 mov %rsp,%r12
37f3: 48 83 ec 08 sub $0x8,%rsp
37f7: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
37fb: 48 83 c4 08 add $0x8,%rsp
...
Книги, на которые, возможно, стоит взглянуть, включают "Assembly Language Step -by -Step" Джеффа Дунтеманна и для ELF "Learning Linux Binary Analysis" Райана О'Нила.