Разница между .text и .data - PullRequest
2 голосов
/ 21 июня 2019

Я хочу знать, в чем разница между разделом данных и текстовым разделом с точки зрения всего кода в конкретном разделе.

Я пытался запустить код, который я добавил здесь. В разделе данных он запускается и печатает «аф а» Если я изменю это на текстовый раздел в строке 2, это вызовет ошибку.

Я не могу понять, в чем принципиальные различия. Спасибо :)

global _start
section .data

_start: mov ecx, 3
    xor byte [_start + 1], 0x02
    pushad  
    mov eax, 4
    mov ebx, 1
    mov edx, ecx
    mov ecx, dword blah
    int 0x80
blah:   popad
    sub bx, ax
    loop _start
    mov eax, 1
    mov ebx, 2
    int 0x80
fin:

ожидаемый код даст тот же результат, но было доказано обратное.

1 Ответ

3 голосов
/ 22 июня 2019

разница между .text и .data

Я не знаю насчет ассемблера MASM, но ассемблер GNU имеет два отличия:

  1. Имя (.text в одном случае, .data в другом случае). Однако это имя игнорируется операционной системой.
  2. Флаги раздела в исполняемом файле:
    • SHF_ALLOC | SHF_EXECINSTR для .text и
    • SHF_ALLOC | SHF_WRITE для .data

«Флаги раздела» указывают операционной системе, какие данные присутствуют в разделе и какие операции разрешены:

  • SHF_EXECINSTR означает, что раздел содержит код, который может быть выполнен. Если этот флаг пропущен, в большинстве ОС произойдет сбой программы, если раздел содержит код. Старые 32-разрядные процессоры этого не поддерживали, поэтому этот флаг игнорировался многими ОС при запуске 32-разрядных программ. Очевидно, ваша ОС игнорирует этот флаг; в противном случае вариант .data вашей программы потерпит крах, поскольку код находится в разделе .data.

  • SHF_WRITE означает, что данные в разделе могут быть перезаписаны. Если этот флаг отсутствует и вы пытаетесь выполнить операцию записи данных в разделе, программа завершится сбоем.

Конечно, можно было бы манипулировать исполняемым файлом так, чтобы в разделе .text был установлен флаг SHF_WRITE. (И некоторые ассемблеры разрешают устанавливать этот флаг непосредственно для раздела .text.) В этом случае ваша программа не будет аварийно завершать работу, если вы запишете в раздел .text.

...