在 C++ 中使用内联汇编计算 n 阶矩阵的元素和的问题

问题描述 投票:0回答:1

问题是我有一个条件,应该将一个元素添加到总和中。如果元素的索引之和( 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

我的代码有什么问题?

c++ assembly matrix
1个回答
0
投票

我会在这里做一个小反汇编者:

#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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.