Мне нужна помощь в понимании того, как регистры стека работают в ассемблере x86. Фрагменты кода ниже взяты из загрузчика, который я изучаю.
Функция печати принимает три «аргумента». Поскольку я помещаю все три в стек, я ожидаю, что sp
будет равно 0xfff9
. bp
принимает один и тот же адрес один раз в функции печати.
Почему я должен делать [bp+4]
вместо [bp+2]
? Поскольку переменные, которые я вставил в местоположения 0xfffd
, 0xfffb
и 0xfff9
, не являются? Затем, когда я возвращаюсь из функции печати, я добавляю add sp, 6
, чтобы восстановить sp в том же месте перед печатью.
; stack initialization
mov ax, 0x0000
mov ss, ax
mov sp, 0xffff
mov bp, 0xffff
EDIT Забыли про адрес возврата функции.