Как AX, AH, AL отображаются на EAX?

Мое понимание регистров x86 говорит о том, что к каждому регистру может обращаться весь 32-битный код, и он разбит на несколько доступных регистров.

В этом примере EAX будучи 32-битным регистром, если мы называем AX он должен вернуть первые 16 бит, и если мы вызываем AH или же AL он должен вернуть следующие 8 бит после 16 бит и AL должен вернуть последние 8 бит.

Так что мой вопрос, потому что я не совсем верю, это то, как это работает. Если мы храним 32-битное значение семь... иначе EAX хранения

0000 0000 0000 0000 0000 0000 0000 0111

Так что, если мы получим доступ AX должно вернуться

0000 0000 0000 0000

если мы прочитаем AH должно вернуться

0000 0000

и когда мы читаем AL должно вернуться

0000 0111

Это правильно? и если это то, что делает ценность AH действительно держать?

7 ответов

Решение

Нет, это не совсем верно.

EAX is the full 32-bit value
AX is the lower 16-bits
AL is the lower 8 bits
AH is the bits 8 through 15 (zero-based)

Редактировать:

Для полноты, в дополнение к вышеизложенному, основанном на 32-битном процессоре, 64-битные процессоры Intel/AMD имеют

RAX, which hold a 64-bit value, and where EAX is mapped to the lower 32 bits.
| 0000 0001 0010 0011 0100 0101 0110 0111 | ------> EAX

|                     0100 0101 0110 0111 | ------> AX

|                               0110 0111 | ------> AL

|                     0100 0101           | ------> AH

AX - это 16 младших битов EAX. AH - это 8 старших бит AX (т.е. 8-15 битов EAX), а AL - младший байт (биты 0-7) EAX, а также AX.

Пример (шестнадцатеричные цифры):

EAX: 12 34 56 78
AX: 56 78
AH: 56
AL: 78

Нет, твой ответ неправ

Выбор Al и Ah из AX, а не из EAX

например

EAX=0000 0000 0000 0000 0000 0000 0000 0111

Так что если мы вызываем AX, он должен вернуть

0000 0000 0000 0111

если мы позвоним AH, он должен вернуться

0000 0000

и когда мы вызываем AL, он должен вернуться

0000 0111

Пример № 2

EAX: 22 33 55 77
AX: 55 77
AH: 55    
AL: 77

пример 3

EAX: 1111 0000 0000 0000 0000 0000 0000 0111    
AX= 0000 0000 0000 0111
AH= 0000 0000
AL= 0000 0111  

В следующем фрагменте рассматривается EAX с использованием GDB.

    (gdb) info register eax
    eax            0xaa55   43605
    (gdb) info register ax
    ax             0xaa55   -21931
    (gdb) info register ah
    ah             0xaa -86
    (gdb) info register al
    al             0x55 85
  1. EAX - полное 32-битное значение
  2. AX - нижнее 16-битное значение
  3. AH - биты с 8 до 15
  4. AL - младшие 8 бит EAX/AX

Нет - AL - это 8 младших разрядов AX. AX - это 16 младших разрядов EAX.

Возможно, с этим проще всего разобраться, если мы начнем с 04030201h в eax. В этом случае AX будет содержать 0201h, AH будет содержать 02h, а AL будет содержать 01h.

Это карта регистров доступа:Тогда вы сможете понятьEAX,AX,AH,ALрегистр:

      | 00000000 11111111 11111111 00000000 | | EAX |
|                   11111111 00000000 | | AX  |
|                   11111111          | | AH  |
|                            00000000 | | AL  |

Другой пример:

      | 10110101 11010101 10100110 00001111 | | EAX |
|                   10100110 00001111 | | AX  |
|                   10100110          | | AH  |
|                            00001111 | | AL  |

Потому что из сборки x86/архитектуры x86 :

Наименее значащий байт (LSB), или младшая половина, определяется путем замены «X» на «L». Вместо этого в наиболее значимом байте (MSB) или старшей половине используется буква «H».

Другие вопросы по тегам