Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2020, 10:33   #1
Vladimir.1982
Форумчанин
 
Регистрация: 30.04.2018
Сообщений: 171
По умолчанию Регистры bp и sp

Зачем нужны регистры bp, sp и что значит этот код?

Код:
push bp
mov bp, sp
пример из кода:

Код:
format mz
jmp start

function:
push bp
mov bp, sp
push ax
push bx

mov ax, [ss:bp+4+4]
mov bx, [ss:bp+4+2]
add ax, bx
mov bx, [ss:bp+4+0]
add ax, bx
mov [ss:bp+4+6], ax

pop bx
pop ax
pop bp

ret

start:

;7+1+3
push 0 ; Result
push 7 ; a
push 1 ; b
push 3 ; c

call function

pop ax
pop ax
pop ax

pop ax

exit:

mov ax, 4c00h
int 21h
Vladimir.1982 вне форума Ответить с цитированием
Старый 03.05.2020, 11:08   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Регистров у вас ограниченное число. Каждый регистр это ячейка с данными. Стек нужен для расширения ячеек.

У функции есть параметры которые передаются в функцию. Есть локальные переменные. И есть ещё временные переменные которые нужны для вычисления сложных выражений.

Эти две строчки это пролог функции
Код:
push bp            // сохраняем текущую базу стековго-фрейма
mov bp, sp       // создаем новую базу
Эпилог у вас состоит так же из 2-х строчек
Код:
pop bp
ret
Выше bp у вас располагаются - параметры.
Ниже bp располагаются локальные переменные. Ещё ниже временные переменные.



В вашей функции локальных переменных нет. Есть только временные, вот тут в них сохраняются регистры AX, BX
Код:
push ax
push bx
push изменяет регистр sp.

И было бы очень неудобно каждый раз вычислять где у вас лежат параметры.
Поэтому и используют регистр bp который в приделах функции не меняется.

Тут вчитываются параметры в регистры
Код:
mov ax, [ss:bp+4+4]
mov bx, [ss:bp+4+2]
Видно что все параметры передаются через стек. Есть разные договоренности о том как передавать переменные в функции. stdcall все параметры передаются через стек. В fascall используются регистры AX, DX, BX а остальное кладётся в стек.

Поподробнее про пролог и эпилог можно прочитать здесь:
https://files.nazaryev.ru/books/reve...-beginners.pdf

Вообще у вас неумеха писал код. Очистка стека это обычно задача функции.
Код:
pop ax
pop ax
pop ax

pop ax
и делается это одной строчкой
Код:
ret 8
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.05.2020 в 11:25.
Pavia вне форума Ответить с цитированием
Старый 03.05.2020, 11:25   #3
Vladimir.1982
Форумчанин
 
Регистрация: 30.04.2018
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Регистров у вас ограниченное число ...
Спасибо!
Vladimir.1982 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
регистры pcmax Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 20.04.2018 03:20
Что это за регистры fs,gs? SwiP Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 14.10.2010 21:50
Регистры Волк Microsoft Office Excel 9 08.04.2009 16:07
Регистры Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 10.02.2008 19:49