vc 当前不会命中断点

解决办法1:1.删除项目目录下的 sdf文件,删除ipch文件夹,删除项目子目录下的debug和release文件夹.

  2.在vs中"重新生成解决方案"

解决办法2:  1.  打开设置断点不起作用的 cpp 文件

                          2. 打开编辑菜单,点“全选”  (Ctrl + a );

                          3.  打开编辑菜单,高级,点“设置选定内容的格式” 

<think>我们正在处理一个关于在Visual C++中查看或编写汇编代码的问题。根据提供的引用,我们可以总结出几种方法。 首先,关于查看汇编代码: 引用[1]提到:在Visual Studio中,可以在要查看的函数中设置断点,然后开始调试。当命中断点后,右键点击,选择“查看反汇编”,即可查看汇编代码。 其次,关于编写汇编代码并集成到C++项目中: 引用[2]和引用[3]提供了两种方法: 1. 创建一个C++项目,然后通过项目属性启用MASM(Microsoft Macro Assembler)支持。具体步骤是:在解决方案资源管理器中选中项目 -> 点击顶部菜单栏的“项目” -> 选择“生成自定义” -> 勾选“masm” -> 确定。然后可以添加汇编文件(.asm),并在C++代码中使用`extern "C"`来声明和调用汇编中的函数。 2. 在C++源代码中直接嵌入汇编代码。注意,在x86平台上,可以使用内联汇编(__asm关键字),但在x64平台上,内联汇编不被支持(除了在单独的.asm文件中)。因此,为了同时支持x86和x64,可以使用条件编译(如通过宏_M_AMD64判断平台),并分别处理。 具体步骤: 一、查看汇编代码(调试时): 1. 在需要查看汇编代码的C++函数内设置断点。 2. 启动调试(按F5)。 3. 当程序在断点处停止时,右键单击代码编辑区域,选择“转到反汇编”(或“查看反汇编”)。 4. 此时会显示当前函数的汇编代码。 二、编写汇编代码: 有两种方式:内联汇编(仅x86)和独立的汇编文件(x86和x64都支持)。 方式1:内联汇编(仅适用于x86平台) 在C++代码中,使用`__asm`关键字来嵌入汇编指令。例如: ```cpp void my_asm_function() { __asm { mov eax, 5 add eax, 3 // 其他汇编指令 } } ``` 方式2:使用独立的汇编文件(支持x86和x64) 步骤: 1. 在项目中添加一个.asm文件(例如:my_asm.asm)。 2. 编写汇编函数。注意,在x64平台上,调用约定与x86不同,需要遵循x64的调用约定(比如前四个参数通过RCX, RDX, R8, R9传递)。 3. 在C++代码中,使用`extern "C"`声明汇编函数,然后调用。 例如,汇编文件(my_asm.asm): ```asm ; 如果是x86平台,使用.MODEL等 ; 如果是x64平台,则不需要.MODEL ; 根据平台条件编译 ifdef _M_AMD64 ; x64代码 .code my_asm_proc PROC mov rax, 5 add rax, 3 ret my_asm_proc ENDP else ; x86代码 .MODEL flat, C .CODE my_asm_proc PROC mov eax, 5 add eax, 3 ret my_asm_proc ENDP endif ``` 在C++文件中: ```cpp extern "C" int my_asm_proc(); // 声明 int main() { int result = my_asm_proc(); return 0; } ``` 三、项目配置: 对于独立的汇编文件,需要确保项目已经启用了MASM生成自定义。步骤如下: 1. 在解决方案资源管理器中,右键单击项目,选择“生成依赖项”->“生成自定义”。 2. 在弹出的对话框中,勾选“masm(.targets, .props)”,然后点击“确定”。 3. 添加.asm文件到项目中,并确保其文件属性为“Microsoft Macro Assembler”。 注意:在x64平台上,内联汇编不被支持,因此必须使用独立的汇编文件。 总结: - 查看汇编代码:通过调试状态下的反汇编窗口。 - 编写汇编代码:x86平台可以使用内联汇编,x86和x64平台都可以使用独立的汇编文件(需要配置项目启用MASM)。 相关问题: 1. 在Visual Studio中如何调试汇编代码? 2. 如何在x64平台上使用内联汇编? 3. 汇编函数与C++函数之间的参数传递规则是什么? 4. 如何确保汇编代码在x86和x64平台上的兼容性?</think>### 如何在Visual C++中查看或编写汇编代码 #### 一、查看汇编代码(调试时反汇编) 1. **设置断点** 在需要查看汇编代码的C++函数内设置断点(点击代码行左侧灰色区域或按F9键)。 2. **启动调试** 按F5启动调试,程序会在断点处暂停。 3. **查看反汇编** 右键点击代码编辑区 → 选择 **"转到反汇编"**(或"查看反汇编")→ 将显示当前函数的汇编指令[^1]。 ```assembly ; 示例反汇编输出 mov eax,dword ptr [p] cmp eax,dword ptr [q] jge 01234567 ``` #### 二、编写独立汇编文件(支持x86/x64) 1. **启用MASM编译器** - 解决方案资源管理器 → 右键项目 → **"生成依赖项" → "生成自定义"** - 勾选 **"masm(.targets, .props)"** → 确定[^2] 2. **添加汇编文件** - 右键项目 → 添加 → 新建项 → 选择 **"C++文件(.cpp)"** → 将扩展名手动改为 **`.asm`** - 编写汇编代码(示例): ```assembly ; myasm.asm .code myAdd PROC ; 声明函数 add ecx, edx ; x86参数传递(ecx=第一个参数, edx=第二个) mov eax, ecx ; 返回值存eax ret myAdd ENDP END ``` 3. **C++调用汇编函数** ```cpp extern "C" int myAdd(int a, int b); // 声明汇编函数 int main() { int sum = myAdd(5, 3); // 调用 return 0; } ``` #### 三、内联汇编(仅限x86平台) ```cpp void inlineDemo() { int a = 10, b = 20; __asm { mov eax, a ; 将a值加载到eax寄存器 add eax, b ; eax += b mov a, eax ; 结果存回a } // 此时a=30 } ``` > ⚠️ 注意:x64平台不支持`__asm`内联汇编,需使用独立.asm文件[^3]。 #### 四、跨平台处理技巧 通过宏判断平台: ```cpp #if defined(_M_AMD64) // x64平台使用独立汇编文件 extern "C" void asmFunc(); #else // x86平台使用内联汇编 __asm { ... } #endif ``` --- ### 常见问题解答 **Q1: 为什么x64不支持内联汇编?** A1: x64架构采用更复杂的寄存器管理和调用约定,VS编译器未实现内联汇编支持,需通过独立汇编文件实现[^3]。 **Q2: 如何查看Release模式的汇编?** A2: 项目属性 → **"C/C++" → "优化" → 禁用优化**(设为/Od)→ 按调试查看反汇编。 **Q3: 汇编函数如何返回浮点数?** A3: x86通过`fstp`指令存到ST0寄存器;x64需用XMM0寄存器: ```assembly ; x64示例 mySqrt PROC sqrtsd xmm0, xmm0 ; 计算xmm0的平方根 ret mySqrt ENDP ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值