.com файлы

Тема в разделе "WASM.BEGINNERS", создана пользователем SparK, 27 апр 2008.

  1. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Вобщем написал программку, обычно когда начинают программировать на новом языке приветствуют мир, ну вот и я тож решил, только вот почемуто программка получилась 796 байт и выводит какуюто фигню а потом только фразу.
    Открыл я все это дело в Hex редакторе и увидел кучу нулей, а в самом конце свой код
    компилировал на masm 6.11
    ml string.asm /AT
    link string.obj ,strind.com

    Код програмки.
    Код (Text):
    1. strings segment
    2. assume cs:strings, ds:strings, ss:strings
    3.   org 100h
    4. start:
    5.   mov ah,09h
    6.   lea dx,strs
    7.   int 21h
    8.   mov ah,4ch
    9.   mov al,0h
    10.   int 21h
    11.   strs db "Hellow World!",'$'
    12. strings ends
    13. end start
    Что не так, подскажите пожалуста?
    Может я не так .com файл делаю???
     
  2. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    Я не знаю...
     
  3. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    этого достаточно для создания com-файла.

    А ты в досе или виндовсе делаешь? Если в виндовсе, то тебе нужен 16битный линкер..
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    покажи выходной файл, если оно всетаки выводит, но с мусором, видно, ошибка в этих 0xсотне (256) байтах, которые все путают.. хотя у тебя org 100h вроде стоит.
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    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
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    SparK
    А надо: link /TINY string.obj ,strind.com

    У тебя получился экзе с заголовком. Входит правильно, а данные "уплыли".
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хмм а как он тогда верно выполняется как ком? хотя дос вроде по хидеру определяет..
    погоди и как данные могли уплыть? если он собирался как ком, тогда оффсет данных в сегменте долежн быть на сотню больше, А в экзе он на сотню меньше. получается что адрес тычет на сотню байт дальше данных, а не ближе.. чтото не так тут. или я не так посчитал

    пусть покажет выходной файл
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    [deleted]
     
  9. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Необходимо назначить все сегментные регистры на один и тот же сегмент иначе MD.

    Код (Text):
    1.     .286        ;режим МП 286 или выше
    2.         .model tiny ;
    3.         .code       ;
    4.         org 100h    ;обязательно для COM файлов
    5.  
    6.     prg:           
    7.         push cs     ;запись во все сегментные регистры
    8.         push cs     ;одного значения.
    9.         pop DS      ;только для COM файлов
    10.         pop es      ; cs=dc=es
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    S_Alex
    Это DOS вообще по идее сам делает. А вообще что тут гадать-то. valterg правильно сказал: линкеру нужно указать, что компилируется com. Т.е. ключ /TINY или просто /t.
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    S_Alex
    Ключ /AT автоматом делает .model tiny Регистры при загрузке COM-файла тоже автоматом назначатся.
    Причина в том, что линкер отдельно запускают(для 16-битных). И нужно указывать ключ.
    Если регистры назначить, наверное и EXE правильно сработает.
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    valterg
    Код (Text):
    1. ; Compile:
    2. ;if exist hello.com del hello.com
    3. ;ml /AT hello.asm -- как заметил dmsdm "этого достаточно для создания com-файла"
    4. ;del hello.obj -- удаляю мусор
    5. .model tiny;без этой строки error A2013: .MODEL must precede this directive
    6. ;и error A2034: must be in segment block
    7. .code
    8. org 100h
    9. start:
    10.   mov ah,09h
    11.   mov dx,offset strs
    12.   int 21h
    13.   ret
    14.   strs db "Hellow World!",'$'
    15. end start
    ml version 6.11, link version 5.31.009 (с трудом нашел это старье!)
    создается hello.com размером 22 байта
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mikl__
    Но если потом самостоятельно пройтись линкером (поверх уже созданного hello.com) без ключа /t, как это делает SparK, то 22-байтный com заменяется MZ-ом.
     
  14. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Mikl__
    Я говорил про авторский текст. У него есть сегмент и не нужно никаких tiny и .code
    Правда ml 7.10 версия
     
  15. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Спасибо всем, но я нашол как его сделать правильно, просто при линковке надо было поставить link string.obj /t и все, выходит .com файл с таким же именем и код без мусора.
     
  16. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Кстати вот файлы которые получались. В арихиве и код и .obj файл.
    при link string.obj ,strind.com - получился STRIND.COM ненормальный
    при link string.obj /t - получился STRING.COM нормальный.

    Есть еще 1 вопрос, а как написать .bat файл чтоб и компилировал и линковал в нужную директорию, а то у меня чето не получается?
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    SparK
    Если хочешь создавать, например, COM-файлы кликом по asm-файлу, находящемуся в любом каталоге и на любом диске, и в этом же каталоге будет создан COM-файл с этим же именем, и, допустим, ml и link находятся в папке d:\masm\bin - создаешь asm1.bat файл следующего содержания
    Код (Text):
    1. cls
    2. rem очищаем экран
    3. if exist %1.com del %1.com
    4. d:\masm\bin\ml /AT %1.asm || exit
    5. rem компилируем и линкуем, в случае неудачи - выходим
    6. del %1.obj
    7. rem удаляем мусор в виде obj-файлов
    Если ASM файлы набираются в FAR'е жмем на F9-->команды-->асоциации файлов-->F4 "Маска файла"-->"*.asm" "Команда, выполняемая по Enter"-->"call asm1.bat !" а сам asm1.bat копируем в Win\System32.
    Вариант второй. Если набор ASM файлов в NotePad, или еще где-то тогда в bat'е переделай все %1 на %~n1 щелкаем по "Мой компьютер"-->"Сервис"-->"Свойства папки"-->"Типы файлов" и связываем файлы асм с батником
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mikl__
    кстати, лучше заменить %1 на "%1"
     
  19. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Они у меня в разных папках
    ml.exe находится в e:\masm611\bin, а
    link.exe в e:\masm611\binr
    да и линкер вроде должен запускатся если пользуещься ml.exe, а он почемуто не запускается, надо отдельно линковать.

    Код (Text):
    1. @echo off
    2. cls
    3. rem очищаем экран
    4. if exist %~n1.com del %~n1.com
    5. e:\masm611\bin\ml /AT %~n1.asm || exit
    6. rem компилируем и линкуем, в случае неудачи - выходим
    После этого только .obj файл получается и все.
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    SparK
    Линкер от масм для 32-битных экзешек. Папка binr - видимо означает real-mode, т.е. ДОС.
    Там у тебя линкер от 5-й версии. Масм запускает автоматом свой линкер, но после ключа /AT он выдает ошибку fixup :)