Функции Java на языке ассемблера Hack

Как реализовать функцию Java в Hack Assembly? Я знаю, что инструкции по изменению переменных легко сделать, но как HACK вызывает функцию? Например:

function(int a, int b) {
if (a-b > 0)
return a;
else
return b;
}

Мой (я думаю, неправильный) результат:

@a
D=M
@b
D=D-M 
@JUMPMARK1
D;JGT
@Jumpmark2
0;JMP
(JUMPMARK1)
@a
D=M 
@function
M=D
(Jumpmark2)
@b
D=M
@function
M=D

Итак, проблема в том, что я не знаю, где хранить результат (возврат). Должен ли я создать переменную, как в этом примере, для функции и сохранить ее там?


person J.Dean    schedule 07.08.2018    source источник
comment
Вы спрашиваете о реализации всех возможностей языка Java в целом или только об этой конкретной функции Java? Если последнее, то ваш реальный вопрос заключается в том, как написать функцию max со знаком в Hack, желательно с использованием условной ветки. Если первое, то оно явно слишком широкое. Или вы в основном спрашиваете, как передавать и возвращать аргументы функции/возвращаемые значения? (На самом деле я вообще не знаю Hack, поэтому не могу ответить, только языки ассемблера для реальных процессоров, таких как x86, MIPS и ARM. Некоторые соглашения о вызовах x86 передают аргументы в стеке, но хорошие передают аргументы в регистрах.)   -  person Peter Cordes    schedule 07.08.2018


Ответы (1)


Чтобы реализовать настоящие вызовы функций в Hack, вам нужно сначала реализовать стек push-down. Как только это будет сделано, это будет относительно просто.

Затем, чтобы вызвать функцию, вы загружаете D с обратным адресом и нажимаете его. Для вызовов функций с одним параметром вы можете передать параметр функции в D; для вызовов с несколькими параметрами вам также потребуется поместить эти значения в стек.

Затем вы делаете безусловный переход к функции. В функции вы делаете все, что вам нужно (включая извлечение любых параметров из стека). Наконец, вы выталкиваете адрес возврата из стека в A и безоговорочно переходите.

Операцию возврата можно выполнить за 4 инструкции. Операция вызова требует 9 инструкций.

Если функции гарантированно нерекурсивны, вы можете обойтись без стека и поместить параметры функции, включая адрес возврата, в фиксированный блок памяти, связанный с каждой функцией.

person MadOverlord    schedule 07.08.2018
comment
Связано: Как C был перенесен на архитектуры без аппаратного стека? на retrocomputing.SE - person Peter Cordes; 08.08.2018