c++ - 调试汇编程序时返回 0 时在 visual studio 中抛出异常

标签 c++ visual-studio exception assembly

我正在 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/

相关文章:

c++ - 我已经安装了 Visual Studio 2015,但是没有 C++ 项目。?

c# - 如何避免 System.Runtime.InteropServices.COMException?

c++ - 使用 wxwidget 在 while 循环下移动多个文件

c++ - 如何为 VC++ 2013 安装平台工具集

c++ - 如何在 C++ 中使用右值引用来避免不必要的实例

c++ - 无法使用 Visual Studio 2015 构建简单项目

java - 当单元测试方法具有断言而不是异常时,最佳实践是什么?

java - 这里抛出任何异常吗?

c++ - 使用 g++ 4.8.2 时,tan() 计算比 sin()/cos() 长两倍

C++:通过指针访问结构的成员