Вот еще вопрос кстати пришел на ум. В нашем ассемблере есть абсолютная и относительная адресации (кроме других). В зависимости от указаний ассемблеру он по-разному скомпилирует например такое:
1) при директиве .ENABL AMA
2) без принуждения абсолютной адресацииКод:clr VAR000 ; 005037 002000 (абс. адрес) ; эквивалентно clr @#VAR000
И вот что-то я никогда обычно принудительно директиву абсолютной адресации не ставил. А тут задумался - оно ведь должно быстрее работать, или нет?Код:clr VAR000 ; 005067 001420 (cмещение)
(при абсолютном адресе процессору ведь не надо ничего складывать чтобы адрес получить... вроде)
Давай рассмотрим два твоих варианта основываясь на микрокоде ВМ2.
@(PC)+ (абсолютный адрес переменной):
1. Ожидаем готовности BRI (буферного регистра инструкции), чтобы в него загрузилось следующее слово
2. АЛУ: Вычисляем адрес = BRI (4 такта) и запрашиваем цикл чтения шины
3. Ожидаем готовности BRD (буферного регистра данных)
4. АЛУ: Вычисляем CLR (4 такта) и запрашиваем цикл записи шины
5. Переходим на команду выбора следующей некэшированной инструкции (т.к. мы адресовались по R7).
X(PC) (относительный адрес переменной):
1. Ожидаем готовности BRI (буферного регистра инструкции), чтобы в него загрузилось следующее слово
2. АЛУ: Вычисляем адрес = BRI+PC (4 такта) и запрашиваем цикл чтения шины
3, 4, 5 шаги такие же, как и в предыдущем варианте.
Итого, по скорости абсолютно все равно, какой вариант.
- - - Добавлено - - -
АЛУ у ВМ2 очень гибкое, и легко вычисляет сложные исполнительные адреса одной операцией.
BlaireCas (10.12.2020)
Но это справедливо именно для 1801ВМ2... Благо его исследовали
Для других процессоров могут быть сюрпризы ...
Проверил на железке. Убедился что скомпилировались разные команды (005067 и 005037)
Так и есть. Время абсолютно одинаково. (64.34сек на 10m операций clr memory с оверхедом на ~1m sob-ов, кст небыстро)
Но... Но .. как, Холмс? (с)
Ведь надо-же сначала сложить, а потом отправлять адрес на шину...
(кст вывод секунд не мой, взят и теста числа ПИ на разных процессорах, вроде честно выдает)Код:.MCALL .exit, .gtim, .ttyout, .gval .radix 10 CONFIG = ^O300 START: ; test 1 .gtim #area, #time call PAYLD1 call PRIDIF ; clearing just in case mov #time, R0 mov #6, R1 clr (R0)+ sob R1, .-2 ; test 2 .gtim #area, #time call PAYLD2 call PRIDIF .exit ; payload 1 VAR000: .WORD 0 PAYLD1: mov #1000, R3 5$: mov #1000, R2 10$: clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 clr VAR000 sob R2, 10$ sob R3, 5$ return ; payload 2 PAYLD2: mov #1000, R3 5$: mov #1000, R2 10$: clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 clr @#VAR000 sob R2, 10$ sob R3, 5$ return ; print diff in sec PRIDIF: mov #time2, r1 .gtim #area, r1 sub @#time+2, @#time2+2 sbc @#time2 sub @#time, @#time2 mov @#time2, r2 mov @#time2+2, r3 asl r3 rol r2 .gval #area, #CONFIG mov r0, r4 mov r3, r1 mov r2, r0 bit #32, r4 ;50 or 60 Hz? bne l206 asl r1 ;*5 rol r0 add @#time2+2, r1 adc r0 add @#time2, r0 asl r1 ; divisor is limited to 15 bits! rol r0 mov r0, r3 clr r2 div #3, r2 mov r3, r0 asr r0 ror r1 div #3, r0 asr r1 add r0, r1 clr r0 asr r2 ror r0 add r0, r1 adc r2 mov r2, r0 l206: call @#printsec ; prints r0:r1 mov #10, r0 .ttyout mov #13, r0 .ttyout return ; prints R0:R1/100 printsec: mov r1, r2 mov r0, r1 clr r4 mov #1, r5 mov #34464, r3 ;100000-65536 call @#20$ clr r5 mov #10000, r3 call @#20$ mov #1000, r3 call @#20$ inc r4 mov #100, r3 call @#20$ movb #'., r0 .ttyout mov #10, r3 call @#20$ mov r2, r0 2$: add #48, r0 .ttyout inc r4 5$: return 7$: tst r4 bne 2$ tst r0 beq 5$ inc r4 br 2$ 20$: mov #65535, r0 4$: inc r0 cmp r1, r5 bcs 7$ bne 8$ cmp r2, r3 bcs 7$ 8$: sub r3, r2 sbc r1 sub r5, r1 br 4$ time: .word 0, 0 ; high, low! time2: .word 0, 0 area: .word 0, 0 .END START
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)