Вобщем написал программку, обычно когда начинают программировать на новом языке приветствуют мир, ну вот и я тож решил, только вот почемуто программка получилась 796 байт и выводит какуюто фигню а потом только фразу. Открыл я все это дело в Hex редакторе и увидел кучу нулей, а в самом конце свой код компилировал на masm 6.11 ml string.asm /AT link string.obj ,strind.com Код програмки. Код (Text): strings segment assume cs:strings, ds:strings, ss:strings org 100h start: mov ah,09h lea dx,strs int 21h mov ah,4ch mov al,0h int 21h strs db "Hellow World!",'$' strings ends end start Что не так, подскажите пожалуста? Может я не так .com файл делаю???
этого достаточно для создания com-файла. А ты в досе или виндовсе делаешь? Если в виндовсе, то тебе нужен 16битный линкер..
покажи выходной файл, если оно всетаки выводит, но с мусором, видно, ошибка в этих 0xсотне (256) байтах, которые все путают.. хотя у тебя org 100h вроде стоит.
SparK Если уж писать com- файлы и экономить каждый байт - тогда завершение программы - mov ah,4Сh/mov al,0h/int 21h - 6 байт меняй на int 20h - 2 байта или на retn - 1 байт вместо lea dx,strs используешь mov dx,offset strs (на 1 байт короче) вот эту муть можно было и не писать "strings segment assume cs:strings, ds:strings, ss:strings" и "strings ends" да и в начале файла ты, наверное, забыл поставить .286 .model tiny
SparK А надо: link /TINY string.obj ,strind.com У тебя получился экзе с заголовком. Входит правильно, а данные "уплыли".
хмм а как он тогда верно выполняется как ком? хотя дос вроде по хидеру определяет.. погоди и как данные могли уплыть? если он собирался как ком, тогда оффсет данных в сегменте долежн быть на сотню больше, А в экзе он на сотню меньше. получается что адрес тычет на сотню байт дальше данных, а не ближе.. чтото не так тут. или я не так посчитал пусть покажет выходной файл
Необходимо назначить все сегментные регистры на один и тот же сегмент иначе MD. Код (Text): .286 ;режим МП 286 или выше .model tiny ; .code ; org 100h ;обязательно для COM файлов prg: push cs ;запись во все сегментные регистры push cs ;одного значения. pop DS ;только для COM файлов pop es ; cs=dc=es
S_Alex Это DOS вообще по идее сам делает. А вообще что тут гадать-то. valterg правильно сказал: линкеру нужно указать, что компилируется com. Т.е. ключ /TINY или просто /t.
S_Alex Ключ /AT автоматом делает .model tiny Регистры при загрузке COM-файла тоже автоматом назначатся. Причина в том, что линкер отдельно запускают(для 16-битных). И нужно указывать ключ. Если регистры назначить, наверное и EXE правильно сработает.
valterg Код (Text): ; Compile: ;if exist hello.com del hello.com ;ml /AT hello.asm -- как заметил dmsdm "этого достаточно для создания com-файла" ;del hello.obj -- удаляю мусор .model tiny;без этой строки error A2013: .MODEL must precede this directive ;и error A2034: must be in segment block .code org 100h start: mov ah,09h mov dx,offset strs int 21h ret strs db "Hellow World!",'$' end start ml version 6.11, link version 5.31.009 (с трудом нашел это старье!) создается hello.com размером 22 байта
Mikl__ Но если потом самостоятельно пройтись линкером (поверх уже созданного hello.com) без ключа /t, как это делает SparK, то 22-байтный com заменяется MZ-ом.
Mikl__ Я говорил про авторский текст. У него есть сегмент и не нужно никаких tiny и .code Правда ml 7.10 версия
Спасибо всем, но я нашол как его сделать правильно, просто при линковке надо было поставить link string.obj /t и все, выходит .com файл с таким же именем и код без мусора.
Кстати вот файлы которые получались. В арихиве и код и .obj файл. при link string.obj ,strind.com - получился STRIND.COM ненормальный при link string.obj /t - получился STRING.COM нормальный. Есть еще 1 вопрос, а как написать .bat файл чтоб и компилировал и линковал в нужную директорию, а то у меня чето не получается?
SparK Если хочешь создавать, например, COM-файлы кликом по asm-файлу, находящемуся в любом каталоге и на любом диске, и в этом же каталоге будет создан COM-файл с этим же именем, и, допустим, ml и link находятся в папке d:\masm\bin - создаешь asm1.bat файл следующего содержания Код (Text): cls rem очищаем экран if exist %1.com del %1.com d:\masm\bin\ml /AT %1.asm || exit rem компилируем и линкуем, в случае неудачи - выходим del %1.obj rem удаляем мусор в виде obj-файлов Если ASM файлы набираются в FAR'е жмем на F9-->команды-->асоциации файлов-->F4 "Маска файла"-->"*.asm" "Команда, выполняемая по Enter"-->"call asm1.bat !" а сам asm1.bat копируем в Win\System32. Вариант второй. Если набор ASM файлов в NotePad, или еще где-то тогда в bat'е переделай все %1 на %~n1 щелкаем по "Мой компьютер"-->"Сервис"-->"Свойства папки"-->"Типы файлов" и связываем файлы асм с батником
Они у меня в разных папках ml.exe находится в e:\masm611\bin, а link.exe в e:\masm611\binr да и линкер вроде должен запускатся если пользуещься ml.exe, а он почемуто не запускается, надо отдельно линковать. Код (Text): @echo off cls rem очищаем экран if exist %~n1.com del %~n1.com e:\masm611\bin\ml /AT %~n1.asm || exit rem компилируем и линкуем, в случае неудачи - выходим После этого только .obj файл получается и все.
SparK Линкер от масм для 32-битных экзешек. Папка binr - видимо означает real-mode, т.е. ДОС. Там у тебя линкер от 5-й версии. Масм запускает автоматом свой линкер, но после ключа /AT он выдает ошибку fixup