# 一個陣列宣告的範例 ```c #include <stdio.h> int main() { int x, y; scanf("%d %d", &x, &y); int aa = 1; int bb = 2; int b[x]; int h[y]; int c = 3; scanf("%d", &c); int i; for(i=0; i<x; i++) { b[i] = i; } for(i=0; i<y; i++) { h[i] = y-i; } printf("%d %d %d\n", b[x-1], b[x-2], b[x-3]); printf("%d %d %d\n", h[y-1], h[y-2], h[y-3]); printf("%d\n", c); return 0; } ``` ## 編譯 ```shell= riscv64-unknown-elf-gcc -O2 -S test.c ``` ## 對應的Assembly ``` .file "test.c" .option nopic .text .section .text.startup,"ax",@progbits .align 2 .globl main .type main, @function main: addi sp,sp,-48 sd ra,40(sp) sd s0,32(sp) sd s1,24(sp) addi s0,sp,48 sd s2,16(sp) lui a0,%hi(.LC0) addi a2,s0,-40 addi a1,s0,-44 addi a0,a0,%lo(.LC0) call scanf lw a4,-44(s0) lw a5,-40(s0) lui a0,%hi(.LC1) slli a4,a4,2 addi a4,a4,15 slli a5,a5,2 andi a4,a4,-16 addi a5,a5,15 sub sp,sp,a4 andi a5,a5,-16 mv s2,sp addi a1,s0,-36 sub sp,sp,a5 addi a0,a0,%lo(.LC1) li a5,3 sw a5,-36(s0) call scanf lw a3,-44(s0) mv s1,sp blez a3,.L2 mv a4,s2 li a5,0 .L3: sw a5,0(a4) addiw a5,a5,1 addi a4,a4,4 bne a5,a3,.L3 .L2: lw a5,-40(s0) blez a5,.L4 sext.w a5,a5 mv a4,s1 .L5: sw a5,0(a4) addiw a5,a5,-1 addi a4,a4,4 bnez a5,.L5 .L4: slli a3,a3,2 add a5,s2,a3 lw a3,-12(a5) lw a2,-8(a5) lw a1,-4(a5) lui s2,%hi(.LC2) addi a0,s2,%lo(.LC2) call printf lw a5,-40(s0) addi a0,s2,%lo(.LC2) slli a5,a5,2 add a5,s1,a5 lw a1,-4(a5) lw a3,-12(a5) lw a2,-8(a5) call printf lw a1,-36(s0) lui a0,%hi(.LC3) addi a0,a0,%lo(.LC3) call printf addi sp,s0,-48 ld ra,40(sp) li a0,0 ld s0,32(sp) ld s1,24(sp) ld s2,16(sp) addi sp,sp,48 jr ra .size main, .-main .section .rodata.str1.8,"aMS",@progbits,1 .align 3 .LC0: .string "%d %d" .zero 2 .LC1: .string "%d" .zero 5 .LC2: .string "%d %d %d\n" .zero 6 .LC3: .string "%d\n" .ident "GCC: (GNU) 8.2.0" ```