NASM на OS X работает с битом, а не с байтом - PullRequest
0 голосов
/ 09 марта 2012

Я работаю над своей первой программой NASM, и, пытаясь выяснить инструкцию not, я понял, что вместо инвертирования бита 0 он инвертирует байт 00000000. Как бы я сказал, чтобы он работал немного или как-то иначе это исправить? Вот мой код ...

section .text
  global start

start:
  mov eax, 255
  not eax
  push eax

  mov eax, 0x1
  sub esp, 4
  int 0x80

Не стесняйтесь указывать мне и мой ассемблерный код, поскольку я не хочу впадать в вредные привычки.

1 Ответ

4 голосов
/ 09 марта 2012

В большинстве компьютерных архитектур (включая x86) бит не является непосредственно адресуемой единицей памяти. Наименьшая единица, к которой вы можете непосредственно обратиться, - это байт, который содержит 8 бит на x86. Вы не указали, что именно вы пытаетесь выполнить, поэтому я не могу дать вам точное решение вашей проблемы, но работа с отдельными битами (или группами битов) чаще всего достигается путем маскировки битов, которые не представляют интереса для инструкции AND, в конечном итоге сдвигающей значение влево или вправо, а затем выполняющей обработку.

Если вы действительно хотите получить значение n -го бита в регистре, то вы, скорее всего, ищете инструкцию BT. В нем хранится значение n -го бита в флаге переноса.

Что касается других советов: инструкция push уменьшает указатель стека на количество байтов, помещенных в стек. Это характерно для архитектуры x86 - стек по дизайну растет вниз. Поэтому, если вы хотите освободить место в стеке, вы делаете add esp, number_of_bytes, а не sub (как вы сделали), что просто резервирует больше места в стеке.

...