Итак, вы хотите что-то вроде:
void printnumbetween(int low, int high)
{
while(high >= low)
{
printf("%d ",high);
high--;
}
return;
}
На языке ассемблера вы можете сделать:
printnumbetween:
#assume $a0 is "int low", $a1 is "int high"
addiu $sp, -12 #to store variables during printf-call
sw $ra, 12($sp) #save return address
sw $s0, 8($sp) #free up caller-saved register
sw $s1, 4($sp) #ditto
addu $s0, $zero, $a0 #move arguments to caller-saved registers
addu $s1, $zero, $a1
bgt $s0, $s1, endfun #if (low > high) return
loop:
addu $a0, $zero, $s1 #move high to argument register
... #set up other arguments for printf()
jal printf #call printf()
addiu $s1, $s1, -1 #high--
ble $s0, $s1, loop #if-converted loop: if (low <= high) goto loop
endfun:
lw $ra, 12($sp)
lw $s0, 8($sp) #restore caller-saved registers
lw $s1, 4($sp)
addiu $sp, 12 #restore stack
jal $ra
Точная семантика сохранения данных в стеке может различаться (указывает ли указатель стека на первый пустой адрес или на последний используемый адрес?), как и требования. к вызову printf()
, который является varargs и, следовательно, уродливым.
person
EOF
schedule
06.01.2015