В.И.Юров и код из его книжек, который не транслируется

Тема в разделе "WASM.BEGINNERS", создана пользователем Bodhidharma, 20 окт 2009.

  1. Bodhidharma

    Bodhidharma New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    61
    Всем доброго времени суток.
    Уважаемые, помогите пожалуйста разобраться с учебником (!). Казалось бы, Юров - это классика обучения асьме, а учебники одобрены министерством образования и входят в "300 лучших учебников России", но вот такой в этом учебнике код, который испугал даже неофита :) Итак оригинальный код:

    Код (Text):
    1. masm
    2. model small
    3. .stack 100h
    4. .data
    5. message db "Запустите эту программу в отладчике", '$'
    6. perem_1 db 0ffh
    7. perem_2 dw 3a7fh
    8. perem_3 dd 0f54d567ah
    9. mas     db 10 dup (" ")
    10. pole_1  db 5 dup (?)
    11. adr     dw perem_3
    12. adr_full dd perem_3
    13. fin     db "Конец сегмента данных программы $"
    14. .code
    15. start:
    16. mov ax, @data
    17. mov ds, ax
    18. mov ah, 09h
    19. mov dx, offset message
    20. int 21h
    21. mov ax, 4c00h
    22. int 21h
    23. end start
    Черт с ней, с пагубной привычкой писать "perem", "pole" и т.д. Но код попросту не ассемблируется, что хуже всего.

    В меру своих скромных познаний я постарался немного разобраться, кой-чего поправил, но все равно код не транслируется. (Пакет masm32 от Хатча, до Юрова все ассемблировалось нормально и ассемблируется сейчас. Так что проблема не в масме/руках, а в коде Юрова.)

    Вот код Юрова, который я слегка поправил.

    1) удалил masm в самом начале - ибо насколько мне известно masm пишут для tasm'a, и сия директива означает режим совместимости с масмом. но поскольку у меня масм изначально, то директива сия не нужна.
    2) .model small - поставил точку :)
    3) .386 - поставил процессор.

    Код (Text):
    1. .386
    2. .model small
    3. .stack 100h
    4. .data
    5. message db "Запустите эту программу в отладчике", '$'
    6. perem_1 db 0ffh
    7. perem_2 dw 3a7fh
    8. perem_3 dd 0f54d567ah
    9. mas     db 10 dup (" ")
    10. pole_1  db 5 dup (?)
    11. adr     dw perem_3
    12. adr_full dd perem_3
    13. fin     db "Конец сегмента данных программы $"
    14. .code
    15. start:
    16. mov ax, @data
    17. mov ds, ax
    18. mov ah, 09h
    19. mov dx, offset message
    20. int 21h
    21. mov ax, 4c00h
    22. int 21h
    23. code exit
    24. end start
    ну и собственно пара вопросов, буду благодарен если кто-то поможет:

    1) когда заканчивается описание сегмента кода, что надо ставить? ret, code end или code exit ?

    2) собственно почему не происходит ассемблирование? даже объектный файл не создается.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    обычно компилятор ошибку пишет.
     
  3. Bodhidharma

    Bodhidharma New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    61
    n0name
    у меня не пишет.
    ассемблирую так - есть батник amake.bat, в с\виндовс\систем32, который надо править руками для каждого нового проекта.

    потом иду в Far, там пишу amake project (где project - имя собственно ассемблерного сорца, project.asm). ну а далее все ассемблируется, и выдаются 2 файла - project.obj & project.exe.

    ошибок никаких ни разу не выдавало, логи вроде бы тоже не ведутся нигде.

    мож я ассемблирую не так как-то? (з.ы. метод посмотрел по книжке Крупника)
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    А что тебе пишет компилятор??? error A2006: undefined symbol : DGROUP, это основная причина.
    У Юрова что стоит? Ничего? вот ничего и не ставь :)))
    Пакет masm32 не предназначен для 16-битных программ, написанных для tasm.
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Начало сегмента при использовании механизма полного определения сегментов -- это директива вида

    имя-сегмента SEGMENT характеристики-сегмента

    Ну а его конец -- это директива

    имя-сегмента ENDS

    END -- это директива, но она заканчивает файл, а не сегмент, и поэтому должна ставиться в конце файла. К сегментам она отношения не имеет.

    RET -- это не директива (т.е. не приказ транслятору ассемблера, срабатывающий во время трансляции исходного текста программы), а машинная инструкция (команда, которая будет выполнена процессором во время работы этой программы).

    Что же касается кода, который Вы приводите, то там используется упрощённое определение сегментов -- директивы вроде .CODE. Никакого специального завершения для таких сегментов не предусмотрено; соответственно, ничего в их конце и не ставится.

    "CODE EXIT" -- это какой-то бред. Поскольку программа для ДОС, надо поставить вместо него вызов функции завершения программы. Наизусть не помню -- для ДОСа писал последний раз лет 15 назад.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    FatMoon
    МАСМ32 благополучно транслирует 16-разрядные программы. Другое дело, что современные версии компоновщика не умеют собирать 16-разрядные ехе- или ком-файлы, и надо использовать какой-то внешний компоновщик.
     
  7. Bodhidharma

    Bodhidharma New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    61
    все спасибо за ответы.

    FatMoon
    говорю же - не пишет ничего.
    где должно сие писаться?

    хм, тогда ставить ТАСМ и не геморроиться с разными версиями МАСМа?

    SII
    ясно, спасибо.

    имхо лучше уж поставить ТАСМ тогда :)

    вообще странный выбор - обучать по мертвому языку.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    тут таких топиков пачка - и в каждом ответ один и тот же - линкуйте 16 битным линкером
    могли бы и поискать прежде чем спрашивать
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Язык один - ассемблер.
    На чём писать - не имеет значения.
    В консоли. И хотя бы версию свою MASM пишет 100%.
    Там есть завершение: AX=4C00h/INT21h
    TASM всё отлично собирает (оригинальный код из первого поста).
    Прежде чем бежать на форум можно было бы в книжке почитать какой ассемблер используется.
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    cppasm
    Угу, не обратил внимания сразу, а редактировать-то нельзя. Хотя КОДЕ ЕХИТ всё равно бред :)

    Rockphorr
    Вообще-то, судя по написанному, не проходит трансляция, а не компоновка (которую на жаргоне линковкой кличут). А трансляция проходить обязана, если программа синтаксически корректна.

    Bodhidharma
    И книга довольно старая, и обучение идёт под ДОС, которая ещё мертвее. А МАСМ вполне жив, просто совместимость с ДОСом не тянут, потому компоновщик и обрезали. Ну и, наконец, язык здесь -- язык ассемблера. А МАСМ, ТАСМ, ФАСМ и всё прочее -- это лишь трансляторы, и от того, какой транслятор используешь, _принципиально_ ничего не меняется. Да, меняются директивы, в той или иной степени меняется синтаксис -- но сама суть ассемблера никуда не исчезает.
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Кстати на правах оффтопа :)
    Ещё пару лет назад все зеркалки Canon работали под х86 процами и ROM-DOS.
    EOS 300D к примеру. Сейчас ARM везде.
    Так что кто мёртвый, кто нет - вопрос спорный ;)
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    угу, верно. Значит, надо запускать не батник, а прямо в командной строке
    ml <file>.asm
    Проверил, пример от ТС в самом деле компилируется.
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    cppasm
    Угу, но это специфические случаи. Если на то пошло, местами кой-где до сих пор работает оборудование (и ПО) 70-х, а временами даже 60-х годов -- но никто ж не будет говорить, что по этой причине соответствующая техника жива :)

    Лично я вообще не вижу смысла начинать изучение асма с программирование под ДОС -- хотя бы из-за сегментов и прочих прелестей реального режима, которые сильно затрудняют первоначальное изучение.
     
  14. Bodhidharma

    Bodhidharma New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    61
    Уважаемые, еще один вопрос.

    Скачал ТАСМ5плюс (с этого сайта), наживил. Кладу в папку BIN ассемблерный сорец, потом в FAR'e пишу:

    tasm32.exe /zi 5_3

    (5_3 - имя сорца)

    и о чудо - объектный файл создался!!!1

    собственно вопрос - почему запускающееся ДОСовское окно тасм32.ехе появляется и моментально исчезает?

    оно ведь вроде должно что-нить писать, в частности свою версию, ключи и т.д.

    как сие поправить, чтобы окно появлялось и висело до тех пор, пока его сам не закроешь?
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Bodhidharma
    > потом в FAR'e пишу ... тасм32.ехе появляется и моментально исчезает
    Что-то не так с Far'ом. У меня вывод консольных программ попадает в его окно.
    Описанное тобой поведение характерно, если запускать программу не Enter'ом, а Shift+Enter'ом.
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Я ж привёл пример. Это техника совсем не 70-х годов.
    Во встраиваемых системах DOS используется намного чаще чем многие думают.
    По-моему даже спутник какой-то запускали с управлением под DOS.
    Только не MS DOS, а клон разработанный в минобороны.
    Это смотря что изучать.
    Программировать переферию лучше начинать под DOS - проще намного и видно все детали.
    Модель драйверов Windows во-первых не самая простая, а во-вторых многое скрывает.
     
  17. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    cppasm
    +1

    давайте развернутый ответ напишем - глядишь закрепять а то через каждые 20 подобные вопросы

    например чуть ниже тоже самое но для COM формата
     
  18. Bodhidharma

    Bodhidharma New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2009
    Сообщения:
    61
    разобрался - дело было в ключах, т.е., в их отсутствии. :)
     
  19. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Я ж привёл пример. Это техника совсем не 70-х годов.
    Во встраиваемых системах DOS используется намного чаще чем многие думают.
    По-моему даже спутник какой-то запускали с управлением под DOS.
    Только не MS DOS, а клон разработанный в минобороны.
    Это смотря что изучать.
    Программировать переферию лучше начинать под DOS - проще намного и видно все детали.
    Модель драйверов Windows во-первых не самая простая, а во-вторых многое скрывает.
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    cppasm
    Ну, мне это хорошо известно, но ДОС всё равно тыщу раз как мёртв, поскольку в "нормальных" задачах его не используют, ну а подобные специфические исключения лишь подтверждают правило. Да, кстати, не стоит забывать, что во встраиваемых системах х86 отнюдь не доминирует, ну а на других архитектурах, понятное дело, и системы другие.

    Могу даже добавить: чтобы работать с устройствами в Винде, надо очень хорошо разобраться с этой самой драйверной моделью, иначе не будешь толком понимать, что делаешь -- а это само по себе сложная задача. Так что работу с устройствами действительно проще начинать осваивать в реальном режиме, хотя и не обязательно под ДОС -- можно грузить свою программу с дискеты или флэшки вместо ДОСа, например. Однако, если речь идёт о первоначальном обучении ассемблеру, то про программирование устройств лучше не говорить -- это достаточно сложная задача, и надо сначала язык освоить. Ну а для первоначального изучения асма лично я считаю более подходящей как раз Винду -- при условии, конечно, что человек уже умеет в ней программировать на каком-нибудь ЯВУ и знает, что такое Вин32 АПИ.