Консультация № 168781
02.06.2009, 16:31
0.00 руб.
0 8 0
Здравствуйте, уважаемые эксперты. Если Вас не затруднит, ответьте на несколько вопросов.
1. Столкнулся с трудностями при компиляции программ, в которых сегментные регистры соотнесены с разными сегментами памяти. Компилирую как обычно в MASM611 обычной командой: ml.exe prog.asm /AT, но получается только объектный файл, а не COM. Компилятор пишет: LINK : fatal error L1127: far segment references not allowed with /TINY. В чём может быть дело, я же пример брал из одной книжки по ассемблеру и именно из главы «Структура программ на ассемблере MASM». Автор почему-то взял для примера модель LARGE, но я менял и на TINY, всё равно не создаётся COM-файл. Да и не в модели дело: пытался откомпилировать с десяток программ с различными моделями памяти – только объектные файлы создаются. Может нужна другая команда для программ с подобной структурой?
2. Когда настраивается регистр DS на сегмент данных то в одних книгах пишется mov DS,@data , а в других mov DS,data ,то есть без @/. Зачем нужен символ @.
3. В начале некоторых программ стоит .8086, а для чего? ведь по умолчанию процессор и так работает как .8086.
4. В каких случаях нужен оператор END, закрывающий последний сегмент и обозначающий конец исходного текста программы. Он то стоит в самом конце программ, то его нет. В разных программах по-разному. Но я заметил, что END появляется в программах с упрощёнными директивами, типа .data, .code, и не появляется, если эти сегменты будут описаны как data segment…data ends, code segment…code ends плюс обязательное наличие главного, основного (main), модуля, с которого начинается выполнение программы: main: … end main.


Приложение:
;Пример адресации сегментов в программе MS-DOS
.model large
.data
s1 db "test string$"
.code
mov ax,@data
mov ds,ax
lea dx,s1
mov ah,09h
int 21h
mov ax,4c00h
int 21h
end

;Object Modules [.obj]: prog.obj/t
;Run File [prog.com]: "prog.com"
;List File [nul.map]: NUL
;Libraries [.lib]:
;Definitions File [nul.def]:
;LINK : fatal error L1127: far segment references not allowed with /TINY

Обсуждение

Неизвестный
02.06.2009, 16:39
общий
1. COM программа это 1 сегмент .code , модель tiny!
2. @data это имя сегмента .data
3. чтобы не зависить от компилятора, явно указать какие команды использовать
4. помоему END всегда должен быть
Неизвестный
03.06.2009, 06:17
общий
"4. помоему END всегда должен быть"
Вот, например, программа, у которой нет завершающего END:
;Укажем соответствие сегментных регистров сегментам
assume cs:code, ds:data
;Опишем сегмент кода
;Откроем сегмент кода

code segment
begin:
;Настроим DS на сегмент данных
mov ax,data
mov ds,ax

;Выведем на экран строку текста
mov ah,9
mov dx,offset msg
int 21h
mov ax,4c00h
int 21h

;Закроем сегмент кода
code ends

;Опишем сегмент данных
;Откроем сегмент данных
data segment

msg db "Programm is work! $"
;Закроем сегмент данных
data ends

;Опишем сегмент стека
stak segment stack
db 256 dup (?)
;Закроем сегмент стека
stak ends

;Конец программы с точкой входа
end begin
Неизвестный
03.06.2009, 10:30
общий
Код:
end begin ?
Неизвестный
03.06.2009, 12:59
общий
Цитата: 195841
end begin ?

Спасибо за первый ответ, забыл сразу поблагодарить.
Да, именно так: end begin. Без END. Программа компилируется как.exe. Может, дело в exe? Таких программ без END немало.
PS Раньше за ответы оценки ставили по 5 балльной шкале. Сейчас убрали строку "Ответ не оценён. Оценить ответ"?
давно
Старший Модератор
31795
6196
04.06.2009, 13:13
общий
Adsorores:
3)
Посмотрите линейку Процессоров Intel.
Они все совместимы снизу вверх, т.е. более позние версии поддерживают более ранние и программное обеспичение написанное для 16-битных могло работать на 32-х битных, это о Вашей фразе [u]ведь по умолчанию процессор и так работает как .8086[/u] он запускается в этом режиме, а потом переводится в защищенный, но как говорится в Одессе, это две большие разницы.
Такая директива появилась в компиляторах, после введения новых линеек процессоров 186,286,386 и т.д. . Компиляторы написанные под новые наборы команд и поддерживающие новые процессоры могли компилировать программы под х86-е, но чтобы программисту не следить за тем какие команды принадлежат нужному процессору ввели такую директиву, которая функцию слежения возлагала на сам компилятор.

Попробуйте написать программу в режиме .086 и использовать команду 186-го процессора pushf или pusha к примеру.
Но если вместо этих команд записать их опкоды, то компилятор в этом режиме их пропустит, т.к. считает их за данные, а не команду.
Код:
mov	ax,bx
db 60;опкод команды pusha
mov bx,ax

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

давно
Старший Модератор
31795
6196
06.06.2009, 02:18
общий
Adsorores:
2)
Если быть точным то запись mov ax,seg data является стандартом языка, различные дополнителные возможности вводимые компиляторами, это только способ облегчить труд программиста, но не более. К примеру если Вы первый раз посмотрите на программу написанную под FASM, там без коментариев и не зная синтаксис, разобратся будет трудно, т.к. это один и тотже язык ассемблера, но с различными стандартами компилятора.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
06.06.2009, 12:32
общий
Спасибо, кажется понял. Но на 4 вопрос ответ не ясен: В каких случаях ставится оператор END. Он то есть, то его нет. И непонятно, когда нужен он, когда не нужен. В 4-ом вопросе неправильно написал про обязательное наличие главного, основного (main), модуля, с которого начинается выполнение программы: main: … end main. Но это не модуль - это точка входа, я допустил ошибку.
давно
Посетитель
7438
7205
07.06.2009, 02:37
общий
Давайте разберемся с END
Этот оператор нужен для указания ассемблеру конца модуля,
поэтому он обязателен.
Кроме этого, у одного (или единственного) модуля должна быть
указана точка входа, что и делается (как правильно замечено)
при помощи метки точки входа возле оператора END
Но это все тот же оператор END!

Теперь о упрощённых директивах типа .data, .code
Как раз эти директивы не влияют на оператор END
Но есть директива, которая влияет на END, это - .strartup,
которая, в зависимости от модели памяти, настраивает сегментные регистры (для моделей, отличных от tiny),
для модели tiny устанавливает при помощи org 100h начальное смещение программы
(необходимое для COM-программы) и, что для нас очень важно, строит начальную метку @Startup.
И тогда в конце можно писать просто END. Ассемблер автоматически заменит его на END @Startup
Рекомендую посмотреть листинг программы, созданный при помощи tasm /la prog.asm.

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