问题是我有一个条件,应该将一个元素添加到总和中。如果元素的索引之和( j+i>4 ),则将该元素添加到总和中;否则忽略它。
我尝试运行它:
#include <iostream>
using namespace std;
const int n = 4;
int main() {
int A[n][n] = {
{10000, 2000, 4000, 10000},
{6000, 1, 1, 1},
{11000, 1, 1, 1},
{160000, 1, 1, 1}
};
int sum = 0;
__asm
{
mov ecx, 0
outer_loop:
mov ebx, 0
inner_loop :
mov eax, A
mov edx, ecx
imul edx, n
add edx, ebx
cmp ecx, 0
jle next_column
cmp ebx, 0
jle next_column
mov eax, [A + 4 * edx]
add sum, eax
next_column :
inc ebx
cmp ebx, n
jl inner_loop
inc ecx
cmp ecx, n
jl outer_loop
}
cout << "Sum of elements where i + j > 4: " << sum << endl;
return 0;
}
输出: i + j > 4 的元素之和:9
我的代码有什么问题?
我会在这里做一个小反汇编者:
#include <iostream>
using namespace std;
const int n = 4;
int main() {
int A[n][n] = {
{10000, 2000, 4000, 10000},
{6000, 1, 1, 1},
{11000, 1, 1, 1},
{160000, 1, 1, 1}
};
int sum = 0;
for(int ecx = 0; ecx < n; ++ecx )
for(int ebx = 0; ebx < n; ++ebx ) {
int edx = ecx*n + ebx;
if(ecx <= 0) continue;
if(ebx <= 0) continue;
sum += *(&(A[0][0]) + edx);
}
cout << "Sum of elements where i + j > 4: " << sum << endl;
return 0;
}
它只是排除第一列和第一行,你会得到正确的答案 - 9。 实际应该是什么
for(int ecx = 0; ecx < n; ++ecx )
for(int ebx = 0; ebx < n; ++ebx ) {
int edx = ecx + ebx;
if(edx <= 4) continue;
edx += ecx*n + ebx;
sum += *(&(A[0][0]) + edx);
}
或者在 asm 中(有点,未经测试,可以写得更好):
__asm
{
mov ecx, 0
outer_loop:
mov ebx, 0
inner_loop :
mov eax, A
mov edx, ecx
add edx, ebx
cmp edx, 4
jle next_column
mov edx, ecx
imul edx, n
add edx, ebx
mov eax, [A + 4 * edx]
add sum, eax
next_column :
inc ebx
cmp ebx, n
jl inner_loop
inc ecx
cmp ecx, n
jl outer_loop
}
问题是它的数组索引是从 0 开始的,所以在这种情况下正确的结果是 3,而不是 170008。你应该考虑到这一点。比较应该是
cmp edx, 2
即 i + j < 2
。