【问题标题】:what does this C matrix code do? [closed]这个 C 矩阵代码有什么作用? [关闭]
【发布时间】:2026-01-10 16:00:01
【问题描述】:
int matrix[50][100], a, b, c; 
matrix[a][b] = c; 

我真的不明白这段 C 代码是做什么的,我需要这样做才能将其“翻译”成汇编程序

【问题讨论】:

  • 没什么好说的。使用未定义的值进行播放。
  • 试试就知道了。
  • 如果你想把它翻译成汇编器 - 选择一个编译器并指示它打印汇编而不是生成二进制文件。
  • 你怎么知道汇编而不知道C?不,说真的……
  • 由于ab 中的垃圾值,代码的行为未定义。有时您可能会遇到分段错误。 + 如果您想在低级别检查您的代码,您可以使用gcc -S file.c,这将在file.s 中为您提供一个 asm 代码。是的,没有语法错误,因此您的代码将成功编译

标签: c matrix


【解决方案1】:
int matrix[50][100], a, b, c; 
matrix[a][b] = c;

它创建了 50 个数组,每组 100 个 int。然后它用值c 初始化ath 数组的bth 整数。但是你应该初始化abc。否则,由于它们具有自动存储期限,它们的值将是未定义的。

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

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

【讨论】:

  • asm 代码中的一些 cmets 会很好 :)
  • @GrijeshChauhan:对。我会更新的。
  • 为了进一步改进,您可以添加存储在 col major 中的矩阵信息,这就是为什么有效地址计算为 %edx = 100 * a = 100 * 2 = 200
  • ok 对不起,我逐行写错了。这就是为什么* 100 ...我忘了+你为什么我回来了。非常好的答案
  • 谢谢@GrijeshChauhan。 ;-)