По сути, это потому, что каждый раз, когда вы изменяете индекс, вы должны делать оператор if.
Давайте рассмотрим простой цикл C:
int ary[X] = {...}; // Purposefully leaving size and initializer unknown
for(int ix=0; ix< 23; ix++){
printf("ary[%d]=%d\n", ix, ary[ix]);
}
если у нас есть проверка границ, сгенерированный код для ary[ix]
должен выглядеть примерно так:
LOOP:
INC IX ; add `1 to ix
CMP IX, 23 ; while test
CMP IX, X ; compare IX and X
JGE ERROR ; if IX >= X jump to ERROR
LD R1, IX ; put the value of IX into register 1
LD R2, ARY+IX ; put the array value in R2
LA R3, Str42 ; STR42 is the format string
JSR PRINTF ; now we call the printf routine
J LOOP ; go back to the top of the loop
;;; somewhere else in the code
ERROR:
HCF ; halt and catch fire
Если у нас нет этой проверки границ, то вместо этого мы можем написать:
LD R1, IX
LOOP:
CMP IX, 23
JGE END
LD R2, ARY+R1
JSR PRINTF
INC R1
J LOOP
Это сохраняет 3-4 инструкции в цикле, что (особенно в старые времена) много значило.
На самом деле, на машинах PDP-11 было даже лучше, потому что было что-то, называемое «автоинкрементная адресация». На PDP все содержимое регистра и т. Д. Превратилось во что-то вроде
CZ -(IX), END ; compare IX to zero, then decrement; jump to END if zero
(И любой, кто помнит PDP лучше, чем я, не доставляет мне проблем с точным синтаксисом и т. Д., Вы старый пердун, как я, вы знаете, как эти вещи ускользают.)