内联汇编,错误

Posted

技术标签:

【中文标题】内联汇编,错误【英文标题】:inline asm, error with 【发布时间】:2014-03-13 02:10:53 【问题描述】:

我收到此错误:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是用一个调用约定声明的函数和一个用不同调用约定声明的函数指针调用的结果。

我不知道怎么解决,谁能帮帮我?

我的代码是:

#include "common.h"

char* file = "c:\\town.las";
char* file_mode = "r";


#pragma pack(1)
struct LASHEADER

    char LASF[4];
;


void main()

    LASHEADER lasHeader;
    FILE* of;

    __asm
    
            push ebp       


            mov     eax, file_mode
            push    eax
            push    file
            call    fopen
            mov of, eax

            mov esi, esp
            mov eax, DWORD PTR of
            push eax
            push 1
            push 4 // this should be sizeof LASHEADER

            lea ecx, DWORD PTR lasHeader
            push ecx

            call DWORD PTR fread
            add esp, 16
            cmp esi, esp



            mov eax, of
            push eax
            call fclose


    

我该怎么做?我试图推 ebp 并在最后弹出,但没有运气。

【问题讨论】:

【参考方案1】:

错误准确地说明了问题所在。在函数调用之后,您并没有始终如一地恢复堆栈指针。这看起来像 VC 输出。您应该编译一个调用fopenfreadfclose 的小程序来查看堆栈做了什么。每个函数参数push必须在返回前与esp相加4个字节。

以下是对可行的猜测:

        push ebp       

        push    file_mode  ; 1 word
        push    file       ; 2 words
        call    fopen
        mov of, eax        ; this could be wrong depending on compiler

        mov esi, esp
        mov eax, DWORD PTR of
        push eax ; 3 words
        push 1 ; 4 words
        push 4 ; 5 words

        lea ecx, DWORD PTR lasHeader
        push ecx ; 6 words

        call DWORD PTR fread

        mov eax, of ; again could be wrong depending on compiler
        push eax  ; 7 words
        call fclose

        add esp, 28 ; REMOVE 7 words from the stack

        pop ebp

【讨论】:

你错过了push eax :) @Jester 有一个无用的加载 eax 和推送,当推送一个常量是可能的,所以我替换了它。你说的是那个吗? 谢谢,它清除了一点,但是我现在收到一个新错误“运行时检查失败 #2 - 变量 'lasHeader' 周围的堆栈已损坏。”但我会尝试你的建议。 不,我的意思是你有一个push eax,你忘了算入推送的单词数,根据我的统计应该是7。

以上是关于内联汇编,错误的主要内容,如果未能解决你的问题,请参考以下文章

内联汇编,错误

内联汇编代码错误

GCC 内联汇编错误:表达式后出现垃圾 `(%ebp)+4'

简单 g++ 内联汇编程序中的错误

编译linux内核2.4.0时内联汇编错误

GCC 内联汇编错误:变量 '%al' 的 asm 说明符与 asm clobber 列表冲突