汇编实现INT64动态矩阵转置函数的指针问题求助
汇编实现INT64动态矩阵转置的错误排查
我尝试用汇编编写函数来转置INT64类型的动态矩阵,但程序似乎出现了矩阵越界访问,或是在指针寻址、字节移动保存时存在错误。多次修改代码仍未解决问题,希望能得到帮助以明确错误所在。
调用转置函数的C++代码
#include <iostream> #include <windows.h> extern "C" void transpose(INT64**, INT64); // 打印矩阵的函数 void printMatrix(INT64** matrix, INT64 n) { for (INT64 i = 0; i < n; ++i) { for (INT64 j = 0; j < n; ++j) { std::cout << matrix[i][j] << " "; } std::cout << std::endl; } } int main() { INT64 n = 8; // 矩阵大小 // 初始化矩阵A INT64** A = new INT64 * [n]; for (INT64 i = 0; i < n; ++i) { A[i] = new INT64[n]; for (INT64 j = 0; j < n; ++j) { A[i][j] = i * n + j; // 填充矩阵A } } std::cout << "转置前的矩阵:" << std::endl; printMatrix(A, n); // 打印转置前的矩阵 // 调用转置函数 transpose(A, n); std::cout << "转置后的矩阵:" << std::endl; printMatrix(A, n); // 打印转置后的矩阵 // 释放内存 for (INT64 i = 0; i < n; ++i) { delete[] A[i]; } delete[] A; return 0; }
第一个汇编转置函数版本
.code transpose PROC mov r10, rax ; 将维度8存入r10 mov r11, rax ; 将维度8存入r11 loopRow: mov r8, [rcx + rax] ; 初始化行索引(i)为8 (8,7,6,5,4,3,2,1) mov r9, [rcx + 8 * rax] ; 初始化列索引(j)为8 (56,48,40,32,24,16,8,0) loopColumn: mov rdx, [r9 + rdi * 8] ; 从矩阵加载元素 (56,48,40,32,24,16,8,0) mov rsi, [rcx + rdi * 8] ; 从矩阵加载元素 (7,6,5,4,3,2,1,0) mov [r9 + rdi * 8], rsi ; 将元素赋值到转置后的位置 mov [rcx + rdi * 8], rdx inc rdi ; 移动到下一列 cmp rdi, r10 ; 检查是否完成所有列的处理 jl loopColumn inc r11 ; 移动到下一行 cmp rdi, r11 ; 检查是否完成所有行的处理 jl loopRow ret transpose ENDP END
修改后的第二个汇编转置函数版本
.code transpose PROC mov r10, rdx ; 矩阵大小n mov r11, rdx ; 矩阵大小n loopRow: mov r10, r11 mov r12, [rcx + 8 * r10 - 8] ; 矩阵的元素(64) mov r13, [rcx + 8 * r11 - 8] ; 矩阵的元素(64) loopColumn: mov rdx, [rcx + 8 * r10 - 8] mov rsi, [rcx + 8 * r11 - 8] mov r8, rdx mov [rcx + 8 * r10 - 8], rsi mov [rcx + 8 * r11 - 8], rdx dec r10 ; 移动到下一列 jnz loopColumn dec r11 ; 移动到下一行 jnz loopRow ret transpose ENDP END
内容的提问来源于stack exchange,提问作者szyjas
相关产品推荐
相关产品推荐

