Уиллер Джамп
« Прыжок Уиллера» — это тип методологии вызова подпрограмм , которая использовалась на некоторых ранних компьютерах, в которых отсутствовала аппаратная поддержка сохранения адреса возврата. Концепция была разработана Дэвидом Уилером во время работы над новаторской машиной EDSAC в 1950-х годах. [1] EDSAC не был создан с учетом подпрограмм, и у него не было подходящего регистра процессора или аппаратного стека , который мог бы позволить легко сохранить адрес возврата.
Решением Уиллера был особый способ написания кода подпрограммы. Для реализации последней строкой подпрограммы была инструкция «перейти по этому адресу», за которой обычно следует ячейка памяти. В подпрограмме Уиллера этому адресу обычно присваивалось фиктивное число, например 0.
Чтобы вызвать подпрограмму, адрес вызывающей стороны должен быть помещен в аккумулятор , а затем код перешел к начальной точке подпрограммы. Первые инструкции в процедуре будут вычислять адрес возврата на основе значения в аккумуляторе (обычно это следующая ячейка памяти, поэтому приращения будет достаточно), а затем записывать результат по заранее отведенному фиктивному адресу. Когда процедура выполняется, она естественным образом достигает конца процедуры, который теперь говорит «перейти к обратному адресу».
Поскольку запись в память — медленный процесс по сравнению с доступом к регистру, этот метод не особенно быстр. Он также не способен выражать рекурсию . [2] Добавление новых регистров для такого рода обязанностей было ключевой целью разработки EDSAC 2 .
Пример
[ редактировать ]Этот пример демонстрирует технику использования псевдоассемблера для простой байт-ориентированной машины на основе аккумулятора с одним регистром A:
'prepare to call the subroutine 10 COPY PC TO A ' copy the program counter (10) into the accumulator 11 JUMP ' jump to... 12 70 ' ... location 70 ... many more lines... 70 ADD CONST ' add the following value to the accumulator... 71 3 ' ... three locations past the original PC value 72 STORE ' store the value in the accumulator to... 73 91 ' ... the set-aside memory location ... lines that perform the actual subroutine... 90 JUMP ' return to... 91 0 ' ... which will be replaced by 13
Когда этот код завершится, инструкция JUMP по адресу 90 естественным образом вернется в позицию 13, следующую инструкцию после подпрограммы.
Ссылки
[ редактировать ]- ^ Хилл, Марк (2000). Чтения по компьютерной архитектуре . Профессиональное издательство Персидского залива. п. 3. ISBN 9781558605398 .
- ^ Профессор Дэвид Брейлсфорд, Шон Райли (6 февраля 2018 г.). Прыжок Уиллера . Компьютерфил; Школа компьютерных наук Ноттингемского университета, Великобритания . Проверено 30 марта 2023 г.