0

私はFASMで簡単なタスクを実行しようとしていますが、これは文字通り約2時間苦労しています。

目標と問題についてコードにコメントしましたが、説明します。

特定のファイルへのパスを変数に保存しようとしています。ファイルはTempDirectoryにあります。したがって、最初に一時パスを取得してから、ファイル名を一時パスの最後に追加する必要があります。

私はこれを2回続けて行おうとしています。しかし、何らかの理由で、結果として得られる文字列は「ねじれた」ものになってしまいます。

私の現在のコードは次のとおりです。

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

うーん。あなたの文字列の1つは次のとおりです。

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

メモリ内の次のアイテムの前に格納するためのバイトが 4 バイトしかないかのようです。

ddそれは、スペースを定義するために使用しているという事実と関係があるのではないかと思います. ナッジ、ナッジ、ウィンク、ウィンク。


十分なユーモアがあり、より真剣な対応の時間です。なぜそう思うの:

aSTR            dd ?

パス名を保存するのに十分なスペースを提供しますか? 確かにそれはもっと似ているはずです:

aSTR            rb 512d

これにより、大量のスペースが得られます(および同様にbSTR)。


実際、あなたは最初のcpy/cat操作も上書きcSTRdSTR、2番目の操作で何が起こるかを理解するのをさらに難しくしています。

(上記のように)十分なスペースを確保してから、もう一度試してみてください。

于 2012-09-24T04:58:20.823 に答える