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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2012, 19:59   #1
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
Вопрос Работа со стэком (assembler)

Начал изучение ассемблера и дошёл до интересного момента. Часть кода:
Код:
...mov sp, offset metka
   mov ax, 0009h
   push ax
   mov cx,5
metka:
   mov ah,9
   mov dx, offset sign
   int 21h...
Здесь всё понятно, за исключением одного момента: почему после того как мы загнали в стэк значение 0009h (причем понятно, что последний байт на который будет показывать указатель стэка будет 00h) во время выполнения строки mov cx,5 значение счётчика меняется на 09h? какое отношение вообще имеет операция загрузки в регистр счётчика к стэку? Сколько ищу ответа - внятного найти получается.
Спасибо)
Pillllot вне форума Ответить с цитированием
Старый 05.02.2012, 21:04   #2
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

Цитата:
причем понятно, что последний байт на который будет показывать указатель стэка будет 00h
ты под x86 пишешь? little endian однако, после push sp должен указывать на 09, а не на 00. Возможно твой дебагер глючит, или что то не так делаешь
alexey2 вне форума Ответить с цитированием
Старый 05.02.2012, 21:15   #3
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Здесь всё правильно.
Так как изначально у вас сегмент стека и сегмент кода указывают на одно и то же (т.е. одинаково настроены), то команда mov sp, offset metka, устанавливает указатель стека в сегмент кода, а именно на конец команды mov cx, 5. Поэтому следующая команда push, переписывает исполняемый код, т.е. в данном случае меняет команду mov cx, 5 на команду mov cx, 9. Которая собственно затем и исполняется.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 05.02.2012, 21:15   #4
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
По умолчанию

alexey2, ты прав, на 09h - я не доглядел) А ответ на основной вопрос можешь дать?

Последний раз редактировалось Pillllot; 05.02.2012 в 21:40.
Pillllot вне форума Ответить с цитированием
Старый 05.02.2012, 21:21   #5
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Здесь всё правильно.
Так как изначально у вас сегмент стека и сегмент кода указывают на одно и то же (т.е. одинаково настроены), то команда mov sp, offset metka, устанавливает указатель стека в сегмент кода, а именно на конец команды mov cx, 5. Поэтому следующая команда push, переписывает исполняемый код, т.е. в данном случае меняет команду mov cx, 5 на команду mov cx, 9. Которая собственно затем и исполняется.
Отлично!!!) Спасибо большое, Ulex - всё понятно теперь) Супер!)
Pillllot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивом (assembler) sirex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 28.01.2010 14:35
Работа с массивами (assembler) erazer89 Помощь студентам 3 19.12.2008 21:25
Работа с массивами (assembler) deni Помощь студентам 2 12.12.2008 10:28
незнаю что сделать со СТЭКом Misho0k Паскаль, Turbo Pascal, PascalABC.NET 4 24.05.2008 23:01