%AX = (%AH + %AL)
Так почему бы не %EAX = (%SOME_REGISTER + %AX) для какого-нибудь регистра %SOME_REGISTER?
@EvanTeran Можно ли получить верхнюю половину EAX, а также нижнюю половину?
@AndersonGreen: не напрямую (см. Диаграмму в ответе Майка Томпсона). Единственный способ получить верхнюю половину EAX - это немного сдвинуть / повернуть. Например: ROR EAX, 16; MOV DX AX; ROR EAX, 16. Это поместит старшие 16 бит EAX в DX, а затем восстановит EAX до его исходного значения. Лично мне хотелось бы увидеть псевдонимы регистров для верхних половин. Думаю, это сделало бы код более лаконичным.





В старые 8-битные времена был регистр A.
В 16-битные дни был 16-битный регистр AX, который был разделен на две 8-битные части, AH и AL, для тех времен, когда вы все еще хотели работать с 8-битными значениями.
В 32-битные дни был введен 32-битный регистр EAX, но все регистры AX, AH и AL были сохранены. Разработчики не сочли необходимым вводить новый 16-битный регистр, который адресовал бы биты с 16 по 31 EAX.
Сегодня он продолжает использовать 64-битные регистры, 64-битный регистр RAX включает EAX как младшие 32 бита.
«E» и «X» могут означать «расширенный», но что означает «R» в RAX?
Предположительно, "R" egister. Есть дополнительные новые регистры, которые просто названы R + number.
Я просмотрел руководство по AMD64 и до сих пор не понимаю, что означает R, кроме «регистр» - просто чтобы соответствовать их R8 - R15. (Кстати, я понятия не имею, почему, с их фиксацией на числах, они не просто переименовывают все существующие общие регистры. :-P)
т.е. R0 => RAX, R1 => RCX, R2 => RDX, R3 => RBX, R4 => RSP, R5 => RBP, R6 => RSI, R7 => RDI. :-) (Между прочим, это моя любимая мозоль, когда люди неправильно заказывают регистр; порядок AX, CX, DX, BX, SP, BP, SI, DI. :-P)
Какой регистр :-P? : D
Как назывались регистры в 8008 и почему 8080 не обеспечивал для них обратную совместимость?
@ffpf: :-P стоит после терминатора списка, точки (или точки, если вы американец, или точки, если вы математик); таким образом, это не считается. :-)
У 8008 был тот же набор регистров, что и у 8080, но счетчик программ (ПК) был всего 14 бит, поэтому он мог адресовать только 16K.
Я хочу программировать на языке, где :-P - регистр.
Вы все еще можете легко получить большую часть eax. Просто вычтите ax из eax, а затем разделите результат на 16.
@Austin - или сдвиньте вправо на 16, сохранив код операции и, что более важно, инструкцию деления. Не говоря уже о делении на 2 ^ 16. В противном случае, на место;)
@HughAllen, Paul Nathan и Curt Hagenlocher: буква «R» в «RAX», «RBX» и т. д. Сама по себе является аббревиатурой «Register Extension». Подумайте: «Расширение регистра для BX = RBX». См. Раздел 1.2.7 руководства программиста AMD: ptlsim.org/papers/x86-64/Opteron-InstructionSet-24594.pdf
@Chris Jester-Young: На самом деле вы можете использовать от R0 до R7 для обозначения исходных 8 георадаров, это не очень распространено. stackoverflow.com/questions/9129933/…
Просто для пояснения. На заре микропроцессоров 1970-х годов у ЦП было лишь небольшое количество регистров и очень ограниченный набор команд. Обычно арифметический блок мог работать только с одним регистром ЦП, часто называемым «аккумулятором». Аккумулятор на 8-ми битных процессорах 8080 и Z80 получил название «А». Было 6 других 8-битных регистров общего назначения: B, C, D, E, H и L. Эти шесть регистров можно было объединить в пары для образования 3 16-битных регистров: BC, DE и HL. Внутренне аккумулятор был объединен с регистром флагов, чтобы сформировать 16-битный регистр AF.
Когда Intel разработала 16-битное семейство 8086, они хотели иметь возможность переносить код 8080, поэтому они сохранили ту же базовую структуру регистров:
8080/Z80 8086
A AX
BC BX
DE CX
HL DX
IX SI
IY DI
Из-за необходимости переноса 8-битного кода им требовалось иметь возможность обращаться к отдельным 8-битным частям AX, BX, CX и DX. Они называются AL, AH для младшего и старшего байтов AX и так далее для BL / BH, CL / CH и DL / DH. IX и IY на Z80 когда-либо использовались только как 16-битные регистры указателя, поэтому не было необходимости обращаться к двум половинам SI и DI.
Когда в середине 1980-х был выпущен 80386, они создали «расширенные» версии всех регистров. Итак, AX стал EAX, BX стал EBX и т. д. Не было необходимости в доступе к старшим 16 битам этих новых расширенных регистров, поэтому они не создавали псевдорегистр EAXH.
AMD применила тот же трюк при производстве первых 64-битных процессоров. 64-битная версия регистра AX называется RAX. Итак, теперь у вас есть что-то вроде этого:
|63..32|31..16|15-8|7-0|
|AH.|AL.|
|AX.....|
|EAX............|
|RAX...................|
Обычно нет объяснения, почему нет псевдорегистратора, скажем, для 31..16 части EAX. Полагаю, в этом не было необходимости ...
Фактически, в Z80 есть недокументированная «функция» (которая на самом деле не является чипом Intel), которая позволяет вам обращаться к IX и IY как к старшим и младшим байтам. Код операции - это префикс + код операции HL; если вы используете код операции H или L, вы получите эффект полуслова.
Я бы сказал, соответствие регистров выглядит примерно так: 8080 / Z80, 8086, x86 Кодировка: A AX 000 BC CX 001 DE DX 010 HL BX 011 IX SI 110 IY DI 111
Для всех, кто хочет получить больше информации, это довольно полезный и краткий обзор cs.virginia.edu/~evans/cs216/guides/x86.html
Хотя регистры разделения, несомненно, были вдохновлены 8080, разделение регистров означало, что процессор можно было рассматривать как имеющий восемь 16-битных регистров и без 8-битных регистров, или 7 + 2, или 6 + 4, или 5 + 6. , или 4 + 8. В рукописной сборке было бы полезно, если бы один из 32-битных регистров был отделен от 16-битных, а DX: AX вместе вел себя как 32-битный регистр (что позволяло 7 + 2 + 0, 7+ 1 + 2 или 7 + 0 + 4 регистра по 32/16/8 бит каждый), но преимущества, вероятно, не оправдали бы сложность.
небольшая поправка, EAX не равно AX, точнее, AX представляет младшие 16 бит (половину) EAX. аналогично, AH и AL являются двумя половинами AX.