请帮助我解决这个问题,因为正确理解我所犯的错误对我来说很重要
这里是使用函数转置的 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
rdi * 8
仍然是错误的。对于列,您需要 8 的步长(对应于
inc rdi
),但对于行,您需要 64 的步长(对应于
add rdi, 8
)。
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