C++ 处理结构内部的数组,带有程序集
我试图检查结构中数组中的偶数,但我认为我写得不对。当调试时,(即count=3v[]={1,2,4}),在它到达“cmp eax、[ebp+12]和je outt;”之后,它转到outt:即是 s应该保持所有偶数的和,int suma(test*)中的eax是数组的索引,edx在将其移动到s之前保持和 我做错了什么C++ 处理结构内部的数组,带有程序集,c++,assembly,visual-studio-2015,C++,Assembly,Visual Studio 2015,我试图检查结构中数组中的偶数,但我认为我写得不对。当调试时,(即count=3v[]={1,2,4}),在它到达“cmp eax、[ebp+12]和je outt;”之后,它转到outt:即是 s应该保持所有偶数的和,int suma(test*)中的eax是数组的索引,edx在将其移动到s之前保持和 我做错了什么 #include "stdafx.h" #include <iostream> using namespace std; struct test { int v[10
#include "stdafx.h"
#include <iostream>
using namespace std;
struct test {
int v[10];
short count;
};
test a;
int s = 6;
int suma(test *)
{
_asm {
mov eax, 0; // i for counting inside array
mov edx, 0; // sum of even elements
mov ebx, [ebp + 8]; // array v adress
loop:
cmp eax, [ebp + 12];
je outt;
mov ecx, [ebx + 4 * eax];
inc eax;
mov edi, ecx
and ecx, 1;
cmp ecx, 1;
je loop;
add edx, edi;
jmp loop;
outt:
mov eax, edx;
}
return s;
}
int main()
{
cin >> a.count;
for (int i = 0; i < a.count; i++)
cin >> a.v[i];
_asm {
LEA eax, a
push eax;
call suma;
add esp, 4;
mov s, eax;
}
cout << s;
return 0;
}
#包括“stdafx.h”
#包括
使用名称空间std;
结构测试{
INTV[10];
短计数;
};
试验a;
int s=6;
int suma(测试*)
{
_asm{
mov eax,0;//用于数组内计数的i
mov edx,0;//偶数元素之和
mov ebx,[ebp+8];//数组v地址
循环:
cmp-eax,[ebp+12];
杰奥特;
mov-ecx,[ebx+4*eax];
公司eax;
电子数据交换
ecx,1;
cmp-ecx,1;
乙脑环;
添加edx、edi;
jmp环;
输出:
mov-eax,edx;
}
返回s;
}
int main()
{
cin>>a.计数;
for(int i=0;i>a.v[i];
_asm{
leaeax,a
推动eax;
叫苏玛;
添加esp,4;
mov-s,eax;
}
我可以问一下您为什么要使用汇编吗?[ebp+8]
包含测试的地址(根据原型)。因此要获得计数,您需要[ebx+40]
而不是[ebp+12]
如果将count
作为一个单独的参数传递,这将起作用。此外,count
是一个short
,很可能是一个16位整数。可以这样使用它,也可以将其更改为int
(推荐)。您似乎正在使用程序集大锤来优化编译器可以为您做的事情。为什么不使用if(value&0x01){s++;}
您应该知道,这将产生极为次优的代码。与编译器生成的代码相比,您实际编写的汇编代码不仅是次优的,而且您在内联汇编块中使用了分支和调用这一事实基本上保证了输出将非常糟糕。我留下这一评论很多,但是如果您正试图学习如何在汇编中编程,那么内联汇编并不是实现这一点的方法你应该考虑使用它来编写你的整个程序。否则,用C写C!谢谢。这是我应该为未来的大学测试所做的工作,这就是为什么我试图得到它,但是它没有那么好的解释,无论我在互联网上找到什么都是全面的,或者不是我所需要的。谢谢。很多。