Инструкция ветвления, которая игнорирует важные данные?

У меня проблема с пониманием инструкции филиала 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 ответа

Решение

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

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

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

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

Другие вопросы по тегам