Новичок
Профиль
Группа: Участник
Сообщений: 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
|
|