在c++中使用内联程序集更改数值
Changing a number value using an inline assembly in C++
我试图通过在c++中使用内联程序集来增加数值。我这样做的原因是为了练习我的"内联汇编"技能。
这就是我目前所做的:
void main()
{
int x;
cout << "Please enter a number ";
cin >> x;
cout << "The number you entered is: " << x << "n";
foo(&x);
cout << "The new number is: " << x;
cin >> x;
}
void foo(int *x)
{
__asm
{
inc [x]
};
}
这个值没有改变
实际上是在增加x
的值。X
在汇编语言中是包含函数foo
的x
变量地址的常量。反过来,它包含main
的x
的地址。因此,inc [x]
导致指针自增。您需要增加存储在地址[x]
的值,就像inc [[x]]
一样。当然,在汇编语言中,你不能在一条指令中做到这一点,因为你需要两次内存访问:知道值存储在的位置,并实际增加值。所以我建议这样写代码:
push eax
mov eax, [x]
inc dword ptr [eax]
pop eax
了解visualc++如何增加int指针的值是有用的:
void foo(*x)
{
(*x)++;
}
在调试模式下,它被翻译成
(*x)++;
mov eax,dword ptr [x]
mov ecx,dword ptr [eax]
add ecx,1
mov edx,dword ptr [x]
mov dword ptr [edx],ecx
与Aneri的回答相同。
x86只能增加寄存器,而不能增加内存,因此需要将指针移动到寄存器。我是这样结束的:
__asm
{
mov eax, x
mov ebx, [eax]
inc ebx
mov [eax], ebx
};
相关文章:
- 内联程序集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程序集时,映像格式错误