汇编函数转置矩阵中的指针问题

问题描述 投票:0回答:1
在我的代码中,我尝试使用汇编中编写的函数转置动态矩阵(IN64) 看来我试图从矩阵外部读取,或者我在尝试指出我的函数应该从哪里移动并保存字节时犯了一个错误。

请帮助我解决这个问题,因为正确理解我所犯的错误对我来说很重要

这里是使用函数转置的 C++ 代码

#include <iostream> #include <windows.h> extern "C" void transpose(INT64**, INT64); // Function for displaying the matrix 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; // Matrix size // Initialization of matrix 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; // Filling matrix A } } std::cout << "Matrix before transposition:" << std::endl; printMatrix(A, n); // Display the matrix before transposition // Calling the transpose function transpose(A, n); std::cout << "Matrix after transposition:" << std::endl; printMatrix(A, n); // Display the matrix after transposition // Deallocate memory for (INT64 i = 0; i < n; ++i) { delete[] A[i]; } delete[] A; return 0; }
这是转置函数

.code transpose PROC mov r10, rdx ; matrix size n mov r11, rdx ; matrix size n loopRow: mov r10, r11 mov r12, [rcx + 8 * r10 - 8] ; el.(64) of the matrix mov r13, [rcx + 8 * r11 - 8] ; el.(64) of the matrix 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 ; Move to the next column jnz loopColumn dec r11 ; Move to the next row jnz loopRow ret transpose ENDP END
    
pointers assembly x86-64 transpose
1个回答
1
投票
我不知道如何挽救当前的代码。

    你似乎在猜测争论的焦点。
  • 您正在使用 RDI 作为索引,而没有事先对其进行初始化。我认为 0 是合适的,但即使这样,对列和行使用相同的缩放索引
  • rdi * 8
    仍然是错误的。对于列,您需要 8 的步长(对应于 
    inc rdi
    ),但对于行,您需要 64 的步长(对应于 
    add rdi, 8
    )。
  • 您正在使用内存中的一些值(矩阵中的元素)设置 R8 和 R9 寄存器,对于 R8,您之后甚至不会使用它。对于 R9,您可以使用数组中的元素,就好像它是地址一样。
  • ...
前段时间我在代码审查网站上发布了

Q/A。您应该阅读它,因为它以图形方式显示了以下代码的作用。

; TransposeSquareMatrix(A, n) mov rbx, rdi ; Address A is in RDI mov rcx, rsi ; Dimension n is in RSI imul r8, rsi, 8 ; Step between rows dec rcx jz .c ; It's a (1 x 1) matrix .a: push rcx ; (1) mov rsi, rbx ; Column address mov rdi, rbx ; Row address .b: add rsi, 8 ; To next element in this row add rdi, r8 ; To next element in this column mov rax, [rsi] ; Swap 2 elements mov rdx, [rdi] mov [rdi], rax mov [rsi], rdx dec rcx jnz .b lea rbx, [rbx + r8 + 8] ; To next element on main diagonal pop rcx ; (1) dec rcx jnz .a ; Continu until (1 x 1) matrix .c: ret
    
© www.soinside.com 2019 - 2024. All rights reserved.