注册 登录
编程论坛 汇编论坛

请问谁能帮我调试一下看看是哪里出问题了!

cnlkf 发布于 2008-11-19 18:20, 1914 次点击
这道题的意思是从主函数传递过三个实参,根据BZ的值执行加密和解密,加密为原字符*2+3,最后调用一个窗口显示加密或解密后的字符串.在这也要感谢两位热心版主的解答...

整道题编完后没有结果,不知道哪里出问题了,编译的能通过,不过我不会调试...
主函数:
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    mov        eax,uMsg
    .if eax==WM_INITDIALOG

    .elseif eax==WM_COMMAND
        mov  eax,wParam
        .if eax==1001
        mov  eax,wParam
        .if eax==1001
            mov bz,0   
            invoke string,addr s,addr s1,bz     ;函数调用
        .if eax==1002
            mov bz,1
            invoke string,addr s1,addr s2,bz    ;函数调用      
        .endif
        .endif
        .endif
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret

DlgProc endp

子函数:
string proc str1:DWORD,str2:DWORD,bz1:DWORD
        cmp bz1,0
        je jiami
        jmp jiemi
  jiami:
        mov esi,offset s
        lea edi,str1    ;把s1的有效地址装入edi
        mov al,[esi] ;如果进行字节操作,注意用al
        cmp al,0
        je L1
        shl al,1
        add al,3
        mov [edi],al
        inc byte ptr [esi]
        inc byte ptr [edi]
        mov al,[esi] ;进行字操作的话就用ax,类推
        jmp jiami
        
  jiemi:
        lea esi,str1
        lea edi,str2    ;把s1的有效地址装入edi
        mov al,[esi] ;如果进行字节操作,注意用al
        sub al,3
        shr al,1
        mov [edi],al
        inc byte ptr [edi]
        inc byte ptr [esi]
        mov al,[esi]
        cmp al,0
        je L2
        jmp jiemi
     L1:
        mov [edi],al
        invoke MessageBox,0,addr str1,addr mtl,MB_OK
     L2:
        mov [edi],al
        invoke MessageBox,0,addr str2,addr mtl,MB_OK
string endp
12 回复
#2
cnhanxiao2008-11-19 19:12
回复 1# 的帖子
lea edi,str1    ;把s1的有效地址装入edi

lea esi,str1
lea edi,str2    ;把s1的有效地址装入edi

参数是靠堆栈传递过来的,而你的参数本身就是地址,这样不妥。
改成:mov edi,str1....

其他的没仔细看,你最好把完整的程序贴上,便于帮你调试,不然,还得补充完整,很麻烦。
#3
cnlkf2008-11-20 11:26
恩,我改了一下,现在做得差不多了,编译的时候能正常通过,但是在最终显示的时候失败了,麻烦你帮我调试一下,看是哪里出问题了,谢谢!

.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive


include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib

DlgProc            PROTO    :HWND,:UINT,:WPARAM,:LPARAM

.const

IDD_DIALOG1            equ 101

;#########################################################################

.data?

hInstance            dd ?

;#########################################################################
.data
mt1    db    "加密字符串为:",0
mt2 db    "解密字符串为:",0
s DB "11",0
s1 db 20 dup(0)
s2 db 20 dup(0)
bz1 dd 1
bz0 dd 0
;#########################################################################


.code

start:

    invoke GetModuleHandle,NULL
    mov        hInstance,eax

    invoke InitCommonControls
    invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
    invoke ExitProcess,0
    
string proc str1:DWORD,str2:DWORD,bz:DWORD
        cmp bz,1     ;根据BZ的值执行加密或解密
        je ddd       ;如果BZ=1执行解密
        mov esi,str1    ;把str1的有效地址装esi
        mov edi,str2    ;把str2的有效地址装入edi
        mov al,[esi] ;如果进行字节操作,注意用al
  jiami:cmp al,0     ;检查字符串是否到执行完
        je L1
        shl al,1
        add al,3
        mov [edi],al
        inc byte ptr [esi]
        inc byte ptr [edi]
        mov al,[esi]
        jmp jiami
        
 
   ddd: mov esi,str2
        mov edi,str1   
        mov al,[esi]   
  jiemi:sub al,3
        shr al,1
        mov [edi],al
        inc byte ptr [edi]
        inc byte ptr [esi]
        mov al,[esi]
        cmp al,0
        je L2
        jmp jiemi
     L1:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt1,MB_OK
     L2:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt2,MB_OK
string endp
;########################################################################

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    mov        eax,uMsg
    .if eax==WM_INITDIALOG
    
    .elseif eax==WM_COMMAND
        mov  eax,wParam
        .if eax==1001
        invoke string,addr s,addr s1,bz0     
        .endif
        .if eax==1002
            invoke string,addr s1,addr s2,bz1            
        .endif
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret

DlgProc endp

end start
#4
ONEPROBLEM2008-11-20 13:22
我帮你调试了一下,它和你的程序有什么不同,你自己看看哈~~
;======================================================
;ASM文件:
        .386
        .model flat, stdcall  ;32 bit memory model
        option casemap :none  ;case sensitive


include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib

DlgProc            PROTO    :HWND,:UINT,:WPARAM,:LPARAM

.const

IDD_DIALOG1        equ         101

;#########################################################################

.data?

hInstance            dd ?

;#########################################################################
.data
mt1        db    '加密字符串为:',0
mt2     db    '解密字符串为:',0
s     DB     'abcdefgh',0
s1     db 20 dup(0)
s2     db 20 dup(0)
bz1     dd 1
bz0     dd 0
;#########################################################################


.code

start:

    invoke GetModuleHandle,NULL
    mov        hInstance,eax

    invoke InitCommonControls
    invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,offset DlgProc,NULL
    invoke ExitProcess,0
   
string proc str1:DWORD,str2:DWORD,bz:DWORD
    pushad    
        cmp bz,1     ;根据BZ的值执行加密或解密
        je ddd       ;如果BZ=1执行解密
        mov esi,str1    ;把str1的有效地址装esi
        mov edi,str2    ;把str2的有效地址装入edi
jiami:  mov al,[esi] ;如果进行字节操作,注意用al
    cmp al,0     ;检查字符串是否到执行完
        je L1
        shl al,1
        add al,3
        mov [edi],al
        inc esi   
     inc edi
        jmp jiami
        

   ddd: mov esi,str1
        mov edi,str2   
jiemi:    mov al,[esi]
    cmp al,0
        je L2
     sub al,3
        shr al,1
        mov [edi],al
       inc edi
        inc esi      
  jmp jiemi
     L1:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt1,MB_OK
        jmp    @F
     L2:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt2,MB_OK
       @@:      
popad
       ret
string endp
;########################################################################

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    mov        eax,uMsg
    .if eax==WM_INITDIALOG
   
    .elseif eax==WM_COMMAND
            mov  eax,wParam
            .if     eax==1001
                invoke string,addr s,addr s1,bz0     
            .elseif eax==1002
                    invoke string,addr s1,addr s2,bz1            
            .endif
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret

DlgProc endp

end start

;====================================================
//RC文件:
#include         "resource.h"

#define    IDD_DIALOG1    101

IDD_DIALOG1 DIALOG DISCARDABLE  50, 50, 187, 89
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话"
FONT 10, "System"
BEGIN
    PUSHBUTTON      "加密",1001,51,58,50,14
    PUSHBUTTON      "解密",1002,111,58,50,14
END
//========================================================

[[it] 本帖最后由 ONEPROBLEM 于 2008-11-20 13:23 编辑 [/it]]
#5
ONEPROBLEM2008-11-20 13:29
附运行界面:
#6
cnlkf2008-11-20 14:11
请问
        jmp    @F
     L2:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt2,MB_OK
       @@:   
这里头尾的@F和@@是什么意思?
还有你是用MASMplus编译器吗?我用radasm编译的时候还是没结果出来,不知道怎么回事,那个MASMplus的RC文件在哪有?我打开MASMplus新建的时候只有ASM这个文件.
#7
你们都要疼我哦2008-11-20 15:11
@@是标号,   
在标号前用@F来表示@@
在标号后用(  )来表示@@.
  自己会填空吧.

RADASM选创建工程,win32 APP 类型,  编辑完ASM,工程属性窗口点RC,自己编辑ASM对应的资源文件就可以了。
#8
zklhp2008-11-20 15:57
[bo][un]你们都要疼我哦[/un] 在 2008-11-20 15:11 的发言:[/bo]

@@是标号,   
在标号前用@F来表示@@
在标号后用(  )来表示@@.
  自己会填空吧.

RADASM选创建工程,win32 APP 类型,  编辑完ASM,工程属性窗口点RC,自己编辑ASM对应的资源文件就可以了。


呵呵 不想起名字时可以用这种方式偷懒
#9
ONEPROBLEM2008-11-20 16:00
[bo][un]cnlkf[/un] 在 2008-11-20 14:11 的发言:[/bo]

请问
        jmp    @F
     L2:
        mov [edi],al
        invoke MessageBox,0,str2,addr mt2,MB_OK
       @@:   
这里头尾的@F和@@是什么意思?
还有你是用MASMplus编译器吗?我用radasm编译的时候还 ...

@F @@ 都是标号,建议看罗云彬的书,第62页~~
对,我是用MASMPlus的,RC文件是资源文件,要自己创建!
PS:从你的提问来看,我建议你先把最基础的知识浏览一下,至少见过~~
#10
zklhp2008-11-20 16:04
[bo][un]ONEPROBLEM[/un] 在 2008-11-20 16:00 的发言:[/bo]


@F @@ 都是标号,建议看罗云彬的书,第62页~~
对,我是用MASMPlus的,RC文件是资源文件,要自己创建!
PS:从你的提问来看,我建议你先把最基础的知识浏览一下,至少见过~~


真详细呀~~~
#11
djxh777102008-11-20 17:06
[bo][un]ONEPROBLEM[/un] 在 2008-11-20 16:00 的发言:[/bo]


@F @@ 都是标号,建议看罗云彬的书,第62页~~
对,我是用MASMPlus的,RC文件是资源文件,要自己创建!
PS:从你的提问来看,我建议你先把最基础的知识浏览一下,至少见过~~

连多少页都记得,真强...
#12
cnlkf2008-11-20 18:04
谢谢zklhp,ONEPROBLEM和你们都要疼我哦几位的回答,我现在才学汇编2个多星期而已,基础是很菜,而且只有一本国外的汇编教程,我会好好去学习的.

现在那道题不知道怎么回事,我用RADMSM编译后无论是点第一个窗口还是第二个窗口,都是提示
解密字符为:
但就是没结果,我那道缺少了个返回,但是无论编译你改后的那道还是我自己那道结果都是那样,都搞不懂是哪里出问题了.
#13
cnlkf2008-11-21 09:48
终于知道哪里出问题了,原来我设置了两个按钮的名称都是一样,一运行起来就直接解密了...郁闷...

谢谢大家的帮忙,这道题总算做出来了,还好学到了不少东西...再次感谢!
1