0

我正在尝试在 FASM 中完成一项简单的任务,我已经为此苦苦挣扎了大约两个小时。

我已经用目标和问题评论了代码,但我会解释。

我正在尝试将特定文件的路径存储到变量中。该文件位于临时目录中。所以我必须先获取临时路径,然后将文件名附加到临时路径的末尾。

我正在尝试按顺序执行两次。但由于某种原因,我得到的字符串最终“搞砸了”。

我目前的代码如下:

include "win32ax.inc"

entry start

section ".data" data readable writeable

TmpDir          rb 256d
aSTR            dd ?
bSTR            dd ?
cSTR            db "aFILE.txt",0
dSTR            db "bFILE.txt",0

section ".code" code readable executable

start:

        ;The goal is to get two seperate strings like so:
        ;1 - C:\PATH-TO-TEMP-DIR\aFILE.txt in "aSTR"
        ;2 - C:\PATH-TO-TEMP-DIR\bFILE.txt in "bSTR"

        ;Get temp directory
        invoke  GetTempPath,TmpDir,TmpDir

        ;Copy tempdir into aSTR
        invoke  lstrcpy,aSTR,TmpDir
        ;Add "aFILE.txt" to the end of aSTR
        invoke  lstrcat,aSTR,cSTR

        ;Copy tempdir into bSTR
        invoke  lstrcpy,bSTR,TmpDir
        ;Add "bFILE.txt" to the end of bSTR
        invoke  lstrcat,bSTR,dSTR

        ;Results in "C:\UC:\Users\user\AppData\Local\Temp\AppData\Local\Temp\A\\
        ;Instead of "C:\Users\user\AppData\Local\Temp\aFILE.txt"
        invoke  MessageBox,0,aSTR,"Test",0
        ;Results in "C:\Users\user\AppData\Local\Temp\AppData\Local\Temp\A\\"
        ;Instead of "C:\Users\user\AppData\Local\Temp\bFILE.txt"
        invoke  MessageBox,0,bSTR,"Test",0

        invoke  ExitProcess,0

section ".idata" import readable writeable

        library kernel32,               "KERNEL32.DLL",\
                user32,                 "USER32.DLL"

        import  kernel32,\
                lstrcpy,                "lstrcpy",\
                lstrcat,                "lstrcat",\
                GetTempPath,            "GetTempPathA",\
                ExitProcess,            "ExitProcess"

        import  user32,\
                MessageBox,             "MessageBoxA"

任何解决此问题的帮助将不胜感激。谢谢!

4

1 回答 1

1

唔。您的字符串之一是:

C:\UC:\Users\u...
^^^^

几乎就好像在内存中的下一个项目之前只有四个字节用于存储它。

我想知道这是否与您dd用来为其定义空间的事实有关。轻推,轻推,眨眼,眨眼。


足够幽默,是时候做出更严肃的回应了。为什么你这么想:

aSTR            dd ?

会给你足够的空间来存储路径名吗?当然它应该更像是:

aSTR            rb 512d

这应该会给你大量的空间(对于 也是如此bSTR)。


实际上,您的第一个cpy/cat操作也会覆盖cSTRand dSTR,这使得弄清楚第二个操作会发生什么变得更加困难。

尝试保留足够的空间(如上所述),然后再试一次。

于 2012-09-24T04:58:20.823 回答