Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Арифметика в оконном приложении 
:(
    Опции темы
A6cypg
Дата 23.4.2014, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Есть код, который должен принимать два числа: число, которое нужно перевести и нужную систему счисления. Проблема в том, что выводятся символы или большие числа. Проблема, по всей видимости, в кодировке. Буду благодарен за совет.
Код

.386p 
.model flat, stdcall
option casemap:none

;определение функций
include edit.inc
include c:\masm32\macros\macros.asm
include c:\masm32\include\masm32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
;библиотеки
includelib c:\masm32\lib\masm32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;===============================================================================

; сегмент данных
.data
    ;переменные 
    N DD ?
    SC DD ?
    NUMB DWORD 0
    NEWHWND  DD 0
    MSG      MSGSTRUCT <?>
    WC       WNDCLASS  <?>
    HINST     DD 0 ; дескриптор приложения
    TITLENAME DB 'Перевод чисел',0
    CLASSNAME DB 'CLASS32',0
    CPBUT     DB 'Перевести',0
    CPEXIT    DB 'Выход', 0
    CPEDT     DB ' ',0
    CLSBUTN  DB 'BUTTON',0
    CLSEDIT  DB 'EDIT',0
    CLSLBL   DB 'STATIC',0
    HWNDBTN  DWORD 0
    HWNDBTN2  DWORD 0
    HWNDEDT  DWORD 0
    HWNDEDT2 DWORD 0
    HWNDLBL1 DWORD 0
    HWNDLBL2 DWORD 0
    HWNDLBL3 DWORD 0
    ENTER_N  DB 'Введите число',0
    ENTER_SS  DB 'Введите систему счисления',0
    TEXT     DB ' ',0
    DB 50 DUP(0)

; сегмент кода 
.code
START:
; получить дескриптор приложения 
     PUSH 0 
     CALL GetModuleHandleA@4
     MOV  [HINST], EAX 
     
REG_CLASS:
; заполнить структуру окна
; стиль
     MOV [WC.CLSSTYLE], STYLE
; процедура обработки сообщений
     MOV [WC.CLWNDPROC], OFFSET WNDPROC
     MOV [WC.CLSCBCLSEX],0
     MOV [WC.CLSCBWNDEX],0
     MOV EAX, [HINST]
     MOV [WC.CLSHINST], EAX
;------—— иконка окна
     PUSH IDI_APPLICATION
     PUSH 0
     CALL LoadIconA@8
     MOV [WC.CLSHICON], EAX 
;---------- курсор окна
     PUSH IDC_ARROW
     PUSH 0
     CALL LoadCursorA@8
     MOV [WC.CLSHCURSOR], EAX 
;--------—
     MOV [WC.CLBKGROUND], 1  ; цвет окна
     MOV DWORD PTR [WC.CLMENNAME], 0
     MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
     PUSH OFFSET WC
     CALL RegisterClassA@4
; создать окно зарегистрированного класса
     PUSH 0
     PUSH [HINST]
     PUSH 0
     PUSH 0
     PUSH 250 ; DY - высота окна
     PUSH 410 ; DX - ширина окна
     PUSH 100 ; Y - координата левого верхнего угла
     PUSH 100 ; X - координата левого верхнего угла
     PUSH WS_OVERLAPPEDWINDOW
     PUSH OFFSET TITLENAME ; имя окна
     PUSH OFFSET CLASSNAME ; имя класса
     PUSH 0
     CALL CreateWindowExA@48 
; проверка на ошибку
     CMP EAX, 0
     JZ  _ERR
     MOV [NEWHWND], EAX ; дескриптор окна
     PUSH SW_SHOWNORMAL
     PUSH [NEWHWND] 
     CALL ShowWindow@8 ; показать созданное окно
;------------------------------------------------------------
     PUSH [NEWHWND] 
     CALL UpdateWindow@4 ; команда перерисовать видимую 
                         ; часть окна, сообщение WM_PAINT 
; петля обработки сообщений
MSG_LOOP:
     PUSH 0
     PUSH 0
     PUSH 0
     PUSH OFFSET MSG
     CALL GetMessageA@16
     CMP EAX, 0
     JE  END_LOOP
     PUSH OFFSET MSG
     CALL TranslateMessage@4
     PUSH OFFSET MSG
     CALL DispatchMessageA@4
     JMP MSG_LOOP
END_LOOP:
; выход из программы (закрыть процесс) 
     PUSH [MSG.MSWPARAM]
     CALL ExitProcess@4
_ERR:
     JMP END_LOOP 
; процедура окна 
; расположение параметров в стеке
; [EBP+014Н]  ; LPARAM
; [EBP+10H]   ; WAPARAM
; [EBP+0CH]   ; MES
; [EBP+8]     ; HWND
WNDPROC  PROC
     PUSH EBP
     MOV EBP,ESP
     PUSH EBX
     PUSH ESI
     PUSH EDI 
     CMP DWORD PTR [EBP+0CH] ,WM_DESTROY
     JE  WMDESTROY
     CMP DWORD PTR [EBP+0CH] ,WM_CREATE 
     JE  WMCREATE 
     CMP DWORD PTR [EBP+0CH] ,WM_COMMAND
     JE  WMCOMMND
     JMP DEFWNDPROC
WMCOMMND:
    MOV EAX,HWNDBTN2
    CMP DWORD PTR [EBP+14H],EAX
    JE WMDESTROY
    
    MOV EAX,HWNDBTN
    CMP DWORD PTR [EBP+14H],EAX
    JNE NODESTROY 
; получить число 
    PUSH OFFSET N
    PUSH 150 
    PUSH WM_GETTEXT
    PUSH HWNDEDT
    CALL SendMessageA@16
    PUSH EAX
    ;получить систему счисления
    PUSH OFFSET SC
    PUSH 150 
    PUSH WM_GETTEXT
    PUSH HWNDEDT2
    CALL SendMessageA@16
    PUSH EAX
    ;===========МАТЕМАТИКА============
    XOR ECX, ECX ;установка нуля
    POP EBX
    POP EAX
    TR:
        CWD
        SUB EDX, EDX
        DIV EBX
        PUSH EDX ; ОСТАТОК В СТЕК
        INC ECX ; ECX = ECX + 1
        TEST EAX, EAX ; CMP EAX, 0
        JNZ TR

    SCAN:
        MOV EBX, ECX
        POP EAX
        MOV SC, EAX
        invoke dwtoa, addr SC, addr TEXT
        PUSH OFFSET TEXT
        PUSH 150 
        PUSH WM_SETTEXT
        PUSH HWNDLBL3
        CALL SendMessageA@16
        MOV ECX, EBX
        LOOP SCAN    
; на выход 
     ;JMP WMDESTROY
NODESTROY:
     MOV EAX, 0
     JMP FINISH
WMCREATE:
; создать окно-кнопку 
    PUSH 0 
    PUSH [HINST]
    PUSH 0 
    PUSH DWORD PTR [EBP+08H]
    PUSH 40   ; DY
    PUSH 75   ; DX
    PUSH 150   ; Y
    PUSH 10   ; X
    PUSH STYLBTN 
    PUSH OFFSET CPBUT    ; имя окна
    PUSH OFFSET CLSBUTN  ; имя класса
    PUSH 0 
    CALL CreateWindowExA@48 
    MOV HWNDBTN,EAX ; запомнить дескриптор кнопки
    ; создать кнопку выхода 
    PUSH 0 
    PUSH [HINST]
    PUSH 0 
    PUSH DWORD PTR [EBP+08H]
    PUSH 40   ; DY
    PUSH 75   ; DX
    PUSH 150   ; Y
    PUSH 310   ; X
    PUSH STYLBTN 
    PUSH OFFSET CPEXIT    ; имя окна
    PUSH OFFSET CLSBUTN  ; имя класса
    PUSH 0 
    CALL CreateWindowExA@48 
    MOV HWNDBTN2,EAX ; запомнить дескриптор кнопки
     ; введите число
    PUSH 0
    PUSH [HINST] 
    PUSH 0 
    PUSH DWORD PTR [EBP+08H]
    PUSH 20   ; DY
    PUSH 200  ; DX
    PUSH 10   ; Y
    PUSH 10   ; X
    PUSH STYLEDT 
    PUSH OFFSET ENTER_N   ; имя окна
    PUSH OFFSET CLSLBL ; имя класса
    PUSH 0 
    CALL CreateWindowExA@48
    MOV HWNDLBL1,EAX
    ; введите систему счисления
    PUSH 0
    PUSH [HINST] 
    PUSH 0 
    PUSH DWORD PTR [EBP+08H]
    PUSH 20   ; DY
    PUSH 200  ; DX
    PUSH 70   ; Y
    PUSH 10   ; X
    PUSH STYLEDT 
    PUSH OFFSET ENTER_SS  ; имя окна
    PUSH OFFSET CLSLBL ; имя класса
    PUSH 0 
    CALL CreateWindowExA@48
    MOV HWNDLBL2,EAX
    ; ответ
    PUSH 0
     PUSH [HINST] 
     PUSH 0 
     PUSH DWORD PTR [EBP+08H]
     PUSH 20   ; DY
     PUSH 200  ; DX
     PUSH 150   ; Y
     PUSH 98   ; X
     PUSH STYLEDT 
     PUSH 0  ; имя окна
     PUSH OFFSET CLSLBL ; имя класса
     PUSH 0 
     CALL CreateWindowExA@48
     MOV HWNDLBL3,EAX
    ; ввод числа 
     PUSH 0
     PUSH [HINST] 
     PUSH 0 
     PUSH DWORD PTR [EBP+08H]
     PUSH 20   ; DY
     PUSH 350  ; DX
     PUSH 30   ; Y
     PUSH 10   ; X
     PUSH STYLEDT 
     PUSH 0   ; имя окна
     PUSH OFFSET CLSEDIT ; имя класса
     PUSH 0 
     CALL CreateWindowExA@48
     MOV HWNDEDT,EAX
    ; ввод системы счисления 
     PUSH 0
     PUSH [HINST] 
     PUSH 0 
     PUSH DWORD PTR [EBP+08H]
     PUSH 20   ; DY
     PUSH 350  ; DX
     PUSH 90   ; Y
     PUSH 10   ; X
     PUSH STYLEDT 
     PUSH 0   ; имя окна
     PUSH OFFSET CLSEDIT ; имя класса
     PUSH 0 
     CALL CreateWindowExA@48
     MOV HWNDEDT2,EAX 
;--------- установить фокус на окне редактирования 
     PUSH HWNDEDT
     CALL SetFocus@4 
;------------------------------------------------------------
     MOV EAX, 0
     JMP FINISH 
DEFWNDPROC: 
     PUSH DWORD PTR [EBP+14H]
     PUSH DWORD PTR [EBP+10H]
     PUSH DWORD PTR [EBP+0CH]
     PUSH DWORD PTR [EBP+08H]
     CALL DefWindowProcA@16
     JMP FINISH 
WMDESTROY: 
     PUSH 0 
     CALL PostQuitMessage@4 ; сообщение WM_QUIT
     MOV EAX, 0 
FINISH:
     POP EDI
     POP ESI
     POP EBX 
     POP EBP
     RET 16
WNDPROC ENDP
_TEXT ENDS
END START

 
PM MAIL   Вверх
tzirechnoy
Дата 23.4.2014, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Какой приличный текст вне отметки МАТЕМАТИКА, и какой хтонический ужас внутри!

Вы зачем-то делите количество знаков (символов) во введённом числе на количество знаков во введённой системе исчисления.

Впрочем, там потом ещё dwtoa неправильно вызывается, и цыфры перезатирают друг друга.
PM MAIL   Вверх
Google
  Дата 26.5.2019, 12:00 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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