/****************************023 数组的应用*****************
* 一个简易的学生成绩查询系统
* C语言精彩编程百例 23 */
#include<stdio.h>
#include<stdlib.h>
void main ()
{
int select;
int i,j;
int score[5][7]={};
int average =0;
int sum=0;
do
{
printf("本程序有4项功能: \n");
printf("1.根据学号查询学生成绩\n");
printf("2.根据考试号统计成绩\n");
printf("3.根据考试号和学号查询成绩\n");
printf("4.成绩录入\n");
printf("0.退出\n");
printf("请输入选择(0-4):");
scanf("%d",&select);
switch(select)
{
case 0:
printf("ok\n");
exit(0);
break;
case 1:
printf("输入学号:");
scanf("%d\n",&i);
for(j=1;j<7;j++)
{
printf("第%d科成绩是%d\n",j,score[i][j]);
sum+=score[i][j];
}
average=sum/6;
printf("学生的平均成绩是%d\n",average);
break;
case 2:
printf("输入考试号:");
scanf("%d\n",&j);
for(i=1;i<5;i++)
{
printf("第%d号学生本科成绩是%d\n",i,score[i][j]);
sum+=score[i][j];
}
average=sum/4;
printf("本科平均成绩是%d\n",average);
break;
case 3:
printf("输入学号和考试号:");
scanf("%d %d\n",&i,&j);
printf("第%d号学生的第%d科考试成绩是%d\n",i,j,score[i][j]);
break;
case 4:
printf("请输入成绩\n");
for(i=1;i<5;i++)
for(j=1;j<7;j++)
scanf("%d\n",&score[i][j]);
break;
default :
break;
}
}while(1);
}
.file "023.c"
.def ___main; .scl 2; .type 32; .endef
.text
LC0:
.ascii "\261\276\263\314\320\362\323\320"
.ascii "4\317\356\271\246\304\334\243\272 \12\0"
LC1:
.ascii "1.\270\371\276\335\321\247\272\305\262\351\321\257\321\247\311\372\263\311\274\250\12\0"
LC2:
.ascii "2.\270\371\276\335\277\274\312\324\272\305\315\263\274\306\263\311\274\250\12\0"
LC3:
.ascii "3.\270\371\276\335\277\274\312\324\272\305\272\315\321\247\272\305\262\351\321\257\263\311\274\250\12\0"
LC4:
.ascii "4.\263\311\274\250\302\274\310\353\12\0"
LC5:
.ascii "0.\315\313\263\366\12\0"
LC6:
.ascii "\307\353\312\344\310\353\321\241\324\361\243\250"
.ascii "0-4\243\251\243\272\0"
LC7:
.ascii "%d\0"
LC8:
.ascii "ok\12\0"
LC9:
.ascii "\312\344\310\353\321\247\272\305\243\272\0"
LC10:
.ascii "%d\0"
LC11:
.ascii "\265\332%d\277\306\263\311\274\250\312\307%d\12\0"
LC12:
.ascii "\321\247\311\372\265\304\306\275\276\371\263\311\274\250\312\307%d\12\0"
LC13:
.ascii "\312\344\310\353\277\274\312\324\272\305\243\272\0"
LC14:
.ascii "\265\332%d\272\305\321\247\311\372\261\276\277\306\263\311\274\250\312\307%d\12\0"
LC15:
.ascii "\261\276\277\306\306\275\276\371\263\311\274\250\312\307%d\12\0"
LC16:
.ascii "\312\344\310\353\321\247\272\305\272\315\277\274\312\324\272\305\243\272\0"
LC17:
.ascii "%d %d\12\0"
.align 32
LC18:
.ascii "\265\332%d\272\305\321\247\311\372\265\304\265\332%d\277\306\277\274\312\324\263\311\274\250\312\307%d\12\0"
LC19:
.ascii "\307\353\312\344\310\353\263\311\274\250\12\0"
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
pushl %edi
subl $180, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -180(%ebp)
movl -180(%ebp), %eax
call __alloca
call ___main
leal -168(%ebp), %edi # edi=score
cld # 设标志位
movl $0, %edx # edx =0
movl $35, %eax #
movl %eax, %ecx # ecx =35 Rep次数
movl %edx, %eax # eax =0
rep
stosl
movl $0, -172(%ebp) # average = 0
movl $0, -176(%ebp) # sum =0
L15:
subl $12, %esp
pushl $LC0
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC1
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC2
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC3
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC4
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC5
call _printf
addl $16, %esp
subl $12, %esp
pushl $LC6
call _printf
addl $16, %esp
subl $8, %esp
leal -12(%ebp), %eax # select
pushl %eax
pushl $LC7
call _scanf
addl $16, %esp
cmpl $4, -12(%ebp) # if select>4 ? 这是default?
ja L15 # break
movl -12(%ebp), %eax # eax = select
sall $2, %eax # eax=select*4
movl L42(%eax), %eax # eax=L42+select*4
jmp *%eax #
.p2align 2
.align 4
L42:
.long L19
.long L20
.long L25
.long L31
.long L32
L19: #case 0
subl $12, %esp # printf("ok\n");
pushl $LC8
call _printf
addl $16, %esp
subl $12, %esp #exit(0); 后面的 break被优化掉了,没必要存在
pushl $0
call _exit
L20: #case 1
subl $12, %esp #printf("输入学号:");
pushl $LC9
call _printf
addl $16, %esp
subl $8, %esp #scanf("%d\n",&i);
leal -16(%ebp), %eax # eax =&i
pushl %eax # &i
pushl $LC10 # "%d\0" 参数是从后往前装的,使用估计是按参数表顺序使用?
call _scanf
addl $16, %esp
movl $1, -20(%ebp) # j=1
L21:
cmpl $6, -20(%ebp) # j<=6
jle L24
jmp L22
L24:
subl $4, %esp # 函数调用前,栈空间调整
movl -16(%ebp), %edx # edx = i
movl %edx, %eax # eax = i
sall $3, %eax # eax =i*8
subl %edx, %eax # eax=i*7
addl -20(%ebp), %eax # eax=i*7+j
pushl -168(%ebp,%eax,4) # -168(%ebp,%eax,4)=score+(i*7+j)*4=score[i][j]
pushl -20(%ebp) # j
pushl $LC11 # "第%d科成绩是%d\n"
call _printf
addl $16, %esp # 平衡堆栈
movl -16(%ebp), %edx # i
movl %edx, %eax # eax=i
sall $3, %eax # eax =i*8
subl %edx, %eax # eax=i*7
addl -20(%ebp), %eax # eax=i*7+j
movl -168(%ebp,%eax,4), %edx # edx=score[i][j]
leal -176(%ebp), %eax# eax=&sum
addl %edx, (%eax) # &sum+=edx
leal -20(%ebp), %eax # eax= &j
incl (%eax) # j++
jmp L21
L22:
movl $715827883, %eax # eax = 幻数715827883
imull -176(%ebp) # edx:eax = 715827883*sum
movl %edx, %ecx # ecx=715827883*sum/(2^32)=sum/5.99999999720603
movl -176(%ebp), %eax # eax=sum
sarl $31, %eax # eax=sum的符号
subl %eax, %ecx # ecx=sum/6-(sum的符号) 趋零取整
movl %ecx, %eax #
movl %eax, -172(%ebp) # average=sum/6
subl $8, %esp
pushl -172(%ebp)
pushl $LC12 # printf("学生的平均成绩是%d\n",average);
call _printf
addl $16, %esp
jmp L15
L25: # case 2
subl $12, %esp # printf("输入考试号:");
pushl $LC13
call _printf
addl $16, %esp
subl $8, %esp # scanf("%d\n",&i);
leal -20(%ebp), %eax # &j
pushl %eax
pushl $LC10
call _scanf
addl $16, %esp
movl $1, -16(%ebp) #i=1
L26:
cmpl $4, -16(%ebp) #i<5
jle L29
jmp L27
L29:
subl $4, %esp
movl -16(%ebp), %edx # edx=i
movl %edx, %eax # eax=i
sall $3, %eax # eax=i*8
subl %edx, %eax # eax=i*7
addl -20(%ebp), %eax # eax=i*7+j
pushl -168(%ebp,%eax,4) # score[i][j]
pushl -16(%ebp) # i
pushl $LC14 # "第%d号学生本科成绩是%d\n"
call _printf
addl $16, %esp
movl -16(%ebp), %edx
movl %edx, %eax
sall $3, %eax
subl %edx, %eax
addl -20(%ebp), %eax
movl -168(%ebp,%eax,4), %edx # edx=score[i][j]
leal -176(%ebp), %eax # eax=&sum
addl %edx, (%eax) # sum+= score[i][j]
leal -16(%ebp), %eax # &i
incl (%eax) # i++
jmp L26
L27:
movl -176(%ebp), %eax # eax=sum
movl %eax, -184(%ebp) # ??=sum //从哪来了一个临时变量?
cmpl $0, -184(%ebp) # if average>=0
jns L30 # jmp
addl $3, -184(%ebp) # ?? += 3
L30:
movl -184(%ebp), %eax # eax=??
sarl $2, %eax # eax=eax/4
movl %eax, -172(%ebp) # average=eax
subl $8, %esp # 为printf("本科平均成绩是%d\n",average)调整堆栈
pushl -172(%ebp) # average
pushl $LC15 # "本科平均成绩是%d\n",
call _printf
addl $16, %esp # 平衡堆栈
jmp L15
L31: # case 3
subl $12, %esp # printf("输入学号和考试号:");
pushl $LC16
call _printf
addl $16, %esp
subl $4, %esp # scanf("%d %d\n",&i,&j);
leal -20(%ebp), %eax
pushl %eax
leal -16(%ebp), %eax
pushl %eax
pushl $LC17
call _scanf
addl $16, %esp
movl -16(%ebp), %edx # edx=i
movl %edx, %eax
sall $3, %eax
subl %edx, %eax # eax = i*7
addl -20(%ebp), %eax # eax = i*7+j
pushl -168(%ebp,%eax,4) # score[i][j]
pushl -20(%ebp) # j
pushl -16(%ebp) # i
pushl $LC18
call _printf
addl $16, %esp
jmp L15 # break
L32: # case 4
subl $12, %esp # printf("请输入成绩\n");
pushl $LC19
call _printf
addl $16, %esp
movl $1, -16(%ebp) # i=1
L33:
cmpl $4, -16(%ebp) # i<5
jle L36
jmp L15
L36:
movl $1, -20(%ebp) # j<15
L37:
cmpl $6, -20(%ebp) # j<7
jle L40
jmp L35
L40:
subl $8, %esp # scanf("%d\n",&score[i][j]);
movl -16(%ebp), %edx # edx=i
movl %edx, %eax
sall $3, %eax
subl %edx, %eax
addl -20(%ebp), %eax # eax=i*7+j
leal 0(,%eax,4), %edx # edx=(i*7+j)*4
leal -168(%ebp), %eax # eax=score
leal (%eax,%edx), %eax # eax=score+(i*7+j)*4
pushl %eax
pushl $LC10
call _scanf
addl $16, %esp
leal -20(%ebp), %eax # eax=&j
incl (%eax) # j++
jmp L37
L35:
leal -16(%ebp), %eax # eax =& i
incl (%eax) # i++
jmp L33
.def _exit; .scl 2; .type 32; .endef
.def _scanf; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef