Всем здрасте! Изучаю асем по книге "Изучаем ассемблер - А.Б.Крупник", дошел до вывода текста в консоль, но не работает! Вот код: Код (Text): .386 .model flat, stdcall option casemap:none ExitProcess proto :dword GetStdHandle proto :dword WriteConsoleA proto :dword, :dword, :dword, :dword, :dword includelib C:\masm32\lib\kernel32.lib .data stdout dd ? msg db "Не могу молчать!", 0dh, 0ah cWritten dd ? .code start: invoke GetStdHandle, -11 mov stdout, eax invoke WriteConsoleA, stdout, ADDR msg, sizeof msg, ADDR cWritten, 0 invoke ExitProcess, 0 end start Компилятор у меня "MASM32 SDK Version 10" Отладчик - OllyDbg (версия 1.10) OllyDbg даже не создаёт консольного окна! В чем ошибка? Помогите начинающему юзеру-маньяку разобраться Зарание благодарен!
При линковке указывается тип приложения (ключ subsystem)? Точно консольное создается, не gui? Строка должна заканчиваться нулевым байтом: 0dh, 0ah, 0
Про это я как-то незадумывался, просто жал кнопку "Buld all" в редакторе и все, нашел какой bat файл эта кнопка запускает, вот его содержимое: Код (Text): @echo off if not exist rsrc.rc goto over1 \masm32\bin\rc /v rsrc.rc \masm32\bin\cvtres /machine:ix86 rsrc.res :over1 if exist %1.obj del %1.obj if exist %1.exe del %1.exe \masm32\bin\ml /c /coff %1.asm if errorlevel 1 goto errasm if not exist rsrc.obj goto nores \masm32\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF %1.obj rsrc.obj if errorlevel 1 goto errlink dir %1.* goto TheEnd :nores \masm32\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF %1.obj if errorlevel 1 goto errlink dir %1.* goto TheEnd :errlink echo _ echo Link error goto TheEnd :errasm echo _ echo Assembly Error goto TheEnd :TheEnd pause Правильно или чето надо подправлять?
/SUBSYSTEM:CONSOLE хотелось бы. Но подправлять этот bat как-то некрасиво - потом будете создавать оконное приложение, а его соберут как консольное. Наверняка в среде разработки есть некие настройки, в которых указывается, консольным будет приложение или нет. Либо при создании проекта, либо где-то в опциях компиляции.
Можно вручную попробовать скомпилировать: Код (Text): \masm32\bin\ml /c /coff %1.asm \masm32\bin\Link /SUBSYSTEM:CONSOLE /OPT:NOREF %1.obj здесь %1 - имя исходника.
Создал свой bat'ник и скомпилировал, всё заработало, но выводит место русских букв "браукадабру", подскажите пожалуйста где поменять кодировку? Блин автор книги, гад даже неупоминул про "/SUBSYSTEM:CONSOLE"...
Если без CharToOem, то все определяется тем, где и каким шрифтом ты набираешь исходник. Набираешь в ФАРе - один результат, в блокноте - другой. Поскольку ты тренируешься и изучаешь программирование, можно в данный момент не заморачиваться, убедился что работает и выводит строку - переходи к следующему )) в конце концов, даже у Микрософта косяки бывают, попробуй в командной строке telnet /? набрать, убедишься...
Вот почему автор и набирал в FAR'е Ладно и на этом спасибо свем, тем кто помог(причем оперативно, на некоторых форумах и неделю ответа можно прождать...)!
Двигаясь дальше по книге, наткнулся на следующую проблему: Компилятор нехотит компилить нижеприведенный код... Код (Text): .386 .model flat, stdcall option casemap:none include c:\masm32\include\kernel32.inc includelib c:\masm32\lib\kernel32.lib BSIZE equ 20 .data? simple db BSIZE dup(?) .code start: mov ecx, BSIZE mov bx, 1 mov edi, 0 nxt: mov simple[edi], bx inc bx add edi, 2 loop nxt invoke ExitProcess, 0 end start Вот что пишет при компиляции: Код (Text): Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: C:\masm32\new\l45.asm C:\masm32\new\l45.asm(17) : error A2070: invalid instruction operands 17-ая строка - это где находиться метка "nxt". Хотя этот код полностью совпадает с кодом а книге. Пы.Сы. решил не создавать новую тему, дабы не загрязнять форум.
Код (Text): mov [simple + edi], bx Пробовал и так, непомогает, вылетает с той же ошибкой Вот что автор пишет по поводу компилятора, дальше ничего о нем не упоминает... А ниже приведен оригинальный листинг программы и это не опечатка т.к. далее встречается "simple[edi], bx"
Все отбой, нашел ошибку!... Вернее опечатку... Я написал так: Код (Text): simple db BSIZE dup(?) А надо было так: Код (Text): simple dw BSIZE dup(?) Теперь компилит и так "[simple + edi]" и так "simple[edi]"