Прибавить к число 2 (MASM)

Тема в разделе "WASM.BEGINNERS", создана пользователем sNick, 18 дек 2007.

  1. sNick

    sNick New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    4
    Помогите!
    В программу вводится 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
     
  2. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    ReadConsole afaik возвращает строку, а ты её используешь как число. Для символов от "0" до "9" всё правильно будет, а дальше - естественно ":", ";", "<", "=", ">", "?"...
    Юзай функцию atoi для преобразования строки в число и itoa для обратного.
     
  3. SII

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

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

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    sNick
    Посмотри пример в аттаче и не парь моск:)
     
  5. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
    ...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 не совсем то, что надо
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    loxodromic
    резервируется место под 32 байта, а не 32 копии переменной размером в слово (32*2=64 байта), а для lpFmt db "%d",0 вообще-то достаточно выделить 12 байт.
    правильно было бы invoke wsprintf, addr Text, addr lpFmt, f спецификация "%d" выдаст вам число со знаком (0FFFFFFFFh=-1) если требуется число без знака (0FFFFFFFFh=4294967295) поставте "%u"
     
  7. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
    Спасибо Mikl__ за уточнение.
    Если не трудно - просветите начинающего, немного запутался.
    Вот выдержка из туториала известного гуру:

    Код (Text):
    1. .data?
    2. ManyBytes1 db 5000 dup (?)
    3. .data
    4. ManyBytes2 db 5000 dup (0)
    5.  
    6. Директивы db, dw и dd используются для определения и
    7. инициализации основных единиц памяти:  
    8. байт (db), слово (dw) и двойное слово (dd),
    9. на которую будет указывать метка стоящая перед этой директивой.
    10.  
    11. (5000 dup означает: 5000 копий. Value db 4,4,4,4,4,4,4 это тоже
    12. самое, что Value db 7 dup (4) )
    13.  
    14. ManyBytes1 не будет находится непосредственно в исполнимом
    15. файле, а только зарезервирует 5000 байт в памяти. А ManyBytes2
    16. будет полностью вложена в испонимый файл, делая его на 5000
    17. байт больше. Таким образом ваш файл будет содержать 5000 нулей,
    18. а это не рационально.
    Т.е. - всё таки копий ?

    А можно ли написать? :
    dw 2 dup (?)
    и что это будет означать - зарезервировано 2 байта или всё
    таки 2х2 байта?

    И еще вопрос - сколько байт нужно зарезервировать для
    строки "4",0 ? Такое ощущение,что 2 , т.е. нужно было
    написать :

    Text db 2 dup (?)
     
  8. sNick

    sNick New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    4
    Вроде зделал, но выдаёт ошибку

    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
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    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):
    1. \masm32\bin\ml /c /Cp /Gz /Ic:\masm32\include /coff /nologo %1.asm
    2. \masm32\bin\Link /SUBSYSTEM:WINDOWS /ALIGN:16 /LIBPATH:c:\masm32\lib /NOLOGO %1.obj
    следующего содержания
    Код (Text):
    1. .686P
    2. .model flat
    3. .data?
    4. text1 db 500 dup (?)
    5. .data
    6. text db 500 dup ('A')
    7. .code
    8. start: 
    9. end start
    размер получившегося файла 1488 байт
    собираю файл
    Код (Text):
    1. .686P
    2. .model flat
    3. .data
    4. text db 500 dup ('A')
    5. .code
    6. start: 
    7. end start
    размер 976 байт разница с первым файлом 1488-976=512 байт, т.е. та самая секция неинициализированных данных (500 байт) плюс выравнивание
    обычно если мне требуется временное хранилище в 500 байт, которые не должны занять место в файле использую MASM'овскую диррективу LOCAL buffer[500]:byte
    либо
    Код (Text):
    1.         sub esp, 500 ; резервируем память под буфер в стеке
    2.         mov ebx, esp            ; сохраняем указатель на буфер в EBX
    3.         ... ; что-то делаем, адресуясь к буфферу через EBX
    4.         add esp, 500     ; уничтожаем буфер
     
  10. sNick

    sNick New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    4
    Огромное спасибо за толковые советы, но к сожалению у меня слишком мало времени чтобы изучить ассемблер в полное мере понимая всё то што он делает, т.к. в пятницу контрольная
    Пожалуйста помогите разобратся с типовой задачкой, есть две переменных и надо произвести над ними несколько арифметических дейтсвий. С арифметикой всё просто и понятно. Я ПРОШУ вас помоч с преобразованием введённого с клавиатуры "символа" в число а затем полученного числа в символ

    К примеру вводим переменную 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
     
  11. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
    Как вывести число см. выше, а вот как вводимый с клавиатуры символ преодразовать в число - не так-то просто обьяснить... я не делал, надобности не было .. но -

    Когда нажимаешь клавишу - окно не получает сообщения, оно обрабатывается внутри едита. Его нужно субклассировать и перехватить это сообщение, причем буквы нужно отфильтровывать. После чего из кода числа - получить само число ... и так далее.
    Это просто, только не просто сделать, чтобы всё работало и не глючило, сори сейчас очень занят и не могу помочь.
    Читай уроки Икзелиона, там всё есть - за пару вечеров можно разобраться.

    А насчет консоли - не ухо ни рыло...

    Скачай mbuilder2.0, ссылка есть в разделе Heap
    В нем очень удобно работать.
     
  12. sNick

    sNick New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    4
    Объясните пожалуста строчки

    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
     
  13. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    sNick
    Пример на сложение A+B=F сорц и ехе в аттаче