这段C矩阵代码是做什么用的?

3
int matrix[50][100], a, b, c; 
matrix[a][b] = c; 

我真的不明白这段C代码是做什么的,我需要理解它以便可以将其翻译成汇编语言。

8
没有好的结果。在使用未定义的值进行操作。 - Andrey
2
试一试,你就会知道。 - Maroun
1
如果你想将它翻译成汇编语言 - 选择一个编译器并指示它打印汇编代码而不是生成二进制代码。 - Andrey
1
你怎么可能懂汇编却不懂C语言?不,说真的... - Nikos C.
1
由于ab中存在垃圾值,代码的行为是未定义的。有时候你可能会遇到分段错误。如果您想在低级别检查代码,可以使用gcc -S file.c命令,这将给您提供一个file.s汇编代码文件。是的,虽然没有语法错误,但您的代码将成功编译。 - Grijesh Chauhan
1个回答

3
int matrix[50][100], a, b, c; 
matrix[a][b] = c;

它创建了50个100个int的数组。然后,它将第a个数组的第b个整数初始化为值c。但是你应该初始化a、b和c。否则,由于它们具有自动存储期限,它们的值将是未定义的。
int matrix[50][100];
int a = 2;
int b = 3;
int c = 4;
matrix[a][b] = c;

这是我使用的gcc(4.4.4)将代码转换为汇编(AT&T语法)的方式:
movl    $2, -4(%ebp)                # a = 2
movl    $3, -8(%ebp)                # b = 3
movl    $4, -12(%ebp)               # c = 4
movl    -4(%ebp), %edx              # %edx = a = 2
movl    -8(%ebp), %eax              # %eax = b = 3
imull   $100, %edx, %edx            # %edx = 100 * a = 100 * 2 = 200
addl    %eax, %edx                  # %edx = %edx + b = 200 + 3 = 203
                                    # Formula: %edx = 100 * a + b
movl    -12(%ebp), %eax             # %eax = c = 4
movl    %eax, -20012(%ebp,%edx,4)   # Access to 203-th element (each of these
                                    # are 4 bytes, ie. sizeof(int) on my 
                                    # computer) and put %eax = 4 in it.

在C语言中,数组确实是按行主序存储的(row-major order)。也就是说,当你在源代码中写matrix[a][b]时,你将访问到:

offset = row*NUMCOLS + column = a*100 + b

这就是汇编代码所显示的内容。


一些汇编代码中的注释会很好 :) - Grijesh Chauhan
@GrijeshChauhan:好的,我会更新它。 - md5
为了进一步提高性能,您可以添加矩阵存储在列主序中的信息,因此有效地址计算为 %edx = 100 * a = 100 * 2 = 200 - Grijesh Chauhan
抱歉,我写错了,应该逐行计算。这就是为什么要乘以100... 我忘记加上它了,所以我回来了。非常好的答案! - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接