סכום אברי עץ בינרי
struct node {
struct node *left;
struct node *right;
long long value;
};
long long sum(struct node *node) {
if (node == NULL)
return (0);
return (sum(node->left) + node->value + sum(node->right));
}
sum:
bne a0, zero, work // if (node != NULL) goto work
jalr zero, 0(ra) // return
work:
addi sp, sp, -24 // 3 dwords on stack
sd ra, 0(sp) // save: return address
sd a0, 8(sp) // node
ld a0, 0(a0) // node->left
jal ra, sum // sum(node->left)
ld t0, 8(sp) // node
ld t1, 16(t0) // node->value
add t1, t1, a0 / node->value + sum(node->left)
sd t1, 16(sp) // save
ld a0, 8(t0) // node->right
jal ra, sum // sum(node->right)
ld t0, 16(sp) // restore node->value + sum(node->left)
add a0, a0, t0 // node->value + sum(node->left) + sum(node->right)
ld ra, 0(sp)
addi sp, sp, 24
jalr zero, 0(ra) // return