Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
1

Две одинаковые функции работают по-разному. WinApi + asm

05.06.2016, 14:45. Показов 535. Ответов 2
Метки нет (Все метки)

Задача: ввести строку(winapi), удалить пробелы(asm) и вывести измененную строку(без пробелов)(winapi).
Почему, когда я вызываю (стр. 202) функцию (стр. 9) func(), то она работает правильно, но если я вызываю эту же функцию, но уже в виде отдельного модуля StrDel, то она работает неправильно? После метки m1 (в результате пошагового прохода)команда repne scasb работает по-разному(в func edi увеличивается на 3 и ecx уменьшается на 3,а в StrDel edi увеличивается на 1 и ecx уменьшается на 1), хотя до этой команды две функции func и StrDel выполняют одни и те же операции и при пошаговом проходе они работают одинаково до команды repne scasb(стр. 54 в модуле).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
#include "stdafx.h"
#include "assemANDwinapi.h"
extern "C" void StrDel(TCHAR*a, int m);
 
#define MAX_LOADSTRING 100
#define ID_EDIT 1001
#define ID_EDIT1 1003
#define ID_BUTTON 1002
void func(char* strin, int number)
{
    __asm
    {
        mov edx, strin
        mov ecx, number
        mov edi, strin
        xor eax, eax
        mov al, ' '
        cld
        //-----------------------------------------------//
        repe scasb
        jecxz c4
        //-----------------------------------------------//
        mov ebx, edi
        dec ebx
        repne scasb
        push ecx
        mov ecx, edi
        sub ecx, ebx
        push edi
        mov edi, edx
        mov esi, ebx
        rep movsb
        mov edx, edi
        pop edi
        pop ecx
        //-----------------------------------------------//
        cmp ecx, 0
        jnz c1
        //-----------------------------------------------//
        c1 :
        repe scasb
            jecxz c4
            //-----------------------------------------------//
            mov ebx, edi
            dec ebx
            cmp[ebx], ';'
            jne m1
            dec edx
            //-----------------------------------------------//
            m1 :
        repne scasb
            //-----------------------------------------------//
            push ecx
            mov ecx, edi
            sub ecx, ebx
            push edi
            mov edi, edx
            mov esi, ebx
            rep movsb
            mov edx, edi
            pop edi
            pop ecx
            //-----------------------------------------------//
            cmp ecx, 0
            jnz c1
            //-----------------------------------------------//
 
            c4 :
        //-----------------------------------------------//
        mov edi, strin
            add edi, number
            cmp edx, edi
            je c5
            cmp[edx - 1], ' '
            jnz c2
            dec edx
            //-----------------------------------------------//
            c2 :
        mov[edx], 0
            c5 :
    }
}
// Global Variables:
TCHAR *chint;
TCHAR *chBuff;
int n;
bool justdoit = false;
static HDC hdc;
HINSTANCE hInst;                                // current instance
WCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
WCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
 
// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    // TODO: Place code here.
   
    // Initialize global strings
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_ASSEMANDWINAPI, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ASSEMANDWINAPI));
 
    MSG msg;
 
    // Main message loop:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ASSEMANDWINAPI));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_ASSEMANDWINAPI);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassExW(&wcex);
}
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
 
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hEdit, hEdit1, hButton; 
    switch (message)
    {
    case WM_CREATE:
        hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 
            80, 10, 250, 20, hWnd, (HMENU)ID_EDIT, hInst, NULL);
        hEdit1 = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
            400, 10, 420, 20, hWnd, (HMENU)ID_EDIT1, hInst, NULL);
        hButton = CreateWindow("button", "ENTER", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            87, 45, 237, 100, hWnd, (HMENU)ID_BUTTON, hInst, NULL);
        break;
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            switch (wmId)
            {
            case ID_BUTTON:
                chint = new char[0];
                SendMessage(hEdit1, EM_GETLINE, 0, (LPARAM)chint);      
                n = atoi(chint);
                chBuff = new char[n];
                chBuff[n] = 0;
 
                SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)chBuff);
                StrDel(chBuff,n+1);
                justdoit = true;
                InvalidateRect(hWnd,NULL,TRUE);
                break;
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
      {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            TextOut(hdc, 10, 12, "ENTER: ", 7); 
            TextOut(hdc, 10, 152,"RESULT: ", 8);
            if(justdoit)
            TextOut(hdc, 80, 152, chBuff, strlen(chBuff));
            else
            TextOut(hdc, 80, 152, "result here...", 16);
            justdoit = false;
            EndPaint(hWnd, &ps);
        }
        break;
    
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
Отдельный модуль StrDel:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
.386
.model flat
.data
.code
 
PUBLIC _StrDel
 
_StrDel PROC
 
        push ebp
        mov ebp, esp
        push edi
        push ebx
        push esi
        mov edx, [ebp+8]
        mov ecx, [ebp+12]
        mov edi, [ebp+8]
        xor eax, eax
        mov al, ' '
        cld
        ;-----------------------------------------------//
        repe scasb 
        jecxz c4
        ;-----------------------------------------------//
                mov ebx, edi
                dec ebx 
                repne scasb
                push ecx
                mov ecx, edi
                sub ecx, ebx
                push edi
                mov edi, edx
                mov esi, ebx
                rep movsb
                mov edx, edi
                pop edi
                pop ecx
        ;-----------------------------------------------//
        cmp ecx, 0
        jnz c1
        ;-----------------------------------------------//
c1 :
        repe scasb
        jecxz c4
        ;-----------------------------------------------//
                mov ebx, edi
                dec ebx
                mov eax, [ebx]
                cmp eax, ';'
                jne m1
                dec edx
        ;-----------------------------------------------//
m1 :    
        repne scasb
        ;-----------------------------------------------//
                push ecx
                mov ecx, edi
                sub ecx, ebx
                push edi
                mov edi, edx
                mov esi, ebx
                rep movsb
                mov edx, edi
                pop edi
                pop ecx
        ;-----------------------------------------------//
        cmp ecx, 0
        jnz c1
        ;-----------------------------------------------//
 
c4 :
        ;-----------------------------------------------//
        mov edi, [ebp+8]
        add edi, [ebp+12]
        cmp edx, edi
        je c5
        mov eax, [edx-1]
        cmp eax, ' '
        jnz c2
        dec edx
        ;-----------------------------------------------//
c2 :    
        mov eax, 0
        mov [edx], eax
c5 :
    pop esi
    pop ebx
    pop edi 
    pop ebp
ret
 _StrDel endp
 end
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2016, 14:45
Ответы с готовыми решениями:

Почему одинаковые коды работают по разному?
Всем привет! У меня довольно необычная проблема. Суть её в том, что я написал программу по...

Две одинаковые планки не работают вместе
В машине установлено 2 планки DDR2 по 1 ГБ каждая. При тестировании утилитой GoldMemory 6.92 в...

Как работают функции WinAPI?
Объясните пож. как работают Api функции

Две одинаковые функции
Всем привет! Я решил создать программу с OpenGL, подключив библиотеку glut. Затем мне понадобилась...

2
824 / 627 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
05.06.2016, 15:23 2
Цитата Сообщение от _amper Посмотреть сообщение
вывести измененную строку(без пробелов)
Вот написал с затиранием, испробуй, если что давно не писал на asm.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
 
//удаление указанного символа, строка в стиле С
void str_remove(LPTSTR s, TCHAR c){
#if defined(_UNICODE) && defined(UNICODE)
    __asm {  //для UNICODE
        mov esi, s
        mov edi, s
        mov bx,  c
__next:
        mov dx, word ptr [esi]
        cmp dx, L'\0'
        je __end;
 
        cmp word ptr[edi], bx
        je __ok;
        add esi, 2
__ok:
        add edi, 2
        mov dx, word ptr[edi]
        mov word ptr[esi], dx
        jmp __next;
__end:
    };
#else
    __asm { //для ANSI
        mov esi, s
        mov edi, s
        mov bl,  c
__next:
        mov dl, byte ptr [esi]
        cmp dl, '\0'
        je __end;
 
        cmp byte ptr[edi], bl
        je __ok;
        add esi, 1
__ok:
        add edi, 1
        mov dl, byte ptr[edi]
        mov byte ptr[esi], dl
        jmp __next;
__end:
    };
#endif
}
 
int main(void){
    TCHAR s[] = _T("P A S C A L  -  AP L   -  SNOB OL - COB O  L");
 
    _putts(s);
    str_remove(s, _T(' '));
    _putts(s);
    return 0;
}
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 73
05.06.2016, 15:35  [ТС] 3
Мне не нужна функция на встроенном asm. У меня она есть. Мой вопрос был следующим, почему одна и та же команда выполняет разные подсчеты, почему одна и та же функция работает по-разному, а именно функция в модуле работает не правильно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2016, 15:35

Не работают WinAPI функции на Visual C++ 2010
Нашёл у себя старые исходники на VC++ 6-й версии, там в обработчике кнопки просто пишешь например...

Две разные функции возвращают одинаковые адреса!
Всем привет! Написал такую &quot;программу&quot;. Столкнулся с такой проблемой: Две функции, которые должны...

Цикл по-разному выполняет одинаковые команды
Здравствуйте, пишу программу. Если вкратце, то программа сводит кое-какую задачу к задаче линейного...

Две одинаковые строки не распознаются, как одинаковые. Такое возможно? Скриншот дебага прилагается.
Пишу программу, начал тестировать, проходить всё пошагово (пишущийся в данный момент функционал). В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.