Как 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
- EAX - полное 32-битное значение
- AX - нижнее 16-битное значение
- AH - биты с 8 до 15
- 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».