assembly 在装配矩阵中查找P和Q [重复]

6psbrbz9  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(121)

此问题在此处已有答案

Nested Arrays in Assembly, reach desired index(1个答案)
Reverse engineering and interpreting assembly code(1个答案)
Finding the dimensions of an array through assembly(1个答案)
How to find fixed lengths of multidimensional arrays by assembly code?(1个答案)
8天前关闭。
我必须使用汇编代码来求P的值。我该怎么读这个呢?我不太清楚该怎么开始。如果有人能帮助我,或者一步一步地读一遍,或者只是给我解释一下。无论哪种方式都是很大的帮助
在C中:

#define P ?
#define Q ?
int mat1[P][Q];
int mat2[Q][P];
void copy_element( int i, int j) {
     mat1[ i ][ j ] = mat2[ j ][ i ];

在装配中:

copy_element:
    movslq %edi, %rdi
    movslq %esi, %rsi
    movq   %rsi, %rax
    salq   $4, %rax
    subq   %rsi, %rax
    addq   %rdi, %rax
    movl   mat2(,%rax,4), %ecx
    leaq   (%rdi, %rdi, 4), %rdx
    leaq   0(, %rdx, 4), %rax
    addq   %rax, %rsi
    movl   %ecx, mat1,(,%rsi,4)
    ret

我满试:

copy_element:
    movslq %edi, %rdi             ?(rdi = i)
    movslq %esi, %rsi             (rsi = j)
    movq   %rsi, %rax             (rax = j)
    salq   $4, %rax               (rax = 16j)
    subq   %rsi, %rax             (rax = 15j)
    addq   %rdi, %rax             (rax = 15j + i)?
    movl   mat2(,%rax,4), %ecx    (ecx = 60j + 4i)?
    leaq   (%rdi, %rdi, 4), %rdx  (rdx = 5i)
    leaq   0(, %rdx, 4), %rax     (rax = 20i)? or maybe (rax = 15j + 21i)?
    addq   %rax, %rsi             (rsi = j + 20i)
    movl   %ecx, mat1,(,%rsi,4)   what?? (? = 64j + 80i)
    ret

P = 60和Q = 80?
还是P = 15,Q = 20?
当然两者都可能是错的
(如果这个问题很麻烦,或者我没有做正确的事情,我很抱歉。)

s71maibg

s71maibg1#

mat1运算式位于=符号的左边,表示它是指派的目的,而mat2运算式则是撷取要在该指派中使用的值。
我们知道,mat1将是一个内存写操作,首先它必须对mat2执行内存读操作。
我们还知道,对于mat2,它需要计算(j×P+i)×4,对于mat1,它需要计算(i×Q+j)×4
我们还知道,在函数入口处,i位于edi中,j位于esi中。
这些事实和汇编代码足以推理出PQ

ccgok5k5

ccgok5k52#

不是答案,但启用优化以消除干扰。还要将int索引更改为正确的类型size_t

imulq   $100, %rdi, %rax
        addq    %rsi, %rax
        imulq   $10, %rsi, %rsi
        addq    %rdi, %rsi
        movl    mat2(,%rsi,4), %edx
        movl    %edx, mat1(,%rax,4)
        ret

https://godbolt.org/z/hb54f1x6x

leaq    (%rsi,%rsi,4), %rdx
        leaq    (%rdi,%rdi,4), %rax
        leaq    (%rdi,%rdx,2), %rdx
        leaq    (%rax,%rax,4), %rax
        movl    mat2(,%rdx,4), %edx
        leaq    (%rsi,%rax,4), %rax
        movl    %edx, mat1(,%rax,4)
        ret

相关问题