You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:12:55