Инструкция ветвления, которая игнорирует важные данные? - PullRequest
1 голос
/ 02 марта 2012

У меня проблема с пониманием инструкции ветвления B arm926ejs_reset_handler, которая переходит на метку arm926ejs_reset_handler: и, таким образом, игнорирует промежуточный код.Интересно зачем кому-то это делать?

И еще несколько объяснений.Метка __start: является точкой входа в программу.Строки, которые игнорирует инструкция перехода, - это параметры, которые загрузочный ISROM должен был получить при запуске. Но как загрузочный ISROM может получить эти параметры, если мы перепрыгнем через них?Это не логично для меня.

__start:
arm926ejs_reset:
B     arm926ejs_reset_handler

    .word   0x41676d69
    .word   0,0,0,0,0
image_type:
    .word   0x0000000A
sizeOfPermanentCode:    
    .word   (__image_size)
    .word   0,0
bootparameter:  
    .word   0
    .word   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

arm926ejs_reset_handler:

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Существует разница между данными и кодом - код содержит инструкции, которые выполняются , а данные используются кодом. Принципиальное отличие состоит в том, что данные (как правило) не могут быть выполнены.

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

Конечно, код может получить доступ к данным, если он расположен перед текущим счетчиком программы (после перехода) - с точки зрения кода не имеет значения, если данные находятся до или после кода.

2 голосов
/ 02 марта 2012

Это просто ветвление по некоторым данным - код может получить эти данные через индексированную адресацию, используя __start или arm926ejs_reset в качестве базового адреса.

...