20.05.2019, 20:56 [+3 UTC]
в нашей команде: 3 624 чел. | участники онлайн: 9 (рекорд: 21)

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

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

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.75 (18.05.2019)
JS-v.1.33 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
16.05.2019, 21:07

Последний вопрос:
20.05.2019, 20:36
Всего: 149653

Последний ответ:
20.05.2019, 18:18
Всего: 258494

Последняя рассылка:
20.05.2019, 20:15

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

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

Наша кнопка:

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

Отзывы о нас:
02.08.2012, 11:54 »
X-Driver
Спасибо, все получилось [вопрос № 186478, ответ № 271365]
06.10.2009, 18:18 »
Соколов В.В.
Программа работает, вопрос раскрыт полностью! Спасибо большое, помогло. Язык написания понятен, исчерпывающие комментарии и принцип работы. [вопрос № 172980, ответ № 255084]
01.12.2012, 09:27 »
Ляшенко Сергей Владимирович
оромное спасибо smile [вопрос № 186873, ответ № 271763]

РАЗДЕЛ • Assembler

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

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

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

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 612
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 274
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 130

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

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

Уважаемые эксперты!
Объясните, пожалуйста, смысл директивы "org".
От какого слова произошло название этой директивы?
Свойства этой директивы, что она делает, для чего предназначена?
Привожу свой конкретный пример, простая .com-программа (ниже).
В которой, я для опыта ввел директиву не "org 100h", а "org 110h".
Как работает данная директива "org" в моем примере?
CSEG segment
; org 100h
; org 200h
org 110h ; набираю данный вариант org 110h – для опыта!
Start:
mov ah, 9
mov dx, offset String
int 21h
mov ah, 10h
int 16h
int 20h
String db 'Нажмите любую клавишу …$'
CSEG ends
end Start
Данный исходный код ассемблируется, но, компоновщик выдает предупреждение - "LINK: warning L4055: start address not equal to 0x100 for /TINY"

Но, данная программа, я назвал ее prog02op.asm(com) – работает, - выводит часть строки.

Объясните, пожалуйста, как директива "org 110h", повлияла на то, что забиты только данные – ровно на 16 байтов (10h). Т.е. не отражается вот эта часть строки – "Нажмите любую кл".
При этом, как показывает отладчик AFD, сами команды не забиты, а код программы "prog02op.com", начинается все равно с адреса – сегмент:0100h.

Почему отладчик показывает адрес выводимой строки именно по смещению – "011Dh"? Прилагаю файл со screenshot-ами.

На данном примере, как-то не могу объяснить слова:
"Директива ORG объявляет адрес, начиная с которого будет ассемблироваться программа". Сайт: http://zxpress.ru/book_articles.php?id=1085
М.з. (мое замечание) но программа то ассемблируется все равно с адреса сегмент:0100h, а не с адреса сегмент:011h.

Или другой сайт про директиву org.
http://citforum.ru/programming/tasm3/tasm3_9.shtml
Вы можете использовать директиву ORG, чтобы установить счетчик адреса в значение текущего сегмента.
Перед данными или кодом, которые уже введены в сегмент, вы можете восстановить значение счетчика адреса. …
Используйте этот метод с осторожностью: вы можете непреднамеренно что-либо затереть.
М.з. (мое замечание) – что за счетчик адреса? Почему, в моем подопытном примере, затирается часть строки?

-----
 Прикрепленный файл: скачать (DOC) » [122.5 кб]

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

Здравствуйте, kerenskyaf!

Директива ORG ХХХХ -указывает, компилятору, что код будет расположен в памяти начиная с адреса ХХХХ, поэтому компилятор все смещения считает относительно этого адреса.

Смотрим(это снимок листинга компиляции):

Компилятор считая, что программист всегда знает, что он делает, создал код, как того хотел программист, расставив все смещения нужным образом. Создал СОМ-файл. Вот только смещение не стандартное и о нем не знает система, которая запускает этот файл, автоматически загружая его с адреса 0х100.
Думаю, теперь все ясно.

Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 20.05.2019, 12:26

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

+1

[подробно]

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

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

Мини-форум консультации № 195621
Kdsfofwe21
2-й класс

ID: 402218

# 1

= общий = | 15.05.2019, 19:40 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Здравствуй. на счёт лора названия директивы org ничего не скажу. но она нужна в исполняемых файлах что бы указать компилятору, что бы IP регистр - счётчик адреса начинался с адреса 100h, это делалось для резервирования памяти для структур в исполняемых файлах. На предупреждение линковщика Я бы не обращал внимания, но по написанному для него отступ в 110h видимо не стандартный поэтому и написал предупреждение. То что у Вас вывод строки не полный, это из-за того что у Вас сегментный регистр DS по умалчанию указывает на PSP, и по этой причине в регистр dx заносится адрес со смешением но в сегменте DS, то есть у Вас по факту происходит так - mov dx,offset ds:string, поэтому надо в регистр DS поместить регистр CS. На прямую из сегментного регистра в другой сегментный регистр перемещать данные нельзя, нужно пользоваться другими регистрами:
mov ax,cseg
mov ds,ax
...
добавьте эти две строки в самое начало кода, после метки start:
после чего будет браться смещение String, в сегментном адресе DS, который совпадает с CS.
Советую пользоваться дебаггером td.exe который идёт вместе с tasm'ом

-----
Последнее редактирование 15.05.2019, 19:42 Kdsfofwe21 (2-й класс)

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 2

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

Директива ORG ХХХХ -указывает, компилятору, что код будет расположен в памяти начиная с адреса ХХХХ, поэтому компилятор все смещения считает относительно этого адреса.

Программа СОМ, исторически АВТОМАТИЧЕСКИ грузится с адреса 0х100 и система к ней добавляет стандартный заголовок, длиной 256 байт. Это было сделано потому, что в то время основная часть программ писалась на асме и как правило их размер был меньше одного сегмента 64-е Кб. Т.к. все находилось в одном сегменте, то ничего настраивать не нужно, то стандартный заголовок убрали, и это экономило дисковое пространство, и без того маленькое(в то время), ну к примеру 100 программ по 256 байт - давало экономию почти 25-й килобайт.

Теперь по существу самого вопроса:

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

© Цитата: Kdsfofwe21
На предупреждение линковщика Я бы не обращал внимания, но по написанному для него отступ в 110h видимо не стандартный поэтому и написал предупреждение.

Любое предупреждение - говорит, что что-то пошло не так, а это может сыграть с Вами злую шутку, когда код начнет работать не так, как Вы это планировали.
smile

-----
Последнее редактирование 16.05.2019, 13:44 Зенченко Константин Николаевич (Старший модератор)

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

Зенченко Константин Николаевич
Старший модератор

ID: 31795

# 3

= общий = | 16.05.2019, 13:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Картинка не хочет рисоваться , продублирую файл листинга:

Код (Assembler) :: выделить код
0000				CSEG segment
				; org 100h
				; org 200h
				org 110h	; ­ ЎЁа о ¤ ­­л© ў аЁ ­в org 110h – ¤«п ®Їлв !
 0110				Start:
 0110  B4 09				mov ah, 9
 0112  BA 011D R			mov dx, offset String
 0115  CD 21				int 21h
 0117  B4 10				mov ah, 10h
 0119  CD 16				int 16h
 011B  CD 20				int 20h
 011D 8D A0 A6 AC A8 E2		String db 'Ќ ¦¬ЁвҐ «оЎго Є« ўЁиг …$'
       A5 20 AB EE A1 E3
       EE 20 AA AB A0 A2
       A8 E8 E3 20 85 24
 0135				CSEG ends
				end Start

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

-----
 Прикрепленный файл (кликните по картинке для увеличения):

 

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

Яндекс Rambler's Top100

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

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

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.75 от 18.05.2019
Версия JS: 1.33 | Версия CSS: 3.35