Сборка - Как работает 0x80 с ecx = esp? - PullRequest
0 голосов
/ 11 марта 2012

У меня есть следующий код:

Doit: mov eax, 4 ; for write system call
      push Dword, 0x44434241
      mov ebx, 1
      mov ecx, esp
      mov edx, 4
      int 0x80
      add esp, 4
      ret

Когда я проверяю, это напечатано "ABCD", но почему?Как я понял, в стеке мы имеем следующую картинку:

Низкий --- 0x41 0x42 0x43 0x44 - esp,

, т.е. esp - точка 0x44Когда мы звоним 0x80.на нем должно быть напечатано «DCBA».Что я пропустил?

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Ваше изображение в стеке неверно. Поскольку x86 - это архитектура с прямым порядком байтов, ESP равен адресу младшего байта в передаваемом значении или 0x41.

От Бесценное руководство Intel по архитектуре :

Когда элемент помещается в стек, процессор уменьшает Регистр ESP, затем записывает элемент в новую вершину стека.

1 голос
/ 11 марта 2012

Это просто проблема endianness . Вы просто помещаете 32-битное значение в стек, который будет находиться по адресу ESP. x86 имеет младший порядок байтов и сначала сохраняет младший байт:

ESP + 0 (0x41), ESP + 1 (0x42), ESP + 2 (0x43), ESP + 3 (0x44). Однако при обращении к нему как к массиву байтов начинает в ESP и увеличивается через память.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 ''.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...