. Как эти конкретные директивы ассемблера (с использованием db и dw) вызывают перезагрузку компьютера?
спросил
Изменено 9 лет, 9 месяцев назад
Просмотрено 832 раза
Как эти 3 директивы ассемблера могут вызвать перезагрузку компьютера?
дб 0x0ea дв 0x0000 дв 0xffff
Я нашел это на http://fisnikhasani.com/building-your-own-bootloader/
Насколько я понимаю, эти 3 инструкции отправляют вас на FFFF:0000
, конец памяти, который вызывает перезагрузитесь, вызвав BIOS POST. Но разве не должна быть инструкция jmp
, чтобы сделать этот переход?
Также мне кажется, что в db 0x0ea
, ea есть машинная инструкция для jmp
. Если да, то как db 0x0ea
написать машинную инструкцию? Если
и dw
помимо объявления переменных имеют другие функции, то какие? Может кто-нибудь указать мне на дополнительную литературу о db
и dw
и любых его скрытых функциях.
- сборка
- x86
- загрузчик
Подумайте, что означает «объявление переменных» в контексте сборки. db
и dw
, когда указано значение, запишите это значение прямо в память. Код, с другой стороны, хранится в памяти в виде байтов. Вы можете заполнить память байтами, заставив ассемблер обработать ваш исходный код сборки, или вы можете найти кодировку инструкций и заполнить память байтами с помощью команд db/dw/dd.
Вот чем они здесь занимаются. Эта последовательность байтов — ea 00 00 ff ff — кодирует команду jmp far 0ffffh:0
.
3
Вы можете жестко закодировать инструкции, просто вставив соответствующие биты, используя определенные директивы ассемблера ( db
, dw
и т. д.). В 16-битном режиме байты $EA0000FFFF
дизассемблируются в:
ljmp $0xffff,$0x0
Что помещает значение $FFFF
в регистре CS
(сегмент кода) и $0000
в IP
(указатель инструкции). Это эффективно запускает выполнение кода из вектора сброса компьютера, который должен продолжить загрузку системы, как если бы вы только что ее включили.
db
и dw
не являются инструкциями по сборке, это инструкции псевдо . Их аргументы просто используются для инициализации байта или слова, выделенного псевдоинструкцией. Когда они используются в сегменте кода, их можно использовать для создания исполняемого кода.
Зарегистрируйтесь или войдите в систему
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Ассемблер Z80 — Директивы ассемблера
Ассемблер Z80 — Директивы ассемблерадб, дефб, дм или дефм
db означает «определить байт», dm — «определить сообщение».
Он позволяет определить из одного или нескольких литеральных байтов, а также строк байтов. Все определения должны быть разделены запятыми. Строки байтов должны быть между двойными цитаты. Пример кода: метка: equ 20
defb "Это текст", метка / 2, "Это еще текст", 10, 0
дв или дефв
dw означает «определить слово». Это удобная директива для определения
младший значащий байт первые два байтовых слова, как их использует Z80. Несколько
выражения, разделенные запятыми, могут быть указаны. Пример:
org 0x8000
pointertable: defw sub1, sub2
sub1: sub b
ret nz
sub2: ld h,0
ret
дс или деф
ds означает «определить пространство». Он принимает один или два аргумента, число и вал . Он резервирует num байт пространства и инициализирует их для вал . Если val опущен, по умолчанию используется 0. Пример:
буфер: defs 20
семерки: defs 10, 7
конец
В конце программы разрешено использовать директиву end. Там нет необходимости делать это. Все после этой директивы игнорируется. Это может можно использовать для добавления комментариев в конце.
орг
Устанавливает представление ассемблера о текущем адресе. Требуется один аргумент, который должен оцениваться как значение при первом проходе (он не может использовать метки, которые будут определены позже).
При запуске текущий адрес устанавливается равным 0. Обычно первый директива в программе org, чтобы установить начальный адрес.
Использование этой директивы более одного раза может быть полезно для создания кода, выполняться по тому же адресу, например, при отображении памяти. В начало каждой страницы, код может установить начальный адрес для сопоставления адрес. Ранее определенные страницы не перезаписываются.
Обратите внимание, что эта директива не генерирует никакого кода, поэтому, если байты заполнения
требуется, они должны быть вставлены с помощью defs. Org изменяет только ассемблер
представление о том, «где» оно находится. В следующем примере выходные данные содержат 4 байта:
23, 12, 00, 00. первая_метка: defw вторая_метка
орг 0x1234
вторая_метка: defw первая_метка
искать
Пользователи запросили возможность перезаписать сгенерированный вывод. Это для чего нужен поиск. Он будет искать в выходном файле и начнет перезаписывать предыдущий вывод. Это в основном полезно в сочетании с incbin. Это позволяет включенный двоичный файл должен быть «исправлен».
Если аргумент поиска больше, чем текущий размер вывода, файл расширен нулями.
включает
Как и в C (но без #), включает другой исходный файл. Нет
подстановка вообще делается в имени файла, что означает, что ~ не может быть
используется для ссылки на домашний каталог. Почти любой
имя возможно без escape-символов из-за правил кавычек.
первый непробельный символ после директивы include считается
начальная цитата. Затем имя файла считывается до конечной кавычки, которая
то же, что и начальная цитата. Пример:
включить 'math.asm'
включить -file'с "кавычками".asm-
включить zletter в виде кавычек и пробелов в name.asmz
ящик
Incbin означает «включить двоичный файл». Он позволяет использовать любые двоичные данные. дословно включены в вывод. Аргумент приводится так же, как для включения.
если, иначе, конец
При использовании этих условных операторов части кода могут быть опущены.
остальное можно повторять сколько угодно раз. Код, который не собран,
проверил правильность команды. В противном случае его не трогают, а это значит, что
если вы используете эти директивы, успешное выполнение ассемблера не подразумевает
что весь код правильный. Пример:
org 0x8000
включить "math.asm"
если $ < 0x9000 ; Выполните следующее, только если math.asm достаточно мал
ld a,3
else
ld a,6
else
; это также собирается только в том случае, если math.asm достаточно мал
ld h,8
endif
;это всегда собран
вызов math_init
макрос, endm
С помощью этих директив можно определить новые команды, которые будут выводить определенный код.