2015-12-10 6 views
1

Я написал следующую сборную программу, и я не уверен в значении некоторых скомпилированных инструкций и синтаксисе, в котором он представлен 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) - что это значит?

+1

Эти инструкции являются артефактом. Посмотрите на шестнадцатеричные значения .. они излагают «Hello world». Раздел данных содержит данные. –

+0

... о да. Ну, если бы они были настоящими инструкциями, то какой синтаксис, такой как 'insb (% dx),% es: (% edi)' означает? или 'outsl% ds: (% esi), (% dx)'? –

+1

Вы разобрали раздел данных. Это инструкции, представленные этой последовательностью байтов. Запуск их почти наверняка приведет к сбою вашей программы. 'insb' - это байтово-операндная форма' INS' (строка ввода из порта IO): 'INS m8, DX'. Операнды неявны, как и 'lodsb', а именно, что весь insn может быть одним байтом. См. Руководство по insn ref (связанное с http://stackoverflow.com/tags/x86/info), если вам интересно, что эти инструкции действительно делают. –

ответ

1

Для того, чтобы не получить неподходящий разборку секции .data, не используйте objdump вариант

  • -D, --disassemble-all содержимое дисплея ассемблера всех разделов

а

  • -d, --disassemble Отображение содержимого ассемблера Исполняемые секции

и в дополнение

  • -s, --full-contents Показать полное содержание всех разделов просил

, чтобы получить дамп данных:

 
Contents of section .data: 
80490a8 48656c6c 6f20776f 726c6421 0a00  Hello world!..