首页
社区
课程
招聘
[旧帖] [求助]帮忙解释一段汇编代码,谢谢 0.00雪花
发表于: 2012-9-1 21:39 1430

[旧帖] [求助]帮忙解释一段汇编代码,谢谢 0.00雪花

2012-9-1 21:39
1430
;编译器RadASM               

                         .386
                        .model flat,stdcall
                        option casemap:none
                       
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

                        .data
@szFileName        db        MAX_PATH dup (?)
                        .code
                       
start:
;******************************************************************************
;为什么这段代码会出错
;可能是std指令有问题,但不知道为什么
        invoke        GetModuleFileName,NULL,addr @szFileName,MAX_PATH       
        invoke        lstrlen,addr @szFileName                               
        dec        eax
        lea        edi,@szFileName
        mov        ecx,eax
        mov        al,'\'
        std
        repnz        scasb
        dec        edi
        invoke        MessageBox,NULL,edi,NULL,MB_ICONERROR
;******************************************************************************       
       

;******************************************************************************       
;这个可以正常使用
;想要得到本程序的文件名(不带路径)有没有更简单的方法
        invoke        GetModuleFileName,NULL,addr @szFileName,MAX_PATH       
        invoke        lstrlen,addr @szFileName
        dec        eax
        lea        esi,@szFileName
        mov        ecx,eax
        CLD
        ONE:
        lodsb       
        cmp        al,'\'
        jnz        TWO
        mov        edi,esi
        TWO:
        dec        ecx
        jnz        ONE
        invoke        MessageBox,NULL,edi,NULL,MB_OK
;******************************************************************************
        ret
        end        start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
invoke  GetModuleFileName,NULL,addr @szFileName,MAX_PATH  
add eax,addr @szFileName
@@:
dec eax
cmp byte [eax],'\'
jnz @b
inc eax
eax=Name
2012-9-1 23:09
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=无聊的菜鸟;1099016]invoke  GetModuleFileName,NULL,addr @szFileName,MAX_PATH  
add eax,addr @szFileName
@@:
dec eax
cmp byte [eax],'\'
jnz @b
inc eax
eax=Name[/QUOTE]

;修改了一下
        invoke        GetModuleFileName,NULL,addr @szFileName,MAX_PATH
        invoke        lstrlen,addr @szFileName

        lea        esi,@szFileName
        add        esi,eax
        @@:
        dec        esi
        cmp        byte ptr [esi],'\'
        jnz        @B
        inc        esi
        invoke        MessageBox,NULL,esi,NULL,MB_OK
2012-9-1 23:31
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
lstrlen没有必要,因为GetModuleFileName的返回值是拷贝到缓冲区内的字节数,所以可以直接完成lstrlen的作用。

另外,如果你不介意使用Unicode的话,那么代码可以更短一些。但是可能会产生通用性的问题。
mov eax,fs:[30h]
mov eax,[eax+0ch]
mov eax,[eax+0ch]
mov eax,[eax+20h]
这里eax指向的就是Unicode字符串程序文件名的实际内容。
2012-9-2 05:22
0
游客
登录 | 注册 方可回帖
返回
//