Насколько я себе представляю - на ВМ2 и ВМ3 будет сбиваться конвейер
Вид для печати
Вот еще вопрос кстати пришел на ум. В нашем ассемблере есть абсолютная и относительная адресации (кроме других). В зависимости от указаний ассемблеру он по-разному скомпилирует например такое:
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 очень гибкое, и легко вычисляет сложные исполнительные адреса одной операцией.
Но это справедливо именно для 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