Консультация № 195621
15.05.2019, 17:43
0.00 руб.
1 4 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, чтобы установить счетчик адреса в значение текущего сегмента.
Перед данными или кодом, которые уже введены в сегмент, вы можете восстановить значение счетчика адреса. …
Используйте этот метод с осторожностью: вы можете непреднамеренно что-либо затереть.
М.з. (мое замечание) – что за счетчик адреса? Почему, в моем подопытном примере, затирается часть строки?
Прикрепленные файлы:
2939500b60a3a930da358db1b1cb486bbd43a6b4.doc

Обсуждение

давно
Посетитель
402218
66
15.05.2019, 19:40
общий
15.05.2019, 19:42
Здравствуй. на счёт лора названия директивы 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'ом
давно
Старший Модератор
31795
6196
16.05.2019, 11:15
общий
16.05.2019, 13:44
Адресаты:
Директива ORG ХХХХ -указывает, компилятору, что код будет расположен в памяти начиная с адреса ХХХХ, поэтому компилятор все смещения считает относительно этого адреса.

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

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

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

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

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

давно
Старший Модератор
31795
6196
16.05.2019, 13:52
общий
Картинка не хочет рисоваться , продублирую файл листинга:
[code lang=asm] 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[/code]
Прикрепленные файлы:
b82e80cb0f5405e33382de93c66614b8.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
20.05.2019, 12:26
общий
это ответ
Здравствуйте, kerenskyaf!

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

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

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

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа