Как изобразить двоичный логический код в трех адресах - PullRequest
0 голосов
/ 14 декабря 2018

В трехадресном коде ветвь может иметь только бинарный реляционный оператор,

например,

if x relop y goto L1, where relop is (!=,==,>,>=,<,<=)

Как будет представлено следующее представление в виде формата трех адресов:

j = 0
while(j < 10 || j < 20)
{
    System.out.println(i);
    j++;
}

Вот мое решение, которое явно неверно:

main:
        j = 1
        sum = 0
L2:
        if j < 10 || j < 20 goto L3
        goto L4
L3:
        mt2 = sum + 1
        sum = mt2
        mt3 = j + 1
        j = mt3
        goto L2
L4:
        sum = 2

1 Ответ

0 голосов
/ 14 декабря 2018

Вы разбиваете его на два теста:

L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3:

(Вы имели в виду j < 10 || j > 20? Как написано, первый тест избыточен.)

В общем, ||и && являются операторами потока управления и переводятся в отдельные инструкции ветвления.Обратите внимание, что логическое значение not часто реализуется путем перелистывания меток.

Булевы операторы обычно являются «короткими замыканиями», то есть правая операция не выполняется без необходимости - именно из-за этого переводастиль.Если бы второе вычисление было более сложным, оно было бы выполнено после первого if, что привело бы к короткому замыканию.

...