Loop forwards each byte to uart_tx_byte. ra/s0/s1 saved in a 16-byte
frame; s0 holds the buffer cursor and s1 the remaining count, both
across the inner call. Empty-buffer case exits at the loop head with
one branch.
Static checks: aligned prologue, sw of ra+s0+s1, lbu a0,0(s0) +
addi s0,1 + addi s1,-1 in the loop, beqz s1 head exit, restored
epilogue + ret.