1

x64 アセンブリ言語でプログラムを作成しようとしていますが、x64 呼び出し規則を理解するのに問題があります。問題は、CopyFile 関数の呼び出し用に確保しなければならないシャドウ スペースの量がわからないことだと思います。プログラムを実行すると、クラッシュするだけです。このプログラムは MASM を使用して作成しました。このコードの修正を手伝ってください。ありがとうございました。

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\User32.lib
extrn GetProcessHeap : proc
extrn MessageBoxA : proc
extrn HeapAlloc : proc
extrn GetModuleFileNameA : proc
extrn ExitProcess : proc
extrn CopyFileA : proc

dseg segment para 'DATA'
file db 'C:\CopyThisFile.txt', 0
file2 db 'C:\ThisFileWasCopied.txt', 0
succ db 'Success!', 0
capt db 'Debug', 0
dseg ends

cseg segment para 'CODE'
start proc
sub rsp, 28h
xor r8, r8
mov rdx, qword ptr file2
mov rcx, qword ptr file
call CopyFileA
xor ecx, ecx 
call ExitProcess
start endp
cseg ends
end
4

1 に答える 1

1

これは、スタック上のスペース予約とは関係ありません。

あなたの間違いは、文字列のアドレスを間違って取得することにあります。mov文字列へのポインターの代わりに内容 (最初の 8 バイト) を取得するため、AccessViolation 例外が発生します。これを修正するには、 を使用しますlea

format PE64 GUI 5.0
entry start

include 'WIN64A.INC'

section '.data' data readable writeable

    fileStr db 'C:\\CopyThisFile.txt', 0
    file2Str db 'C:\\ThisFileWasCopied.txt', 0
    succ db 'Success!', 0

section '.text' code readable executable

    start:

    sub rsp, 28
    xor r8, r8
    lea rdx, qword ptr file2Str
    lea rcx, qword ptr fileStr
    call [CopyFileA]
    xor ecx, ecx
    call [ExitProcess]

section '.idata' import data readable

    library kernel32,'kernel32.dll',user32,'user32.dll'

    import kernel32, \
        GetProcessHeap,'GetProcessHeap', \
        HeapAlloc,'HeapAlloc', \
        GetModuleFileNameA,'GetModuleFileNameA', \
        ExitProcess,'ExitProcess', \
        CopyFileA,'CopyFileA'

    import user32, \
        MessageBoxA,'MessageBoxA'
于 2013-06-26T12:36:35.223 に答える