· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Ошибка в программе в Win2000

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Апр 14, 2004 09:57:55

Здравствуйте!
Вопрос мой связан с ошибками в
Windows 2000 при выполнении программ.
Вчера, G3 помог мне в написании алгоритма.
Я его получил и захотел выполнить программу,
но... под Windows 2000 Professional прога
не работает. Посмотрите, пожалуйста, что
может такую вызывать ошибку и как её в сорсе
исправить, чтобы все рабочие свойства сохранились
(алгоритм очень нужен!)? Я вчера целый день просидел
над этим вопросом, но даже не понял в чём дело.
До сего момента я сталкивался с ошибками в Win2000,
например при работе с диалогом, если писать в ebx
после GetDlgItemTextA.
Кстати, некоторые программы из раздела "Исходники",
в которых есть сложные вычисления тоже не работают
под Windows 2000. (Например, DriveInfo).
В атаче - сорс.
Заранее спасибо!
1990

_100345908__divide.rar


Дата: Апр 14, 2004 11:14:54

1990
В подпрограмме Divide ты устанавливаешь флажок направления в положение std верни его на место, т.е. сделай cld и будет тебе счастье.


Дата: Апр 14, 2004 11:30:14

Я когда-то запустил под Win2000 программку, которая производила определенные вычисления, а потом преобразовывала результаты в строки символов. Под Win98 она работала без проблем, а под Win2000 не захотела.
Трассировка показала, что сбой давал вызов строковых функций из kernel32.dll (lstrlen, lstrcat, lstrcpy). Я не понял сам, почему это происходило, но после того, как заменил эти функции своими подпрограммами, все стало работать нормально. Если дело не в флажке направления, попробуй заменить функцию lstrlen своей подпрограммой.


Дата: Апр 14, 2004 11:54:16

q_q
Спасибо! Сейчас попробую и скажу о результатах.
bazed
Сенкс!Тоже выход и тоже буду пробовать...


Дата: Апр 14, 2004 12:01:00

q_q
Огромное спасибо! Все заработало. А почему нужно флаг направления сбрасывать в Windows 2000, а в других сбрасывать не нужно? Может быть есть и ещё какие-нибудь такие хитрости?


Дата: Апр 14, 2004 12:13:52

> с ошибками в Windows 2000 при выполнении программ

Однако как грамотно сказано, прямо складывается впечатление что это ошибки в винде, а не что кто-то не умеет правильно писать программы под win32 :-)


Дата: Апр 14, 2004 12:21:43 · Поправил: q_q

1990
А почему нужно флаг направления сбрасывать ...
Если бы я знал точную формулировку, то написал бы ее в предыдущем сообщении. В случае с cld/std знания эмпирические.

Может быть есть и ещё какие-нибудь такие хитрости?
Почему ты используешь
	mov	edx,1
L10:	imul	edx,10
	loop	L10
	mul	edx
а не
L10:	imul	eax,10
	loop	short L10
	xor	edx,edx
?


Дата: Апр 14, 2004 12:28:22 · Поправил: 1990

Dr.Golova
Я не имел ввиду, что ошибки в Windows, а просто говорил, что встретился с трудностями. Если ты считаешь, что я не умею хорошо программить - в этом есть правда, но привязываться к словам не нужно.
q_q
Теперь буду использовать в соотвествии с ситуцией.


Дата: Апр 14, 2004 13:25:48

Я как-то привык не использовать mul/imul при умножении на константу. Вот так можно умножить на 10
lea eax, [eax+eax*4]
shl eax, 1

быстрее на порядок, и как-то понятней, имхо :)


Дата: Апр 14, 2004 13:46:49 · Поправил: Asterix

[ bazed: Трассировка показала, что сбой давал вызов строковых функций из kernel32.dll (lstrlen, lstrcat, lstrcpy). Я не понял сам, почему это происходило, но после того, как заменил эти функции своими подпрограммами, все стало работать нормально. Если дело не в флажке направления, попробуй заменить функцию lstrlen своей подпрограммой.]

:-)

[edited]


Дата: Апр 14, 2004 14:32:31

1990
Твоя IntToStr на самом деле UIntToStr

masquer
Вот так можно умножить на 10
Я не против подобных замен, однако ...
Твой код точно соответствует imul'у? И потом если результат умножения займет больше 32-ух разрядов?

Asterix
что кто-то не умеет пользоваться отладчиком
Cколько времени тебе понадобится, чтобы используя отладчик, в недрах USER32.MessageBox определить, что проблема в std.


Дата: Апр 14, 2004 15:46:29

[ q_q: Cколько времени тебе понадобится, чтобы используя отладчик, в недрах USER32.MessageBox определить, что проблема в std.]

Думаю меньше минуты ;-)


Дата: Апр 14, 2004 15:46:50 · Поправил: Asterix

Вобщем я считаю что опять "отличились" мелкомягкие, вот:
.text:77E375D5 ; int __stdcall MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
.text:77E375D5                 public MessageBoxA
.text:77E375D5 MessageBoxA     proc near
.text:77E375D5
.text:77E375D5 hWnd            = dword ptr  8
.text:77E375D5 lpText          = dword ptr  0Ch
.text:77E375D5 lpCaption       = dword ptr  10h
.text:77E375D5 uType           = dword ptr  14h
.text:77E375D5
.text:77E375D5                 push    ebp
.text:77E375D6                 mov     ebp, esp
.text:77E375D8                 push    ecx
.text:77E375D9                 cmp     dword_77E681DC, 0
.text:77E375E0                 jnz     loc_77E4842A
.text:77E375E6
.text:77E375E6 loc_77E375E6:                           ; CODE XREF: .text:77E48449j
.text:77E375E6                                         ; .text:77E48457j
.text:77E375E6                 push    0               ; wLanguageId
.text:77E375E8                 push    [ebp+uType]     ; uType
.text:77E375EB                 push    [ebp+lpCaption] ; lpCaption
.text:77E375EE                 push    [ebp+lpText]    ; lpText
.text:77E375F1                 push    [ebp+hWnd]      ; hWnd
.text:77E375F4                 call    MessageBoxExA
.text:77E375F9                 leave
.text:77E375FA                 retn    10h
.text:77E375FA MessageBoxA     endp


.text:77E375FD ; int __stdcall MessageBoxExA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType,WORD wLanguageId)
.text:77E375FD                 public MessageBoxExA
.text:77E375FD MessageBoxExA   proc near               ; CODE XREF: MessageBoxA+1Fp
.text:77E375FD
.text:77E375FD var_8           = dword ptr -8
.text:77E375FD lpMem           = dword ptr -4
.text:77E375FD hWnd            = dword ptr  8
.text:77E375FD lpText          = dword ptr  0Ch
.text:77E375FD lpCaption       = dword ptr  10h
.text:77E375FD uType           = dword ptr  14h
.text:77E375FD wLanguageId     = word ptr  18h
.text:77E375FD
.text:77E375FD                 push    ebp
.text:77E375FE                 mov     ebp, esp
.text:77E37600                 push    ecx
.text:77E37601                 push    ecx
.text:77E37602                 push    ebx
.text:77E37603                 push    esi
.text:77E37604                 push    edi
.text:77E37605                 xor     edi, edi
.text:77E37607                 or      esi, 0FFFFFFFFh
.text:77E3760A                 cmp     [ebp+lpText], edi
.text:77E3760D                 mov     [ebp+lpMem], edi
.text:77E37610                 mov     [ebp+var_8], edi
.text:77E37613                 jz      short loc_77E3762E
.text:77E37615                 push    1
.text:77E37617                 lea     eax, [ebp+lpMem]
.text:77E3761A                 push    esi
.text:77E3761B                 push    eax
.text:77E3761C                 push    esi
.text:77E3761D                 push    [ebp+lpText]
.text:77E37620                 push    edi
.text:77E37621                 call    MBToWCSEx
.text:77E37626                 test    eax, eax
.text:77E37628                 jz      loc_77E4885D
.text:77E3762E
.text:77E3762E loc_77E3762E:                           ; CODE XREF: MessageBoxExA+16j
.text:77E3762E                 cmp     [ebp+lpCaption], edi
.text:77E37631                 jz      short loc_77E3764C
.text:77E37633                 push    1
.text:77E37635                 lea     eax, [ebp+var_8]
.text:77E37638                 push    esi
.text:77E37639                 push    eax
.text:77E3763A                 push    esi
.text:77E3763B                 push    [ebp+lpCaption]
.text:77E3763E                 push    edi
.text:77E3763F                 call    MBToWCSEx
.text:77E37644                 test    eax, eax
.text:77E37646                 jz      loc_77E4884D
.text:77E3764C
.text:77E3764C loc_77E3764C:                           ; CODE XREF: MessageBoxExA+34j
.text:77E3764C                 cmp     dword_77E681DC, edi
.text:77E37652                 jnz     loc_77E48864
.text:77E37658
.text:77E37658 loc_77E37658:                           ; CODE XREF: .text:77E48883j
.text:77E37658                                         ; .text:77E48891j
.text:77E37658                 push    dword ptr [ebp+wLanguageId] ; wLanguageId
.text:77E3765B                 push    [ebp+uType]     ; uType
.text:77E3765E                 push    [ebp+var_8]     ; lpCaption
.text:77E37661                 push    [ebp+lpMem]     ; lpText
.text:77E37664                 push    [ebp+hWnd]      ; hWnd
.text:77E37667                 call    MessageBoxExW
.text:77E3766C                 push    [ebp+lpMem]     ; lpMem
.text:77E3766F                 mov     esi, ds:HeapFree
.text:77E37675                 mov     ebx, eax
.text:77E37677                 push    edi             ; dwFlags
.text:77E37678                 push    hHeap           ; hHeap
.text:77E3767E                 call    esi ; HeapFree
.text:77E37680                 cmp     [ebp+var_8], edi
.text:77E37683                 jz      short loc_77E37691
.text:77E37685                 push    [ebp+var_8]     ; lpMem
.text:77E37688                 push    edi             ; dwFlags
.text:77E37689                 push    hHeap           ; hHeap
.text:77E3768F                 call    esi ; HeapFree
.text:77E37691
.text:77E37691 loc_77E37691:                           ; CODE XREF: MessageBoxExA+86j
.text:77E37691                 mov     eax, ebx
.text:77E37693
.text:77E37693 loc_77E37693:                           ; CODE XREF: .text:77E4885Fj
.text:77E37693                 pop     edi
.text:77E37694                 pop     esi
.text:77E37695                 pop     ebx
.text:77E37696                 leave
.text:77E37697                 retn    14h
.text:77E37697 MessageBoxExA   endp

.text:77E13E10 MBToWCSEx       proc near               ; CODE XREF: LoadCursorA+2Bp
.text:77E13E10                                         ; wvsprintfW+275p ...
.text:77E13E10
.text:77E13E10 arg_0           = word ptr  8
.text:77E13E10 arg_4           = dword ptr  0Ch
.text:77E13E10 arg_8           = dword ptr  10h
.text:77E13E10 arg_C           = dword ptr  14h
.text:77E13E10 arg_10          = dword ptr  18h
.text:77E13E10 arg_14          = dword ptr  1Ch
.text:77E13E10
.text:77E13E10                 push    ebp
.text:77E13E11                 mov     ebp, esp
.text:77E13E13                 push    ebx
.text:77E13E14                 mov     ebx, [ebp+arg_8]
.text:77E13E17                 push    esi
.text:77E13E18                 push    edi
.text:77E13E19                 test    ebx, ebx
.text:77E13E1B                 jz      loc_77E13EC7
.text:77E13E21                 mov     edx, [ebp+arg_10]
.text:77E13E24                 test    edx, edx
.text:77E13E26                 jz      loc_77E13EC7
.text:77E13E2C                 mov     edi, [ebp+arg_4]
.text:77E13E2F                 test    edi, edi
.text:77E13E31                 jz      loc_77E13EC7
.text:77E13E37                 test    ebx, ebx
.text:77E13E39                 jge     short loc_77E13E56
.text:77E13E3B                 cmp     ebx, 0FFFFFFFEh
.text:77E13E3E                 jl      loc_77E13EC7
.text:77E13E44                 or      ecx, 0FFFFFFFFh
.text:77E13E47                 xor     eax, eax
.text:77E13E49                 repne scasb ; <--- проблема наверняка возникает здесь
.text:77E13E4B                 not     ecx
.text:77E13E4D                 dec     ecx
.text:77E13E4E                 lea     ebx, [ebx+ecx+2]
.text:77E13E52                 test    ebx, ebx
.text:77E13E54                 jz      short loc_77E13EC7
.text:77E13E56
.text:77E13E56 loc_77E13E56:                           ; CODE XREF: MBToWCSEx+29j
.text:77E13E56                 mov     edi, [ebp+arg_14]
.text:77E13E59                 cmp     edx, 0FFFFFFFFh
.text:77E13E5C                 jnz     short loc_77E13EC0
.text:77E13E5E                 test    edi, edi
.text:77E13E60                 jz      short loc_77E13EC7
.text:77E13E62                 mov     [ebp+arg_10], ebx
.text:77E13E65                 mov     edx, ebx
.text:77E13E67
.text:77E13E67 loc_77E13E67:                           ; CODE XREF: MBToWCSEx+B5j
.text:77E13E67                 mov     esi, [ebp+arg_C]
.text:77E13E6A                 test    edi, edi
.text:77E13E6C                 jz      short loc_77E13E80
.text:77E13E6E                 lea     eax, [edx+edx]
.text:77E13E71                 push    eax
.text:77E13E72                 call    sub_77E1757E
.text:77E13E77                 test    eax, eax
.text:77E13E79                 mov     [esi], eax
.text:77E13E7B                 jz      short loc_77E13EC7
.text:77E13E7D                 mov     edx, [ebp+arg_10]
.text:77E13E80
.text:77E13E80 loc_77E13E80:                           ; CODE XREF: MBToWCSEx+5Cj
.text:77E13E80                 mov     ecx, ds:NlsAnsiCodePage
.text:77E13E86                 mov     ax, [ebp+arg_0]
.text:77E13E8A                 cmp     ax, [ecx]
.text:77E13E8D                 jz      short loc_77E13E98
.text:77E13E8F                 test    ax, ax
.text:77E13E92                 jnz     loc_77E40993
.text:77E13E98
.text:77E13E98 loc_77E13E98:                           ; CODE XREF: MBToWCSEx+7Dj
.text:77E13E98                 push    ebx
.text:77E13E99                 lea     eax, [ebp+arg_8]
.text:77E13E9C                 push    [ebp+arg_4]
.text:77E13E9F                 push    eax
.text:77E13EA0                 lea     eax, [edx+edx]
.text:77E13EA3                 push    eax
.text:77E13EA4                 push    dword ptr [esi]
.text:77E13EA6                 call    ds:RtlMultiByteToUnicodeN
.text:77E13EAC                 test    eax, eax
.text:77E13EAE                 jl      loc_77E409BE
.text:77E13EB4                 mov     eax, [ebp+arg_8]
.text:77E13EB7                 shr     eax, 1
.text:77E13EB9
.text:77E13EB9 loc_77E13EB9:                           ; CODE XREF: MBToWCSEx+B9j
.text:77E13EB9                                         ; .text:77E409B9j
.text:77E13EB9                 pop     edi
.text:77E13EBA                 pop     esi
.text:77E13EBB                 pop     ebx
.text:77E13EBC                 pop     ebp
.text:77E13EBD                 retn    18h
.text:77E13EC0 ; ---------------------------------------------------------------------- -----
.text:77E13EC0
.text:77E13EC0 loc_77E13EC0:                           ; CODE XREF: MBToWCSEx+4Cj
.text:77E13EC0                 cmp     edx, 0FFFFFFFFh
.text:77E13EC3                 jl      short loc_77E13EC7
.text:77E13EC5                 jmp     short loc_77E13E67
.text:77E13EC7 ; ---------------------------------------------------------------------- -----
.text:77E13EC7
.text:77E13EC7 loc_77E13EC7:                           ; CODE XREF: MBToWCSEx+Bj
.text:77E13EC7                                         ; MBToWCSEx+16j ...
.text:77E13EC7                 xor     eax, eax
.text:77E13EC9                 jmp     short loc_77E13EB9
.text:77E13EC9 MBToWCSEx       endp


Дата: Апр 14, 2004 16:03:22 · Поправил: 1990

Asterix
В смылсе "отличились"? А почему решил поправил? ;)


Дата: Апр 14, 2004 16:19:03

Твой код точно соответствует imul'у? И потом если результат умножения займет больше 32-ух разрядов?
Нет, конечно, для знакового умножения и больших чисел такое не подойдет. Кстати в данном примере можно избежать этого цикла вообще - lookup табличку степеней построить - всяко быстрее будет

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049