内联汇编,错误
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 输出。您应该编译一个调用fopen
、fread
和fclose
的小程序来查看堆栈做了什么。每个函数参数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。以上是关于内联汇编,错误的主要内容,如果未能解决你的问题,请参考以下文章