8x8矩阵下三角元素最小值的汇编实现问题排查
8x8矩阵下三角元素最小值查找汇编代码修复
错误根源
退出码-1073741819对应0xC0000005,本质是内存访问越界,你的汇编逻辑存在多处硬伤:
- 循环计数器混用:
loop指令会自动递减ecx,但你同时用ecx存储外层循环的行数,内层循环也调用loop,直接打乱计数器数值,导致后续内存地址计算完全错误。 - 下三角遍历逻辑错误:根本没区分下三角(行号≥列号)的元素,地址跳转的计算完全不符合8x8 int矩阵的内存布局(每行8个int,占32字节)。
- 最小值更新后未移动指针:
update_min块只更新了最小值,没有执行add esi,4移动指针,会重复读取同一元素,最终引发死循环或非法内存访问。
修复后的完整代码
先明确下三角定义:矩阵中行号≥列号的元素(第i行仅遍历前i+1个元素,行/列从0开始),修复后的代码如下:
#include <iostream> using namespace std; int main() { int matrix[8][8] = { {5, 3, 7, 1, 9, 2, 8, 4}, {2, 6, 3, 1, 8, 5, 7, 3}, {8, 2, 5, 4, 1, 9, 6, 3}, {4, 6, 8, 2, 5, 7, 9, 1}, {7, 3, 2, 5, 8, 1, 4, 6}, {9, 1, 4, 6, 2, 3, 7, 8}, {3, 5, 9, 7, 4, 8, 2, 1}, {6, 8, 1, 3, 7, 6, 5, 4} }; int min_element; __asm { mov ecx, 8 ; 外层循环:总共8行 lea esi, matrix ; esi指向矩阵起始地址 mov edx, 0 ; edx记录当前行要遍历的列数上限(第0行仅列0) ; 初始化最小值为第一个下三角元素(第0行第0列) mov eax, [esi] mov min_element, eax outer_loop: add esi, 32 ; 跳到下一行开头(每行8个int,32字节) inc edx ; 下一行多遍历1个元素(第i行遍历i+1个) mov ebx, edx ; ebx作为内层循环计数器 inner_loop: mov eax, [esi] ; 读取当前元素 cmp eax, min_element jl update_min ; 比当前最小值小则更新 next_element: add esi, 4 ; 指针移到下一个元素 dec ebx jnz inner_loop ; 内层循环未结束则继续 dec ecx jnz outer_loop ; 外层循环未结束则继续 jmp end_loop ; 所有循环结束 update_min: mov min_element, eax ; 更新最小值 jmp next_element ; 继续处理下一个元素 end_loop: } cout << "下三角元素的最小值是: " << min_element << endl; return 0; }
核心修复说明
- 分离循环计数器:外层用
ecx统计行数,内层用ebx统计当前行的下三角元素数量,避免计数器冲突。 - 精准遍历下三角:第i行仅遍历前i+1个元素,严格限定在行号≥列号的区域内。
- 正确内存地址跳转:每行固定偏移32字节,每个元素偏移4字节,彻底避免越界访问。
- 完善最小值更新逻辑:更新最小值后立即跳转至移动指针的步骤,不会重复读取同一元素。
- 手动控制循环:用
dec+jnz替代loop指令,避免ecx被意外修改,逻辑更清晰可控。
运行结果
修复后代码运行会输出:下三角元素的最小值是: 1,与矩阵下三角元素的实际最小值一致。
内容的提问来源于stack exchange,提问作者Not Found
相关产品推荐
相关产品推荐

