gpt4 book ai didi

c - 从汇编代码中查找数组的维度

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:16 24 4
gpt4 key购买 nike

我似乎总是把这些类型的问题弄错。我找出了正确的值,但我总是将它们颠倒过来。对于这个问题,正确答案是 H = 15J = 7 但我像往常一样将它们颠倒了......

谁能告诉我他们如何解决这些问题的思考过程?

Array indexing.
Consider the C code below, where H and J are constants declared with
#define
.
int array1[H][J];

int array2[J][H];

void copy_array(int x, int y) {

array2[y][x] = array1[x][y];

}

Suppose the above C code generates the following x86-64 assembly code:
# On entry:
# %edi = x
# %esi = y
#
copy_array:

movslq %edi,%rdi

movslq %esi,%rsi

movq %rsi, %rdx

salq $4, %rdx

subq %rsi, %rdx

addq %rdi, %rdx

leaq 0(,%rdi,8), %rax

subq %rdi, %rax

addq %rsi, %rax

movl array1(,%rax,4), %eax

movl %eax, array2(,%rdx,4)

ret

HJ 的值是多少?

谢谢!

最佳答案

添加评论总是有帮助的。 “技巧”是计算数组元素的地址必须乘以二维数组行长度。您只需要计算出这些乘数:

# On entry:
# %edi = x
# %esi = y
copy_array:
movslq %edi,%rdi ; %rdi = x
movslq %esi,%rsi ; %rsi = y
movq %rsi, %rdx ; %rdx = y
salq $4, %rdx ; %rdx *= 16
subq %rsi, %rdx ; %rdx -= y (so now %rdx = 15 * y)
addq %rdi, %rdx ; %rdx += x (so now %rdx = 15 * y + x)
leaq 0(,%rdi,8), %rax ; %rax = 8 * x
subq %rdi, %rax ; %rax -= x (so now %rax = 7 * x)
addq %rsi, %rax ; %rax += y (so now %rax = 7 * x + y)
movl array1(,%rax,4), %eax ; %rax = array1[7 * x + y]
movl %eax, array2(,%rdx,4) ; array2[15 * y + x] = %rax
ret

现在由于 C 数组以行主顺序存储,array1 的行必须是 7 个元素长(即数组有 7 列)而 array2 的行是15(即它有 15 列)。正如您在问题中所说,这意味着 J = 7 和 H = 15。

关于c - 从汇编代码中查找数组的维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com