| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4512 人关注过本帖
标题:请教一下子函数调用和字符串的问题!
只看楼主 加入收藏
swp160108
Rank: 2
等 级:论坛游民
威 望:4
帖 子:63
专家分:98
注 册:2008-11-10
收藏
得分:0 
感觉错误很多
mov al,[esi] 直接这么写不行把 mov al,byte ptr [esi]

感觉基础太差 多看书把
2008-11-19 11:03
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
;==================
我用的编译器和你不一样,没法上机验证.
你先修改这个地方试试看吧:
 invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,offset DlgProc,NULL
2008-11-19 11:14
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
[bo][un]swp160108[/un] 在 2008-11-19 11:03 的发言:[/bo]

感觉错误很多
mov al,[esi] 直接这么写不行把 mov al,byte ptr [esi]

感觉基础太差 多看书把

这点倒是不要紧的~~
因为al 寄存器已经指明进行的是字节操作~~主要是在没有寄存器参与的情况下要指明操作的数据长度~~
2008-11-19 11:21
cnlkf
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2008-5-13
收藏
得分:0 
请问ONEPROBLEM你是用什么编译器的?我这个也用得很不舒服,很多地方都用不熟悉,你能不能发你那个给我一下?还有这道题现在的问题是在调用子函数提示出错,我把子函数直接搬到主函数里,但是运行的时候还是没结果,你能不能帮我看一下是哪里出问题?

    mm proc s1:DWORD,s2:DWORD,s3:DWORD
        cmp bz,0
        je jiami
        jmp jiemi
  jiami:
        mov esi,offset s
        lea edi,s1   
        mov al,[esi]
        mov [edi],al
        shl s1,1
        add s1,3
        inc byte ptr [esi]
        mov al,[esi]
        cmp al,0
        je L2
        jmp jiami


  jiemi: ;这是解密
        mov esi,offset s1
        lea edi,s2   
        mov al,[esi]
        mov [edi],al
        sub s2,3
        shr s2,1
        inc byte ptr [esi]
        mov al,[esi]
        cmp al,0
        je L2
        jmp jiemi
     L2:ret
     mm endp

这道题是根据bz的值对字符串s进行加密和解密,加密的方法为*2+3.
加密的字符串放到S1解密的放S2...最后调用一个窗口显示出字符串...
我设置两个按钮,根据按钮给BZ赋值,0就加密,1就解密..s是原来字符串,s1是加密后字符串,s2是存放解密后字符串(就是s1解密后的).
2008-11-19 11:23
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
;=========================================
           .386
           .model flat, stdcall  ;32 bit memory model
           option casemap :none  ;case sensitive

           include text1.inc

          .code

start:

    invoke GetModuleHandle,NULL
    mov        hInstance,eax

    invoke InitCommonControls
    invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
                                                 ;addr 只能向前引用,不能向后引用,应改为offset
    invoke ExitProcess,0
    mm proc s1:DWORD,s2:DWORD,s3:DWORD
        cmp bz,0              ;cmp指令的使用,必须有寄存器的参与
        je jiami
        jmp jiemi
  jiami:
        mov esi,offset s
        lea edi,s1    ;把s1的有效地址装入edi
        mov al,[esi] ;如果进行字节操作,注意用al
        mov [edi],al
        shl s1,1             ;错误,shl只能处理寄存器或内存单元中的数据,S1是个数据区
        add s1,3
        inc byte ptr [esi]
        mov al,[esi] ;进行字操作的话就用ax,类推
        cmp al,0
        je L2
        jmp jiami
  jiemi:
        mov esi,offset s1
        lea edi,s2    ;把s1的有效地址装入edi
        mov al,[esi] ;如果进行字节操作,注意用al
        mov [edi],al
        sub s2,3
        shr s2,1
        inc byte ptr [esi]
        mov al,[esi]
        cmp al,0
        je L2
        jmp jiemi
     L2:ret
     mm 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
        mov  eax,wParam
        .if eax==1001
            mov bz,0            
        .if eax==1002
            mov bz,1
            invoke mm,addr s1,addr s2,bz
            invoke MessageBox,hWin,addr mess1, addr mtl,MB_OK            
        .endif
        .endif
        .endif
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret

DlgProc endp

end start

这是.inc文件

include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include D:\masm32\新建文件夹\RadASM\masm\inc\radbg.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
mtl    db    "test my titles",0
mmsg db    "hello world!",0
s DB "hello",0
s1 dd 20 dup(0)
s2 dd 20 dup(0)
bz db ?
mess1 db "finished(XxY+Z-V)/P!",0
2008-11-19 11:32
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
编译器请到AOGO网站去下载他的MASMPlus,这个比较顺手.
不会用的话,先下载他的"汇编通讯",里面有所讲述的~~
你的这个程序并不难,问题是你对汇编指令不够清楚,建议查查"汇编指令表"!
当然,先打好基础比较重要~~
2008-11-19 11:38
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
[bo][un]ONEPROBLEM[/un] 在 2008-11-19 11:38 的发言:[/bo]

编译器请到AOGO网站去下载他的MASMPlus,这个比较顺手.
不会用的话,先下载他的"汇编通讯",里面有所讲述的~~
你的这个程序并不难,问题是你对汇编指令不够清楚,建议查查"汇编指令表"!
当然,先打好基础比较重要~~


同意!
2008-11-19 12:36
cnlkf
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2008-5-13
收藏
得分:0 
呵呵,两位版主说得对,我对汇编的指令确实很多都不够清楚,只是这道题做了好几天了,都是根据书上的指令做的,现在想先把题做完,再边看书理解那些意思,不然看完之后我怕又给忘了..
2008-11-19 13:06
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
[bo][un]cnlkf[/un] 在 2008-11-19 13:06 的发言:[/bo]

呵呵,两位版主说得对,我对汇编的指令确实很多都不够清楚,只是这道题做了好几天了,都是根据书上的指令做的,现在想先把题做完,再边看书理解那些意思,不然看完之后我怕又给忘了..


关键是对这些东西的理解 掌握

多向那他们请教吧 呵呵
2008-11-19 13:08
cnlkf
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2008-5-13
收藏
得分:0 
呵呵,我会用心去学的,zklhp版主和ONEPROBLEM版主能不能把你们两位的Q给我,如果有不懂可以请教一下,我现在刚学不久,想不遇到不懂的地方可以找个人探讨一下..
2008-11-19 13:20
快速回复:请教一下子函数调用和字符串的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025455 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved