C++内联汇编计算n阶矩阵i+j>4元素和出错,求问题排查
矩阵元素和计算错误排查(内联汇编实现)
问题根源
原代码的核心错误是判断逻辑完全不符合需求:需求是累加i+j>4的元素,但代码中用cmp ecx, 0和cmp ebx, 0进行判断,仅当行索引i和列索引j都大于0时才累加元素,这相当于累加所有非第一行、非第一列的元素(共9个值为1的元素),所以输出结果为9。
数组地址计算部分逻辑正确:edx = ecx*n + ebx得到元素的下标偏移,4*edx转换为字节偏移(int类型占4字节),通过[A + 4*edx]访问元素的方式没问题。
修正方案
替换错误的判断逻辑,改为计算i+j的值并判断是否大于4:
- 计算
i+j:将行索引ecx和列索引ebx相加 - 比较相加结果,若
i+j <=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 // 行索引i初始化为0 outer_loop: mov ebx, 0 // 列索引j初始化为0 inner_loop : // 计算元素的下标偏移:i*n + j mov edx, ecx imul edx, n add edx, ebx // 计算i+j,判断是否大于4 mov eax, ecx add eax, ebx cmp eax, 4 jle next_column // 如果i+j <=4,跳过累加 // 累加满足条件的元素 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的元素为:
- 行2(i=2)、列3(j=3):值为1
- 行3(i=3)、列2(j=2):值为1
- 行3(i=3)、列3(j=3):值为1
正确结果为1+1+1=3,修正后的代码会输出该结果。
内容的提问来源于stack exchange,提问作者Batsamut Nikita
相关产品推荐
相关产品推荐

