18.07.2018, 21:07 [+3 UTC]
в нашей команде: 2 883 чел. | участники онлайн: 2 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.47 (16.04.2018)

Общие новости:
13.04.2018, 10:33

Форум:
17.07.2018, 12:50

Последний вопрос:
16.07.2018, 07:17

Последний ответ:
13.07.2018, 17:32

Последняя рассылка:
18.07.2018, 16:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
07.07.2010, 05:53 »
MaksimDenisov
Благодарю за ответ! [вопрос № 179417, ответ № 262439]
18.05.2010, 00:35 »
Ольга Андреева
Спасибо большое за ссылку. Сейчас качаю эту програмку, думаю, что это то, что мне нужно. Обязательно напишу, как получилось. Еще раз спасибо. [вопрос № 178451, ответ № 261458]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 311
cain52
Статус: 1-й класс
Рейтинг: 3
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 0

Перейти к консультации №:
 

Консультация онлайн # 191723
Раздел: • Assembler
Автор вопроса: kerenskyaf (Посетитель)
Отправлена: 10.11.2017, 19:46
Поступило ответов: 1

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

почему "Многие уже, наверное, заметили, что при запуске какой-нибудь COM-программы регистр sp равен 0FFFEh"? А не 0FFFFh?

Состояние: Консультация закрыта

Ответ # 275600 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, kerenskyaf!
Четное значение вершины стека в 16-битном режиме процессора, а ДОС-овские программы работают именно в 16-битном режиме,
необходимо для выравнивания адреса на слово. Процессоры х86 так устроены, что они работают лучше всего, если адреса памяти выровнены на разрядность процессора.
Обычно выравнивание памяти происходит компиляторами (при компиляции) и ОС (при выполнении) автоматически.

Строго говоря, в незащищенном 16-битном режиме будет работать и с нечетной границей, просто при обращении к памяти будет тратиться лишний такт.
А вот в защищенных 32- и 64-битных режимах (в Windows или Linux) предусмотрен режим контроля выравнивания, при котором произойдет исключение, т.е. аварийное завершение. Отсюда, в 32- и 64-битном режимах точно необходимо выравнивать память на 4 и 8 байт соответственно.

Именно поэтому память, и особенно стек, желательно выравнивать на необходимую величину.

Как справедливо заметил Зенченко К.Н.:
Само значение 0xFFFE получается потому, что при запуске программы значение вершины стека SP = 0
Потом загрузчик программы выполняет команду PUSH 0, чтобы в стеке оказался адрес 0,
по которому в начале программного сегмента записывается команда int 20h.
Это сделано, чтобы работала команда ret, по которой перейдет управление как раз на адрес 0 и выполнится int 20h
А после выполнения PUSH 0 и получается, что SP = 0xFFFE


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.11.2017, 11:49

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 191723

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

 +1 
 
= общий = | 10.11.2017, 20:08 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
kerenskyaf:

На 16-битной машине регистр SP - 16-битный. Для работы с ним будет намного лучше, если и адресуемая память будет выровнена на 16 бит, т.е. на четное значение. Строго говоря, будет работать и с нечетной границей, но тогда при обращении к памяти будет тратиться лишний такт. Как-то неправильно и неэффективно. Именно поэтому память желательно выравнивать на необходимую величину. ОС и отладчики это делают автоматически.
То же самое относится и к 32- и 64-битным программам, где память желательно выравнивать , соответственно, на 4 и 8 байт.

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Коцюрбенко Алексей aka Жерар
Мастер-Эксперт

ID: 312929

# 2

 +1 
 
= общий = | 11.11.2017, 05:14 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
kerenskyaf:

Тем более, что в современных процессорах Intel (начиная ещё с 80486) предусмотрен режим контроля выравнивания, в котором любая команда, обратившаяся по адресу, не кратному размеру аргумента, вызывает прерывание.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 3

 +1 
 
= общий = | 13.11.2017, 10:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
kerenskyaf:

Когда компьютеры были большими, а ресурсов(памяти) мало, а 64-Кб кода так много(практически это 20 000 строчек кода). Разработчиками ОСей был придуман стандарт СОМ-файлов:код, данные и стек находятся в одном сегменте. В таких программах не нужно было настраивать сегменты и остальное что с этим связано. В целях экономии памяти носителей информации, система сама подставляла стандартный префикс программы(это аж 256-ть байт на каждую программу пользователя) и заносила в стек 0х0000(как метод защиты самой себя).
Смотрите пример с ошибкой:

Код (Assembler) :: выделить код
model	tiny
.code
org	100h
begin:
;какой то код пользователя
;вызов подпрограммы с ошибкой
	call	pppp
;вывод сообщения пользователю
	mov	ah,9
	lea	dx,dbMes
	int	21h
;завершение программы
	ret
pppp:
;какой то код подпрограммы
;ошибка пользователя - нарушение стека
	pop	ax
;какой то код и возврат из подпрограммы
	ret
;сообщение пользователю
dbMes	db	10,13,'message$'
	end	begin

Теперь пусть программист думает, почему сообщение не было выведено, а код завершился. При выполнении очередной команды выхода из подпрограммы - RET, управление передается по адресу CS : 0000, а там INT 20h - завершить СОМ-программу, а не непонятно куда.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

 +1 
 
= общий = | 14.11.2017, 11:33 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
kerenskyaf:

Здесь все понятно?

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

kerenskyaf
Посетитель

ID: 401455

# 5

= общий = | 15.11.2017, 23:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

СПАСИБО за консультации.
Данный вопрос Консультация онлайн # 191723, можно закрывать. В общих чертах - понятно! Мой уровень - "Hello! World!", поэтому ваш ответ от 10.11.2017, 21:08 - "... память желательно выравнивать на необходимую величину. ОС и отладчики это делают автоматически", мне более понятен. Пока этого достаточно!

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15784 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.47 от 16.04.2018