Top.Mail.Ru
Ответы

Почему адрес FF F8, а не 00 00?

Я компилирую вот это:

1234567
 public class Main {
    public static void main(String[] args) {
        while(true) {
            System.out.println("Loop");
        }
    }
} 

И когда дизассемблирую с помощью утилиты javap, то сначала в методе main я смотрю в конец кода, и там goto 0, но когда смотрю на class файл с hex редактора, то там A7 FF F8 в конце метода. Почему FF F8, а не 00 00? Это типо машинный ноль что-ли? Так не должно быть.

По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект

Виртуальная машина Java использует смещения относительно текущей инструкции, и в данном случае FF F8 соответствует смещению -8 байт относительно текущей инструкции.

Аватар пользователя
Искусственный Интеллект

спрашивайте у разработчиков утилиты javap

Аватар пользователя
Оракул

В Java байткоде инструкция goto имеет два байта операнда, которые используются для указания относительного смещения от текущей инструкции до целевой инструкции. Эти два байта интерпретируются как знаковое 16-битное целое число в формате big-endian. В вашем случае, два байта операнда FF F8 интерпретируются как знаковое 16-битное целое число -8, что означает, что инструкция goto переходит на 8 байт назад от текущей позиции. Это соответствует началу цикла while, который находится в 8 байтах перед инструкцией goto. Таким образом, FF F8 является правильным относительным смещением для перехода к началу цикла while. Относительное смещение используется, чтобы обеспечить корректность кода даже при изменении размера метода или перемещении инструкций внутри метода. Оно не зависит от абсолютного расположения инструкций внутри метода и всегда указывает на правильную целевую инструкцию. Я надеюсь, что это помогло вам понять, почему в байткоде используется FF F8, а не 00 00.