Консультация № 186716
18.10.2012, 13:14
0.00 руб.
18.10.2012, 20:18
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
У меня ос windows 7
в компиляторе ассембер мне выдает ошибку ".386" на форумах написано что такая ошибка потому что компилятор старый но какой мне тогда нужен?? очень прошу помогите вообще не знаю где взять нормальный компилятор ассембера для windows 7.

Обсуждение

давно
Старший Модератор
31795
6196
18.10.2012, 20:21
общий
18.10.2012, 20:22
Цитата: 394895
в компиляторе ассембер мне выдает ошибку

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

давно
Посетитель
7438
7205
18.10.2012, 20:21
общий
18.10.2012, 20:24
Здравствуйте, Дмитрий.
При чем тут ОС? Вы лучше скажите, какой у Вас компилятор и какой версии.
А лучше загрузите его в мои файлы. Посмотрим, что у Вас там...

Да, и код не забудьте показать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
19.10.2012, 08:11
общий
спасибо я уже разобрался, скачал другой компилятор Masm 32, в qeditor написал программу

CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello, world$'
CSEG ends
end Begin

сохранил как myprog.asm
Скачивал doslnk.exe и кинул в папку с программой.
кинул так же cmd.exe в эту папку, и ml.exe
И в командной строке ввел
ml /c myprog.asm
doslnk /t myprog.obj

просто если кто еще будет интерисоваться, прочитает надеюсь поможет)
давно
Старший Модератор
31795
6196
19.10.2012, 20:44
общий
это ответ
Здравствуйте, Дмитрий!

Код:
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello, world$'
CSEG ends
end Begin

Это 16-ти битное приложение DOS, для компиляции Вам подойдет любой 16-ти битный компилятор:

FASM-универсальный компилятор, может создавать приложения как 16-ти битные для DOS, так и 32-х битные для WINDIWS.

Итак попорядку:
CSEG segment - допустимая урезаная форма описания сегмента. Полная форма выглядит так:
Цитата: из книги С.Зубкова
имя_сегмента segment readonly выравн. тип разряд 'класс'
...
имя_сегмента ends

Все пять операндов директивы SEGMENT необязательны.

Разрядность. Этот операнд может принимать значения USE16 и USE32. Размер сегмента, описанного как USE16, не может превышать 64 Кб, и все команды и адреса в этом сегменте считаются 16-битными. В этих сегментах все равно можно применять команды, использующие 32-битные регистры или ссылающиеся на данные в 32-битных сегментах, но они будут использовать префикс изменения разрядности операнда или адреса и окажутся длиннее и медленнее. Сегменты USE32 могут занимать до 4 Гб, и все команды и адреса в них по умолчанию 32-битные. Если разрядность сегмента не указана, по умолчанию используется USE16 при условии, что перед директивой .MODEL не применялась директива задания допустимого набора команд .386 или старше.

ps:Оставлено только то, что касается данного вопроса.

org 100h - визитная карточка модели памяти TINY:
Цитата: из книги С.Зубкова
TINY — код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб(см. USE16). Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;



Тип разрешенного процессора(.186, .286, .386 и т.д.) не указан, т.е. по умолчанию считается 16-ти битная адресация и х86-ой процессор. Компилятор MASM32 работает только с 32-х битной адресацией доступной начиная с 386-го процессора.
Именно по этому Вас просят указать тип процессора 386.

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

давно
Старший Модератор
31795
6196
20.10.2012, 19:34
общий
Цитата: 394895
ничо не понял

Это плохо.

Начнем снова:
Вы использовали для определения сегмента кода, данных и стека директиву компилятора SEGMENT, обязятельными в этой диретиве есть два поля: ИМЯ и SEGMENT, остальные поля-операнды этой директивы необязательны, т.е. их можно не указывать. Эти поля определяют, как должен быть сформирован окончательный код, как должны быть сгрупированны сегменты и расположены в памяти и т.д.. Другими словами эти поля определяют линковщику, что именно нужно делать с кодом и что именно нужно получить в итоге. Один из этих операндов: разряд или Разрядность(см. мой ответ) именно он указывает тип адрисации кода и данных, т.е. какие регистры будут использоватся: IP или EIP(как пример), т.е. 16-ти разрядная адресация памяти или 32-х.
Указать разрядность адресации можно ещё двумя способами: .MODEL FLAT или .386. Обе директивы указывают, что процессор может работать с 32-х разрядными регистрами и использовать команды 386-го процессора. Отличия заключаются в адресации: первая директива явно указывает, что будет использована 32-х разрядная адресация, вторая, что она только разрешена. Операнд директивы SEGMENT - USE32 - указывает компилятору, что будет использована 32-х битная адресация и код должен создаватся под неё.
Даже если бы Вы будете использовать один из выше указанных способов(SEGMENT - USE32, .MODEL FLAT или .386), чтобы получить код , это не избавит Вас от ошибки: instruction operands must be the same size, в строке:mov dx,offset Message - при 32-х разрядной адресации, смещение в сегменте переменной Message будет иметь 32-х разрядное значение, а регистр DX - только 16-ть разрядов.

Вы использовали Masm 32 - предназначеный для создания только 32-х разрядных приложений, именно по этому выскочила такая ошибка, компилятор ожидает от Вас явного указания использования 386-го процессора, т.к. по умолчанию используется 16-ти разрядная адресация и х86 процессор.

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

Форма ответа