Intel 8080: расчет смещения памяти
Я читаю это руководство об эмуляторе Intel 8080 Emulator 101, и когда я читаю код, чтобы проверить, что я написал, я наткнулся на это
case 0x36: //MVI M,byte
{
//AC set if lower nibble of h was zero prior to dec
uint16_t offset = (state->h<<8) | state->l;
state->memory[offset] = opcode[1];
state->pc++;
}
break;
из книги под названием Intel 8080/8085 Программирование на ассемблере, я читал о MVI это
Эта инструкция копирует данные, хранящиеся во втором байте, в область памяти, адресуемую H и L. M является символической ссылкой на пару регистров H и L.
так что я предполагаю, что смещение - это область памяти, адресуемая H и L, но почему мы делаем это таким образом? То есть (state->h<<8) | state->l
Спасибо
1 ответ
как сочетания << и | дает нам 16-битное смещение?
принимать H
8-битный регистр, где H 7 - старший бит, а H 0 - младший бит:
H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0
принимать L
8-битный регистр, где L 7 - старший бит, а L 0 - младший бит:
L 7 L 6 L 5 L 4 L 3 L 2 L 1 L 0
Теперь вы хотите построить 16-битное смещение, которое получается в результате объединения H
(Самые высокие 8 бит) и L
(Не более 8 бит.) В C/C++/Java это может быть достигнуто с помощью 8-битного сдвига влево <<
с последующим побитовым или |
следующее:
H = H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 H << 8 = H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 0 0 0 0 0 0 0 0 H << 8 | L = H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 L 7 L 6 L 5 L 4 L 3 L 2 L 1 L 0