Инструкция ветвления, которая игнорирует важные данные?
У меня проблема с пониманием инструкции филиала 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
в качестве базового адреса.