更改函数中的数组值 - 内联程序集
Changing Array Values In Function - Inline Assembly
所以我不久前自学了x86汇编,只是在C++中玩内联汇编。
所以我想做的是在函数参数中,传入一个数组、一个索引(无符号整数)和一个数字。使用程序集,它会将数组该内存位置中的值更改为传入的值。所以代码看起来像这样。
inline void Set( int pArray[], unsigned int pIndex, int pNum ) {
__asm {
mov ebx, pIndex
mov eax, 4
mul ebx
mov ebx, pNum
lea edi, pArray
mov [ edi + eax ], ebx
}
}
int main() {
int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
Set( myArray, 2, 7 );
std::cout << myArray[ 2 ] << std::endl;
}
因此,代码应该加载数组地址的开头,获取索引并将其乘以 4,以便内存位置移动这么多字节,并将其更改为传入的值。但是,当我这样做时,值保持不变。为什么?出了什么问题?
lea
代表"加载有效地址",您的lea放置参数的地址。 你的意思是lea edi, [pArray]
但是,还有两件事:1)你不必乘以四。 你可以做lea edi, [pArray + 4*ebx]
由于"缩放索引字节"寻址模式允许您乘以 4 并添加一个即时地址。
2)你假设32位。 您使用的哪台计算机在2015年中期仍在32位模式下工作?
我对英特尔语法汇编生疏。 我可以推荐你学习GCC中汇编程序和C++代码的集成吗?https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
相关文章:
- 程序使用数组中的字符串给出错误
- 如何使该程序在数组中打印搜索字符的索引,否则将找不到它
- 在比较特定输入中的程序的数组中出错
- C 程序要求数组的大小后崩溃
- 程序随数组声明崩溃
- 将字节数组从c++传递到c#程序集的不同方法是什么
- 移动字符数组的值以注册 x86 内联程序集
- C 程序崩溃(数组和2个指针Binsearch功能)
- 使用字符串、字符数组、c++和汇编.向程序集传递字符串时出错
- 从字节数组发出内联程序集
- x86英特尔程序集和C++-数组周围的堆栈已损坏
- 程序与数组来检查增加/减少的数字
- c++容器集+数组功能
- SIGSEGV 使用程序集访问数组元素时
- 编写程序从数组中删除重复项
- 目的:编写一个程序从数组中删除重复项
- C++程序函数数组
- 更改函数中的数组值 - 内联程序集
- 简单的C程序跟踪数组
- 我面临这个:我的程序中数组下标的无效类型"double[int]"