使用 Visual Studio 2010 的 C++ 内联程序集
inline assembly in c++ using visual studio 2010?
我尝试在64位Windows 7下使用Visual Studio 2010编译以下代码。
#include "stdafx.h"
#include <iostream>
using namespace std;
int strlen2(char str[] )
{
int x ;
_asm
{
MOV ESI,0;
LA: MOV DL,BYTE PTR str[ESI];
CMP DL,0;
JE EXIT;
INC ESI;
JMP LA;
EXIT: MOV x,ESI;
};
return x;
}
int main()
{
char X[] ="string2222";
cout<<strlen2(X);
system("pause");
return 0;
}
我希望输出将是"10按任意键继续......",但不幸的是,
输出是"3按任意键继续。。。"对于 X[] 的任何值。
你能解释一下错误在哪里吗???
因为你测量的是指针的长度(幸运的是,指针的顶部字节为零),而不是字符串。
试试这个:
MOV ESI,0;
MOV EBX, strl
LA: MOV DL,[ESI + EBX];
CMP DL,0;
JE EXIT;
INC ESI;
JMP LA;
EXIT: MOV x,ESI;
我没有
环境来测试这一点,但我怀疑您在访问 str
LA: MOV DL,BYTE PTR str[ESI];
您可能正在扫描指针的值,而不是指向的字符串。
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 使用CLANG内联程序集创建C++预增量操作
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用于比较基元类型的std::可选的有趣程序集
- 在.NET Core 3.1中运行托管C++/CLI程序集时,映像格式错误