mantouqq 发表于 2004-1-8 11:46

请教编程问题

最近在学习mips指令
涉及到一个程序
int zerocount(int *a0, int *a1) {
int *p=zerofind(a0,a1);
if (p==0) {
return 0;
}
return (1+zerocount(p+1, a1));
}
对应mips指令:
zerocount: addi $sp,$sp,8    # Platz schaffen für 2 Worte
sw $ra,4($sp)                        # Rücksprungadresse sichern
sw $a1,0($sp)                     # a1 sichern
jal zerofind
beq $v0,$zero,finish             # keine Nullen mehr Þ Ende
lw $a1,0($sp)                        # a1 wieder vom Stack holen
addi $a0,$v0,4                      # neue Anfangsadresse für rek. Aufruf
jal zerocount
addi $v0,$v0,1
finish: lw $ra,4($sp)                # Rücksprungadresse vom Stack holen
subi $sp,$sp,8                     # Stack freigeben
jr $ra                                    # zurückspringen

调用的zeronfind子程序如下
int *zerofind(int *a0, int *a1) {
int *p=0;
while (a0<=a1) {
if (*a0==0) {
p=a0;
break;
}
a0++;
}
return p;
}

对应mips指令

zerofind: addi $v0,$zero,0   # Ergebnis mit Null initialisieren
loop: slt $t0,$a1,$a0            # while-Schleife: wenn a0&pound;a1,abarbeiten,
bne $t0,$zero,finish             # sonst nach finish springen
lw $t1,($a0)                        # das n&auml;chste Element des Array laden
beq $t1,$zero,found            # Null gefunden?
addi $a0,$a0,4                  # Elementaddresse inkrementieren
j loop
found: addi $v0,$a0,0
finish: jr $ra                        # zurückspringen



可以看到,程序执行为了找出数组中零的个数
子程序执行是找到零,返回的是存零的地址

但是我有点不明白的就是,
addi $a0,$v0,4                      # neue Anfangsadresse für rek. Aufruf
jal zerocount
addi $v0,$v0,1
这部分。
v0里存的明明是若有零则零的地址,但是后面他又加一,却作了计数
而且,每到执行到jal zerocount这部分都会跳转回去作循环,直到找不到零为止
那下面那条addi $v0,$v0,1语句什么时候执行呢?
应为如果找不到零就直接执行finish了

请哪位大侠赐教
页: [1]
查看完整版本: 请教编程问题