"Hello World" - неработает!?

Тема в разделе "WASM.BEGINNERS", создана пользователем 260db, 25 июн 2009.

  1. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Всем здрасте! Изучаю асем по книге "Изучаем ассемблер - А.Б.Крупник", дошел до вывода текста в консоль, но не работает! Вот код:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. ExitProcess proto :dword
    6. GetStdHandle proto :dword
    7. WriteConsoleA proto :dword, :dword, :dword, :dword, :dword
    8.  
    9. includelib C:\masm32\lib\kernel32.lib
    10.  
    11. .data
    12. stdout          dd ?
    13. msg             db "Не могу молчать!", 0dh, 0ah
    14. cWritten        dd ?
    15.  
    16. .code
    17. start:
    18. invoke GetStdHandle, -11
    19. mov stdout, eax
    20. invoke WriteConsoleA, stdout, ADDR msg, sizeof msg, ADDR cWritten, 0
    21.  
    22. invoke ExitProcess, 0
    23. end start
    Компилятор у меня "MASM32 SDK Version 10"
    Отладчик - OllyDbg (версия 1.10)

    OllyDbg даже не создаёт консольного окна! В чем ошибка?
    Помогите начинающему юзеру-маньяку разобраться :)
    Зарание благодарен!
     
  2. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    При линковке указывается тип приложения (ключ subsystem)? Точно консольное создается, не gui?

    Строка должна заканчиваться нулевым байтом: 0dh, 0ah, 0
     
  3. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Про это я как-то незадумывался, просто жал кнопку "Buld all" в редакторе и все, нашел какой bat файл эта кнопка запускает, вот его содержимое:
    Код (Text):
    1. @echo off
    2.  
    3. if not exist rsrc.rc goto over1
    4. \masm32\bin\rc /v rsrc.rc
    5. \masm32\bin\cvtres /machine:ix86 rsrc.res
    6. :over1
    7.  
    8. if exist %1.obj del %1.obj
    9. if exist %1.exe del %1.exe
    10.  
    11. \masm32\bin\ml /c /coff %1.asm
    12. if errorlevel 1 goto errasm
    13.  
    14. if not exist rsrc.obj goto nores
    15.  
    16. \masm32\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF %1.obj rsrc.obj
    17. if errorlevel 1 goto errlink
    18.  
    19. dir %1.*
    20. goto TheEnd
    21.  
    22. :nores
    23. \masm32\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF %1.obj
    24. if errorlevel 1 goto errlink
    25. dir %1.*
    26. goto TheEnd
    27.  
    28. :errlink
    29. echo _
    30. echo Link error
    31. goto TheEnd
    32.  
    33. :errasm
    34. echo _
    35. echo Assembly Error
    36. goto TheEnd
    37.  
    38. :TheEnd
    39.  
    40. pause
    Правильно или чето надо подправлять?
     
  4. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    /SUBSYSTEM:CONSOLE хотелось бы.

    Но подправлять этот bat как-то некрасиво - потом будете создавать оконное приложение, а его соберут как консольное. Наверняка в среде разработки есть некие настройки, в которых указывается, консольным будет приложение или нет. Либо при создании проекта, либо где-то в опциях компиляции.
     
  5. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Можно вручную попробовать скомпилировать:
    Код (Text):
    1. \masm32\bin\ml /c /coff %1.asm
    2. \masm32\bin\Link /SUBSYSTEM:CONSOLE /OPT:NOREF %1.obj
    здесь %1 - имя исходника.
     
  6. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Создал свой bat'ник и скомпилировал, всё заработало, но выводит место русских букв "браукадабру", подскажите пожалуйста где поменять кодировку?
    Блин автор книги, гад даже неупоминул про "/SUBSYSTEM:CONSOLE"...
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    CharToOem (или обратная), а потом - вывод
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Если без CharToOem, то все определяется тем, где и каким шрифтом ты набираешь исходник. Набираешь в ФАРе - один результат, в блокноте - другой. Поскольку ты тренируешься и изучаешь программирование, можно в данный момент не заморачиваться, убедился что работает и выводит строку - переходи к следующему :))) в конце концов, даже у Микрософта косяки бывают, попробуй в командной строке telnet /? набрать, убедишься...
     
  9. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Вот почему автор и набирал в FAR'е :)
    Ладно и на этом спасибо свем, тем кто помог(причем оперативно, на некоторых форумах и неделю ответа можно прождать...)!
     
  10. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Двигаясь дальше по книге, наткнулся на следующую проблему:
    Компилятор нехотит компилить нижеприведенный код... :dntknw:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include c:\masm32\include\kernel32.inc
    6. includelib c:\masm32\lib\kernel32.lib
    7.  
    8. BSIZE    equ 20
    9.  
    10. .data?
    11. simple      db BSIZE dup(?)
    12.  
    13. .code
    14. start:      mov     ecx, BSIZE
    15.             mov     bx, 1
    16.             mov     edi, 0
    17. nxt:          mov     simple[edi], bx
    18.               inc     bx
    19.               add     edi, 2
    20.             loop    nxt
    21.            
    22.             invoke  ExitProcess, 0
    23. end start
    Вот что пишет при компиляции:
    Код (Text):
    1. Microsoft (R) Macro Assembler Version 6.14.8444
    2. Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
    3.  
    4.  Assembling: C:\masm32\new\l45.asm
    5. C:\masm32\new\l45.asm(17) : error A2070: invalid instruction operands
    17-ая строка - это где находиться метка "nxt". Хотя этот код полностью совпадает с кодом а книге.

    Пы.Сы. решил не создавать новую тему, дабы не загрязнять форум.
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    mov [simple + edi], bx
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    это не масмовский синтаксис
     
  13. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Код (Text):
    1. mov     [simple + edi], bx
    Пробовал и так, непомогает, вылетает с той же ошибкой :dntknw:

    Вот что автор пишет по поводу компилятора, дальше ничего о нем не упоминает... А ниже приведен оригинальный листинг программы и это не опечатка т.к. далее встречается "simple[edi], bx"
     
  14. 260db

    260db New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2009
    Сообщения:
    7
    Все отбой, нашел ошибку!... Вернее опечатку...
    Я написал так:
    Код (Text):
    1. simple      db BSIZE dup(?)
    А надо было так:
    Код (Text):
    1. simple      dw BSIZE dup(?)
    Теперь компилит и так "[simple + edi]" и так "simple[edi]"