Я написал следующую сборную программу, и я не уверен в значении некоторых скомпилированных инструкций и синтаксисе, в котором он представлен objdump
.Неопределенный о некоторых инструкциях по разборке раздела данных
Собран с GCC версии 4.4.3, Linux версии ядра 2.6.32-21
hello.S:
.global _start
.global main
.section .text
_start:
call main
movl $1, %eax
movl $0, %ebx
int $0x80
main:
// Print "Hello World" to the screen
movl $4, %eax
movl $1, %ebx
movl $hello, %ecx
movl $13, %edx
int $0x80
// Exit programme with return value 0
movl $1, %eax
movl $0, %ebx
int $0x80
.section .data
hello: .string "Hello world!\n"
и скомпилирован с командой
gcc -nostdlib hello.S -o hello
Создает следующие инструкции , в частности в разделе .data
: gs
, insb
и outsl
; Какова цель этих инструкций?
Разборка секции .data:
080490ec <hello>:
80490ec: 48 dec %eax
80490ed: 65 gs
80490ee: 6c insb (%dx),%es:(%edi)
80490ef: 6c insb (%dx),%es:(%edi)
80490f0: 6f outsl %ds:(%esi),(%dx)
80490f1: 20 77 6f and %dh,0x6f(%edi)
80490f4: 72 6c jb 8049162 <_end+0x66>
80490f6: 64 21 0a and %ecx,%fs:(%edx)
Кроме того, синтаксис, такие как %ds:(%esi),(%dx)
- что это значит?
Эти инструкции являются артефактом. Посмотрите на шестнадцатеричные значения .. они излагают «Hello world». Раздел данных содержит данные. –
... о да. Ну, если бы они были настоящими инструкциями, то какой синтаксис, такой как 'insb (% dx),% es: (% edi)' означает? или 'outsl% ds: (% esi), (% dx)'? –
Вы разобрали раздел данных. Это инструкции, представленные этой последовательностью байтов. Запуск их почти наверняка приведет к сбою вашей программы. 'insb' - это байтово-операндная форма' INS' (строка ввода из порта IO): 'INS m8, DX'. Операнды неявны, как и 'lodsb', а именно, что весь insn может быть одним байтом. См. Руководство по insn ref (связанное с http://stackoverflow.com/tags/x86/info), если вам интересно, что эти инструкции действительно делают. –