Я натолкнулся на следующий ассемблерный код, но я его не понимаю.Я не понимаю этот фрагмент сборки, я просто наткнулся на
hang:
times 512-($-$$) db 0
Может ли кто-нибудь объяснить мне, что происходит?
Я натолкнулся на следующий ассемблерный код, но я его не понимаю.Я не понимаю этот фрагмент сборки, я просто наткнулся на
hang:
times 512-($-$$) db 0
Может ли кто-нибудь объяснить мне, что происходит?
Это приведет к зависанию программы, перейдя в бесконечный цикл, потому что jmp hang
прыгает в себя.
Этот код используется для заполнения оставшейся программы 0 (что, если im не ошибочно, является чем-то вроде инструкции «добавить»). Обычно он используется в загрузочном коде, чтобы поместить подпись mbr в конец, и так как в терминах «код» он не должен выполняться.
В заключение:
Это не выполняет остановку.
Он используется, чтобы заполнить файл программы с «00», пока она не достигнет 512 байт
Чтобы остановить программу делать что-то вроде (в выходной файл ассемблера Он ничего не делает во время выполнения!):
halt:
jmp halt
Возможно, вам нужна настоящая инструкция 'hlt'. Это «останавливает» процессор, но только до тех пор, пока не произойдет прерывание. Это позволяет процессору немного охладиться. Если там есть «cli», прерывание никогда не должно происходить ... но NMI (не маскируемое прерывание) все еще может, поэтому мы все еще хотим, чтобы «jmp halt» показывался как нитрид галлия. –
Я только что отредактировал код. – saplingPro
Линия 'times' просто заполняет файл 512 байтами. Часто вы увидите 'times 510 - ($ - $$) db 0', за которым следует' db 55', 'db 0AAh' -« подпись загрузки ». «$» Означает (примерно) «здесь» - текущее местоположение в сборке. «$$» означает «начало раздела», поэтому «($ - $$)» означает «длина кода до сих пор». Как указывает Натан, вы обычно хотите, чтобы «jmp зависал» первым. Не предполагается, что выполняется строка 'times'! –
Это заставляет меня помнить о добрых днях программирования mbr :) –