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

Спасибо


person hakuna matata    schedule 24.11.2012    source источник
comment
Что вы имеете в виду, почему мы так поступаем? В документации говорится, что M - это соглашение для пары H и L, а регистры H и L объединены (через << и |) для получения 16-битного смещения. Что ты хочешь узнать еще раз?   -  person vladr    schedule 24.11.2012
comment
я имел в виду, как комбинация << и | дает нам 16-битное смещение?   -  person hakuna matata    schedule 24.11.2012
comment
Для представления 16-битного значения требуется два байта. Сдвиг влево на 8 бит помещает значение h во второй (h igh) байт (и 0 в младший байт), а | объединяет его с l ow byte (значение l), производя необходимое смещение. Изучите порядок байтов и побитовые операции.   -  person DCoder    schedule 24.11.2012
comment
Большое спасибо DCoder, это мне очень помогло.   -  person hakuna matata    schedule 24.11.2012


Ответы (1)


как происходит сочетание ‹< и | дает нам 16-битное смещение?

Возьмем H, 8-битный регистр, где H 7 - самый старший бит, а H 0 - младший бит:

H7H6H5H4H3H2H1H0

Take L, an 8-bit register, where L7 is the most significant bit and L0 is the least significant bit:

L7L6L5L4L3L2L1L0

Теперь вы хотите построить 16-битное смещение, которое получается в результате комбинирования H (H наивысших 8-битов) и L (L старших 8-битов.) В C / C ++. / Java это может быть достигнуто с помощью 8-битного сдвига влево <<, за которым следует побитовое или | следующим образом:

H      =                 H7H6H5H4H3H2H1H0
H<<8   = H7H6H5H4H3H2H1H00 0 0 0 0 0 0 0 
H<<8|L = H7H6H5H4H3H2H1H0L7L6L5L4L3L2L1L0
person vladr    schedule 24.11.2012