Вопрос № 60961: 1)Я програмиррую на Pascal'e.Для тех,кто не в курсе, для вывода
сообщения на экран в Pascal'e есть оператор Write/Writeln,а после неё
идут инструкции,заканчивающиеся оператором End.(выход проги-аналог int 20h).Но я ни как не могу понять ,поч...Вопрос № 61028: Читаю уроки Iczelion-а, разбираю пример создания окна. При компиляции проекта выдается куча ошибок, начиная с того, что объявление процедуры WinMain - ошибочное. Объявленные переменные определяются как необъявленные. Даже если текст скопировать из ур...
Вопрос № 60.961
1)Я програмиррую на Pascal'e.Для тех,кто не в курсе, для вывода
сообщения на экран в Pascal'e есть оператор Write/Writeln,а после неё
идут инструкции,заканчивающиеся оператором End.(выход проги-аналог int 20h).Но я ни как не могу понять ,почему адрес сообщения
в асме указывают после int 20h(полная противоположность Pascal) :(
По идее ,если я укажу этот адрес до int 20h и после int 21h всё должно
выполниться :(
2)Перерыл много форумов,придерживался многих инструкций,а ассемблировать и тем более линковать файл на MASM 5.1 не получилось.
Вот,что было предложено и ошибки,которые у меня возникли:
a)masm.exe имя.asm
link.exe имя.obj
error A2062:Missing or unreachable CS
47152 + 446396 Bytes symbol space free
0 warning Errors
1 Severe Errors -Имя.obj не создаётся!
b)masm.exe имя.asm
link.exe имя.obj/t -ТО ЖЕ САМОЕ!
с)ml /c имя.asm
link имя.obj
IF NOT ERROR LEVEL 1 c:masmlink /c , /c, /c и также имя.obj не создаётся!
d)masm.exe имя.asm
link.exe /AT имя.obj-Повторять нет смысла
e)ml.exe имя.asm/ml.exe имя.asm /AT
имя.obj:warning LNK4033:converting object format from OMF to COFF
имя.obj:fatal error LNK1190:invalid fixup found, type 0*0001
Объектный файл создаётя,но уже возникают проблемы с линковкой :(
все предложенные выше варианты линковки:
имя.obj:warning LNK4033:converting object format from OMF to COFF
имя.obj:fatal error LNK1190:invalid fixup found, type 0*0001
Каой ещё способ предложите ВЫ :(
3)Как запустить прогу с помощью debug'a?
4)Я недавно наткнулся на ошибку в рассылке Калашникова насчёт проги с рожицей,где после _beg: надо было добавить :
mov ah,3
int 10h
Какие ещё ошибки содержит данная рассылка и где о них можно
узнать?
Отправлен: 01.11.2006, 20:29
Вопрос задал: Xtreme (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Волков Павел Юрьевич
Здравствуйте, Xtreme!
добавка инструкций
mov ah,3
int 10h
связанна с особенностью работы эмулятора DOS в WinXP(2000).
В рассылке рассматривается программирование под DOS
(в котором ненужен предварительный вызов функций видеоадаптера для вывода на экран).
Поэтому, это не ошибка. Ошибок в рассылке не находил.
--------- Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 8-ой класс)
Ответ отправлен: 02.11.2006, 06:16
Отвечает: Вiктор
Здравствуйте, Xtreme!
1) когда вы пишете СОМ-программу, то у вас код и данные идут в одном сегменте. Для того чтобы компьютер не пытался выполнять данные как код, их (данные) располагают в таком месте, до которого управление не доходит. Это может быть место за выходом из программы, или место, которое перепрыгивается командой прыжка:
-команды программы
-выход
-данные.
начинается выполнение с команд. Команды спокойно берут данные за командой выхода, указывая их адрес. После того, как вся программа выполнена, идёт команда выхода (int 20), и управление не доходит до того места, где расположены данне, значит компьютер не будет пытаться выполнять данные (для компа это просто байты, это мы знаем что это не команды а данные). А если пытаться выполнять данные, то скорее всего будет ошибка.
можно ещё сделать так:
-команды
-безусловный прыжок на мет1
-данные
-мет1:
-опять команды
-выход.
здесь опять управление не попадает на участок памяти, содержащий данные, потому что команда безусловного прыжка перепрыгивает этот участок.
В паскале - не совсем так. Команда writeln - это же вызов функции, а не объявление сообщения. Поэтому и нельзя её ставить после "end." Точно так же как и в асме если вы поставите команды после int 20, то они не выполнятся, потому что до них не дойдёт управление. В асме такое можно сделать, потому что это могут быть данные. А паскаль не даёт вам писать команды после "end." потому что нельзя средствами паскаля как-нибудь достучаться до этих данных. А если нельзя, то компилятор сразу это и
запрещает.
И ещё: когда вы в паскале пишете begin writeln('HELLO!'); end. то это не значит что строка 'HELLO!' не может храниться за командой выхода. Ведь может быть такое, что компилятор переделает прогу в такой асм-код:
push offset str
call writeln
выход по int 20
str: db 'HELLO!'
Конечно, реально такого паскаль не делает, ведь он обычно данные располагает в отдельном сегменте кода, и программы делает не СОМ а ЕХЕ. Но это просто вам объяснение: в асме вы можете располагать данные, код, команды выхода и т.п. где хотите, хоть в перемешку, вы сами отвечаете чтобы это всё правильно работало. А паскаль - язык высокого уровня, он не рассчитан на хитрые расположения кода и данных, он требует определённого порядка. А куда располагать данные, куда код - это уже задача компилятора.
3) Если вообще любой дебаггер, то обычно 2 способа:
- запустить дебаггер, а затем командами дебаггера открыть нужную программу;
например, для турбодебаггера:
c: pin d.exe, потом заходим в меню, file->open, указываем имя файла
- запустить дебаггер, педедав ему имя программы в командной строке;
например:
c: pin d.exe c: pprogsproga.exe
Если вы про debug который лежит в папке виндовс, то у него есть команда L (LOAD):
load L [адрес] [диск] [первый_сектор] [число]
--------- Флаг вам в руки! (sti, stc, etc)
Ответ отправил: Вiктор (статус: 7-ой класс)
Ответ отправлен: 02.11.2006, 10:52
Отвечает: Pinkbyte
Здравствуйте, Xtreme!
Насчет Masm 5.1 - ИМХО проще и лучше скачать MASM 6.14 и пользоваться новыми стандартами, чем поднимать старые... Все равно в MASM 6.0 поддерживается как старый синтаксис, так и новый, который гораздо проще...
--------- Нейтральность - высшее достижение сознания
Ответ отправил: Pinkbyte (статус: 3-ий класс)
Ответ отправлен: 04.11.2006, 00:09
Вопрос № 61.028
Читаю уроки Iczelion-а, разбираю пример создания окна. При компиляции проекта выдается куча ошибок, начиная с того, что объявление процедуры WinMain - ошибочное. Объявленные переменные определяются как необъявленные. Даже если текст скопировать из урока. Пробовал разные IDE (Chrom, RadASM, VASM и прочие).
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Никифоряк Роман!
Дело в том, параметры WinMain нельзя так переносить
Надо либо писать в одной строке
WinMain proc Inst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
либо указать перенос при помощи символа ''
WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Практикант)
Ответ отправлен: 02.11.2006, 15:42 Оценка за ответ: 5