" ESP的值未在函数调用中正确保存。"即使有了LEAVE

时间:2013-03-26 18:24:31

标签: visual-c++ assembly x86

当试图调用程序集中定义的方法时,我收到错误“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();
}

有关我收到此错误的原因的任何见解?

请注意,如果我在出现的弹出窗口中单击“继续”,则会显示预期值。

1 个答案:

答案 0 :(得分:2)

通过添加push ebxpop ebx来解决问题,如下所示:

_meta_vendor:
    push ebp
    mov ebp, esp
    push ebx

    ; code...

    pop ebx
    leave
    ret