我正在 Masm Visual Studio 中编写汇编语言代码,以将变量固定三次。
// Increment.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
extern "C" {
void incr();
}
int main()
{
incr(); //Breakpoint Here
return 0;
}
我的汇编语言代码是:
PUBLIC incr
EXTERN puts:PROC
.data
var dword 0005
.code
incr PROC
mov eax, var
inc eax //Breakpoint Here
inc eax //Breakpoint Here
inc eax //Breakpoint Here
incr ENDP
END
程序构建成功,在调试时,也成功显示了RAX的期望值,但是当它返回到increment.cpp时,它在return 0处抛出异常;(异常抛出:Increment.exe触发了断点)。为什么会发生这种情况以及如何摆脱它?
最佳答案
您需要将 ret
指令添加到您的 incr
过程,以便您的函数正确返回。
incr PROC
mov eax, var
inc eax
inc eax
inc eax
ret
incr ENDP
毫无疑问,您遇到的异常是由调试器抛出的,这决定了您正在混合调用约定。这里实际发生的是执行继续进入一些调试器填充,然后它检查堆栈指针为什么不正常——但无论如何它都不应该到达这里。您可以通过从 MASM 程序返回(通过 ret
)来阻止它到达这里。
关于c++ - 调试汇编程序时返回 0 时在 visual studio 中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48698086/