Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вещественная арифметика, сопроцессор 
:(
    Опции темы
cupoma58
Дата 11.5.2018, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ищущий



Профиль
Группа: Awaiting Authorisation
Сообщений: 31
Регистрация: 3.3.2017

Репутация: нет
Всего: нет



Помогите разобратся:
Код

  ...
wmcommand:
  movzx eax,word ptr [ebp+10h]
  cmp   eax,..h            ;id_but --> "цифра или символ точка"                 
  je    nabor 
  cmp   eax,1Ch            ;id_but --> "+"                 
  je    plus
  ... 
  cmp   eax,24h            ;id_but --> "="                 
  je    itog
  ...
  jmp   defwndproc

  ;обработка нажатия кнопок:

  nabor:
    ...
    call  SetWindowTextA@8  ;набрали 1-e число
    ...
  plus:                     ;нажали "+"
    mov   edx,0             ;очищаем регистр и...
    mov   edx,1Ch           ;...сохраняем id кнопки --> "+"
    mov   str1,eax          ;сохраняем 1-е число 
    finit                   ;инициируем сопроцессор
    fld   str1              ;str1-->st(0)
    call  clear             ;очищаем дисплей  
    ...
  ;набрали 2-е число...число набирается и остаётся на дисплее 
    ...
  itog:                     ;нажали "="
    cmp   edx,1Ch           ;если нажали "+"...                
    je    plus_ex           ;...переходим сюда...не переходим
    ...
  plus_ex:
    call  clear             ;очищаем дисплей
    mov   str2,eax          ;сохраняем 2-e число в str2
    mov   eax,buf           ;освобождаем буфер  
    fadd  str2              ;st(0)+str2-->st(0) 
    fst   buf               ;st(0)-->buf 
    fwait 
    push  buf               ;здесь сумма
    push  [hWndEdt]
    call  SetWindowTextA@8  ;выводим её на дисплей
    jmp   exit 
    ...
  exit:
    mov  eax,0
    jmp  finish
    ...
  finish:
    pop  edi
    pop  esi
    pop  ebx
    pop  ebp
    ret  16
winproc endp
clear  proc
  push  Edt
  push  [hWndEdt]
  call  SetWindowTextA@8
  ret
clear  endp
end go

После нажатия "=" на дисплее остаётся 2-е набранное число. Убрал из "plus_ex:" всё, кроме 
"call clear" и "jmp exit" - картина не меняется. Похоже, что код в метке "itog:" не работает и 
переход к "plus_ex:" не происходит. В чём дело - понять не могу. 
 

Это сообщение отредактировал(а) cupoma58 - 18.5.2018, 11:59
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 25.5.2018, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Строка 31 какая-то странная:
- на метку itog управление попадает со строки 10, когда проверили, что в eax код '='
- на метке itog начинается проверка того, что в edx (sic!) находится код '+'

Т.е. у вас проблемы со структурой кода - хаотичные переходы и ветвления.

Могу показать простой калькулятор для целых чисел:
- ввод выражения (строки)
- разбор выражения (безприоритетное вычисление) с целыми числами
- вывод результата
Код
.686
.model flat, stdcall
option casemap :none

        include \masm32\include\windows.inc

        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc

        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        aszPrompt       db      'Expression: ', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        aszResult       db      10, 13, "Result of your equation is %d", 0

        OpAdd           equ     '+'
        OpSub           equ     '-'
        OpMul           equ     '*'
        OpDiv           equ     '/'

        AllowedChars    db      '=+-*/0123456789'
        LenAllowedChars equ     $-AllowedChars
        OpChars         db      '=+-*/'
        LenOpChars      equ     $-OpChars
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        Result          dd      ?
        Op1             dd      ?
        Op2             dd      ?
        Operation       db      ?
.code

PrevOperation   proc
                mov     eax,    [Op1]
                cdq
                mov     ebx,    [Op2]
                cmp     [Operation],    OpAdd
                jne     @@Sub
                add     eax,    ebx
                jmp     @@Calc
        @@Sub:
                cmp     [Operation],    OpSub
                jne     @@Mul
                sub     eax,    ebx
                jmp     @@Calc
        @@Mul:
                cmp     [Operation],    OpMul
                jne     @@Div
                mul     ebx
        @@Div:
                cmp     [Operation],    OpDiv
                jne     @@Calc
                idiv    ebx
        @@Calc:
                mov     [Op1],  eax
                mov     [Op2],  0
                mov     al,     [esi-1]
                mov     [Operation],    al
        ret
PrevOperation   endp

main    proc

        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax

        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax

        invoke  ClearScreen

        ;ввод выражения
        invoke  WriteConsole, hConsoleOutput, ADDR aszPrompt,\
                LENGTHOF aszPrompt-1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление из буфера
        add     esi,    [BufLen]        ;символов перевода строки
        mov     [esi-2],word ptr 0
        sub     [BufLen],       2

        ;обработка выражения во введённой строке
        mov     eax,    0
        mov     [Op1],  0
        mov     [Op2],  0
        mov     [Operation],    OpAdd

        lea     esi,    [Buffer]
        mov     ecx,    [BufLen]
        @@GetCmd:
                push    ecx
                lodsb
                ;проверка корректности введённых символов
                lea     edi,    [AllowedChars]
                mov     ecx,    [LenAllowedChars]
                repne   scasb
                jnz     @@Next
        @@ProcessChar:
                lea     edi,    [OpChars]
                mov     ecx,    [LenOpChars]
                repne   scasb
                jz      @@DoOperation
        @@TestDigits:
                ;введена цифра
                and     eax,    0FFh
                sub     al,     '0'
                mov     ebx,    [Op2]
                lea     eax,    [eax+8*ebx]
                lea     eax,    [eax+2*ebx]
                mov     [Op2],  eax

                pop     ecx
                push    ecx
                cmp     ecx,    1
                jne     @@Next

        @@DoOperation:
                ;сначала завершается предыдущая операция
                call    PrevOperation
                cmp     al,     '='
                jne     @@Next
                pop     ecx
                jmp     @@Break
        @@Next:
                pop     ecx
        loop    @@GetCmd
@@Break:
ResultShow:
        ;вывод результата
        mov     eax,    [Op1]
        invoke  wsprintf, ADDR Buffer, ADDR aszResult, eax
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL

        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL

        invoke  ExitProcess, 0
main    endp

end     main

PM   Вверх
cupoma58
Дата 29.5.2018, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ищущий



Профиль
Группа: Awaiting Authorisation
Сообщений: 31
Регистрация: 3.3.2017

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 25.5.2018,  11:34)
Строка 31 какая-то странная:
- на метку itog управление попадает со строки 10, когда проверили, что в eax код '='
- на метке itog начинается проверка того, что в edx (sic!) находится код '+'

Т.е. у вас проблемы со структурой кода - хаотичные переходы и ветвления.

Могу показать простой калькулятор для целых чисел:
- ввод выражения (строки)
- разбор выражения (безприоритетное вычисление) с целыми числами
- вывод результата
Код
.686
.model flat, stdcall
option casemap :none

        include \masm32\include\windows.inc

        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc

        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        aszPrompt       db      'Expression: ', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        aszResult       db      10, 13, "Result of your equation is %d", 0

        OpAdd           equ     '+'
        OpSub           equ     '-'
        OpMul           equ     '*'
        OpDiv           equ     '/'

        AllowedChars    db      '=+-*/0123456789'
        LenAllowedChars equ     $-AllowedChars
        OpChars         db      '=+-*/'
        LenOpChars      equ     $-OpChars
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        Result          dd      ?
        Op1             dd      ?
        Op2             dd      ?
        Operation       db      ?
.code

PrevOperation   proc
                mov     eax,    [Op1]
                cdq
                mov     ebx,    [Op2]
                cmp     [Operation],    OpAdd
                jne     @@Sub
                add     eax,    ebx
                jmp     @@Calc
        @@Sub:
                cmp     [Operation],    OpSub
                jne     @@Mul
                sub     eax,    ebx
                jmp     @@Calc
        @@Mul:
                cmp     [Operation],    OpMul
                jne     @@Div
                mul     ebx
        @@Div:
                cmp     [Operation],    OpDiv
                jne     @@Calc
                idiv    ebx
        @@Calc:
                mov     [Op1],  eax
                mov     [Op2],  0
                mov     al,     [esi-1]
                mov     [Operation],    al
        ret
PrevOperation   endp

main    proc

        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax

        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax

        invoke  ClearScreen

        ;ввод выражения
        invoke  WriteConsole, hConsoleOutput, ADDR aszPrompt,\
                LENGTHOF aszPrompt-1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление из буфера
        add     esi,    [BufLen]        ;символов перевода строки
        mov     [esi-2],word ptr 0
        sub     [BufLen],       2

        ;обработка выражения во введённой строке
        mov     eax,    0
        mov     [Op1],  0
        mov     [Op2],  0
        mov     [Operation],    OpAdd

        lea     esi,    [Buffer]
        mov     ecx,    [BufLen]
        @@GetCmd:
                push    ecx
                lodsb
                ;проверка корректности введённых символов
                lea     edi,    [AllowedChars]
                mov     ecx,    [LenAllowedChars]
                repne   scasb
                jnz     @@Next
        @@ProcessChar:
                lea     edi,    [OpChars]
                mov     ecx,    [LenOpChars]
                repne   scasb
                jz      @@DoOperation
        @@TestDigits:
                ;введена цифра
                and     eax,    0FFh
                sub     al,     '0'
                mov     ebx,    [Op2]
                lea     eax,    [eax+8*ebx]
                lea     eax,    [eax+2*ebx]
                mov     [Op2],  eax

                pop     ecx
                push    ecx
                cmp     ecx,    1
                jne     @@Next

        @@DoOperation:
                ;сначала завершается предыдущая операция
                call    PrevOperation
                cmp     al,     '='
                jne     @@Next
                pop     ecx
                jmp     @@Break
        @@Next:
                pop     ecx
        loop    @@GetCmd
@@Break:
ResultShow:
        ;вывод результата
        mov     eax,    [Op1]
        invoke  wsprintf, ADDR Buffer, ADDR aszResult, eax
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL

        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL

        invoke  ExitProcess, 0
main    endp

end     main

Всё - разобрался. В цепочках "oper-->itog-->oper_ex" были лишние команды. За код - благодарю, но целые числа - это не 
интересно. Я уже добиваю прямую конвертацию. Ещё чуть-чуть...
                                                                                                         smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1265 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.