0

アセンブリで定義されているメソッドを呼び出そうとすると、「ESPの値が関数呼び出し全体で適切に保存されませんでした」というエラーが表示されます。、Visual Studio 2012を使用します。他の質問を見ると、一般的な要因は、アセンブリLEAVEに各ラベルの最後に指示がない可能性があるという言及でした。

このエラーが発生しましたが、次のコードが含まれています。これにはLEAVE命令が含まれています。

section .bss
    vs: resb 13 ; 12-byte vendor string + NULL char
    ns: resb 49 ; 48-byte proc. name + NULL char

section .text

global _meta_vendor
global _meta_procname

_meta_vendor:
    push ebp
    mov ebp, esp
    mov eax, 0h
    cpuid
    mov [vs], ebx
    mov [vs + 4], edx
    mov [vs + 8], ecx
    mov byte [vs + 12], 0h
    mov eax, vs
    leave
    ret

_meta_procname:
    push ebp
    mov ebp, esp
    mov eax, 80000002h
    cpuid

    mov [ns], eax
    mov [ns + 4], ebx
    mov [ns + 8], ecx
    mov [ns + 12], edx
    mov eax, 80000003h
    cpuid
    mov [ns + 16], eax
    mov [ns + 20], ebx
    mov [ns + 24], ecx
    mov [ns + 28], edx
    mov eax, 80000004h
    cpuid
    mov [ns + 32], eax
    mov [ns + 36], ebx
    mov [ns + 40], ecx
    mov [ns + 44], edx
    mov byte [ns + 48], 0h
    mov eax, ns
    leave
    ret

これらのラベルの関数プロトタイプは、次の情報のみを含むヘッダーファイルにあります。

#include <cstdint>

extern "C" {
    char* meta_vendor();
    char* meta_procname();
}

なぜこのエラーが発生するのかについての洞察はありますか?

表示されるポップアップで[続行]をクリックすると、期待値が表示されることに注意してください。

4

1 に答える 1

2

以下に示すようにpush ebx、を追加することで問題は解決しました。pop ebx

_meta_vendor:
    push ebp
    mov ebp, esp
    push ebx

    ; code...

    pop ebx
    leave
    ret
于 2013-03-26T20:54:07.260 に答える