Несогласованная высота стопки 1! = 2 - PullRequest
0 голосов
/ 08 ноября 2019

поэтому я пытаюсь создать простой цикл for в Jasmin, который печатает привет мир каждый раз, когда проходит цикл. Проблема заключается в том, что всякий раз, когда я пытаюсь увеличить его, добавляя его, я получаю эту ошибку, которая говорит: «Ошибка: невозможно инициализировать тест основного класса. / lang / String;) V) Непоследовательная высота стека 1! = 2 "Это работает, когда я не пытаюсь добавить один, но не уверен, почему это не так, когда я возвращаю его обратно. Любая помощь будет оценена!

.class public test
.super java/lang/Object

.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public static main([Ljava/lang/String;)V
   .limit stack 5

   ldc 15
   ldc 1
startLoop:
   iflt endLoop
   getstatic java/lang/System/out Ljava/io/PrintStream;
   ldc "hello world"
   invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
   ldc 1
   iadd
   goto startLoop
endLoop:
   return
.end method

1 Ответ

0 голосов
/ 08 ноября 2019

Ваш код заканчивается с другой высотой стека в зависимости от того, переходите ли вы к endLoop сразу на первой итерации (верификатор не проверяет или не видит, что ваше значение никогда не меньше нуля) или прошел ли выцикл.

Имейте в виду, что iflt сравнивает вершину стека с нулем, и если она меньше нуля, она переходит к endLoop. В процессе он удаляет значение из верхней части стека.

После вашего первого iflt он удаляет значение 1 из верхней части стека. Затем он добавляет 1 к 15, оставляя значение 16 в стеке.

Следующая iflt извлекает значение 16 из стека - на следующей итерации iadd завершится ошибкой, поскольку в стеке есть только одно значение (1) и iadd необходимодва.

В качестве решения, вы, вероятно, захотите использовать if_icmpge, чтобы проверить, больше ли ваш счетчик, чем 15, и для каждого сравнения сначала вы хотите dup свой счетчик, а затем нажать константу 15 в стеке.

...