此问题在此处已有答案:
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?
当然两者都可能是错的
(如果这个问题很麻烦,或者我没有做正确的事情,我很抱歉。)
2条答案
按热度按时间s71maibg1#
mat1
运算式位于=
符号的左边,表示它是指派的目的,而mat2
运算式则是撷取要在该指派中使用的值。我们知道,
mat1
将是一个内存写操作,首先它必须对mat2
执行内存读操作。我们还知道,对于
mat2
,它需要计算(j×P+i)×4
,对于mat1
,它需要计算(i×Q+j)×4
。我们还知道,在函数入口处,
i
位于edi
中,j
位于esi
中。这些事实和汇编代码足以推理出
P
和Q
。ccgok5k52#
不是答案,但启用优化以消除干扰。还要将
int
索引更改为正确的类型size_t
https://godbolt.org/z/hb54f1x6x
或