Помогите! В программу вводится 1 число Затем к нему прибавляется 2 и выводится результат, к примеру x=1 f=3 Если f<10 то всё выводится нармально, если же больше 10 то вместо числа выводится двоеточие, кавычки, какаято дурь, либо неверный результат вычисления Вот код: .486 .model flat, stdcall include windows.inc includelib kernel32.lib include kernel32.inc .data messagex db 'x=' messagef db ' f=' .data? message_l dd ? read_l dd ? buffer db 256 dup (?) x dd ? y dd ? f dd ? .code _start: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset messagex, 2, offset read_l, 0 invoke GetStdHandle, STD_INPUT_HANDLE invoke ReadConsole, eax, offset x, 256, offset read_l, 0 mov eax,x add eax, 2 mov f, eax invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset messagex, 2, offset read_l, 0 invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset f, read_l, offset message_l, 0 invoke ExitProcess, 0 end _start
ReadConsole afaik возвращает строку, а ты её используешь как число. Для символов от "0" до "9" всё правильно будет, а дальше - естественно ":", ";", "<", "=", ">", "?"... Юзай функцию atoi для преобразования строки в число и itoa для обратного.
А ещё лучше -- напиши сам такие функции. Не из-за того, что упомянутые плохи, а чтобы разобраться, как это делается.
...masm32... .data lpFmt db "%d",0 .data ? Text db 32 dup(?) ;насчет числа 32 - это же 32 копии переменной размером в слово, если необходимо вывести одну цифру сколько нужно dup ? 1 ? .code ; что-то химичишь, результат в eax invoke wsprintf, addr Text, addr lpFmt, eax ; и - offset Text, вроде должно работать ; а просто offset f не совсем то, что надо
loxodromic резервируется место под 32 байта, а не 32 копии переменной размером в слово (32*2=64 байта), а для lpFmt db "%d",0 вообще-то достаточно выделить 12 байт. правильно было бы invoke wsprintf, addr Text, addr lpFmt, f спецификация "%d" выдаст вам число со знаком (0FFFFFFFFh=-1) если требуется число без знака (0FFFFFFFFh=4294967295) поставте "%u"
Спасибо Mikl__ за уточнение. Если не трудно - просветите начинающего, немного запутался. Вот выдержка из туториала известного гуру: Код (Text): .data? ManyBytes1 db 5000 dup (?) .data ManyBytes2 db 5000 dup (0) Директивы db, dw и dd используются для определения и инициализации основных единиц памяти: байт (db), слово (dw) и двойное слово (dd), на которую будет указывать метка стоящая перед этой директивой. (5000 dup означает: 5000 копий. Value db 4,4,4,4,4,4,4 это тоже самое, что Value db 7 dup (4) ) ManyBytes1 не будет находится непосредственно в исполнимом файле, а только зарезервирует 5000 байт в памяти. А ManyBytes2 будет полностью вложена в испонимый файл, делая его на 5000 байт больше. Таким образом ваш файл будет содержать 5000 нулей, а это не рационально. Т.е. - всё таки копий ? А можно ли написать? : dw 2 dup (?) и что это будет означать - зарезервировано 2 байта или всё таки 2х2 байта? И еще вопрос - сколько байт нужно зарезервировать для строки "4",0 ? Такое ощущение,что 2 , т.е. нужно было написать : Text db 2 dup (?)
Вроде зделал, но выдаёт ошибку unresold external symbol wsprintfA .486 .model flat, stdcall include windows.inc includelib kernel32.lib include kernel32.inc .data messagex db 'x=' messagef db ' f=' lpFmt db "%d",0 .data? message_l dd ? read_l dd ? buffer db 256 dup (?) x dd ? y dd ? f dd ? .code _start: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset messagex, 2, offset read_l, 0 invoke GetStdHandle, STD_INPUT_HANDLE invoke ReadConsole, eax, offset buffer, 256, offset read_l, 0 movzx eax,byte ptr buffer sub eax,'0' add eax,2 invoke wsprintf, addr buffer, addr lpFmt, eax invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset messagex, 2, offset read_l, 0 invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset buffer, read_l, offset message_l, 0 invoke ExitProcess, 0 end _start
loxodromic 1) ManyBytes db 5000 dup (0); в памяти резервируется 5000 байт заполненных 0 ManyBytes dw 5000 dup (0); в памяти резервируется 10000 байт заполненных 0 ManyBytes dd 5000 dup (0); в памяти резервируется 20000 байт заполненных 0 ManyBytes dp 5000 dup (0); в памяти резервируется 30000 байт заполненных 0 ManyBytes dq 5000 dup (0); в памяти резервируется 40000 байт заполненных 0 ManyBytes dt 5000 dup (0); в памяти резервируется 50000 байт заполненных 0 в прочем, если не веришь, проверь экспериментально 2) сколько байт нужно зарезервировать для строки "4",0 правильный ответ: Text db 2 dup (?) 3) .data? ManyBytes1 db 500 dup (?) .data ManyBytes2 db 500 dup (0) утверждать, что "ManyBytes1 не будет находится непосредственно в исполнимом файле, а только зарезервирует 500 байт в памяти." я не буду, наверное это зависит от компилятора или его настроек, я, например, собираю файл Код (Text): \masm32\bin\ml /c /Cp /Gz /Ic:\masm32\include /coff /nologo %1.asm \masm32\bin\Link /SUBSYSTEM:WINDOWS /ALIGN:16 /LIBPATH:c:\masm32\lib /NOLOGO %1.obj следующего содержания Код (Text): .686P .model flat .data? text1 db 500 dup (?) .data text db 500 dup ('A') .code start: end start размер получившегося файла 1488 байт собираю файл Код (Text): .686P .model flat .data text db 500 dup ('A') .code start: end start размер 976 байт разница с первым файлом 1488-976=512 байт, т.е. та самая секция неинициализированных данных (500 байт) плюс выравнивание обычно если мне требуется временное хранилище в 500 байт, которые не должны занять место в файле использую MASM'овскую диррективу LOCAL buffer[500]:byte либо Код (Text): sub esp, 500 ; резервируем память под буфер в стеке mov ebx, esp ; сохраняем указатель на буфер в EBX ... ; что-то делаем, адресуясь к буфферу через EBX add esp, 500 ; уничтожаем буфер
Огромное спасибо за толковые советы, но к сожалению у меня слишком мало времени чтобы изучить ассемблер в полное мере понимая всё то што он делает, т.к. в пятницу контрольная Пожалуйста помогите разобратся с типовой задачкой, есть две переменных и надо произвести над ними несколько арифметических дейтсвий. С арифметикой всё просто и понятно. Я ПРОШУ вас помоч с преобразованием введённого с клавиатуры "символа" в число а затем полученного числа в символ К примеру вводим переменную buffer invoke GetStdHandle, STD_INPUT_HANDLE invoke ReadConsole, eax, offset buffer, 256, offset read_l, 0 Преобразовываем buffer в число Всякие математические операции с числом преобразовываем число в символ rez Выводим символ invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset rez, read_l, offset message_l, 0
Как вывести число см. выше, а вот как вводимый с клавиатуры символ преодразовать в число - не так-то просто обьяснить... я не делал, надобности не было .. но - Когда нажимаешь клавишу - окно не получает сообщения, оно обрабатывается внутри едита. Его нужно субклассировать и перехватить это сообщение, причем буквы нужно отфильтровывать. После чего из кода числа - получить само число ... и так далее. Это просто, только не просто сделать, чтобы всё работало и не глючило, сори сейчас очень занят и не могу помочь. Читай уроки Икзелиона, там всё есть - за пару вечеров можно разобраться. А насчет консоли - не ухо ни рыло... Скачай mbuilder2.0, ссылка есть в разделе Heap В нем очень удобно работать.
Объясните пожалуста строчки mov eax,dword ptr bigval_1 И mov eax,dword ptr bigval_1[4] Точнее что значит dword ptr bigval_1 и dword ptr bigval_1[4] И movzx eax,byte ptr chr sub eax,'0' mov val,eax