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 

принимать L8-битный регистр, где 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
Другие вопросы по тегам