请教编程问题
最近在学习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£a1,abarbeiten,
bne $t0,$zero,finish # sonst nach finish springen
lw $t1,($a0) # das nä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]