#;3/2/2009 RGD #;assemble: as -o stringlen.o stringlen.S #;link: ld -s -o stringlen stringlen.o #;Using GNU LD and GNU AS #;basic Example 2 on Openrisc & stuff a delay slot #;NOTE or32 comments are just a '#' #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# .data testgreeting: .string "Basic string length w/delay slots:\n" glen = . - testgreeting basicteststr: .string "mytest\0" len = .- basicteststr resultstr: .string " is the length of mytest\n" rlen = . - resultstr .text .global _start .type _start,@function _start: l.addi r3, r0, 0x1 #; stdfile no 1 l.movhi r4, hi(testgreeting) #; move upper 16 in l.ori r4, r4, lo(testgreeting)#; or in the lower 16 l.addi r5, r0, glen #; strnlen l.addi r11, r0, 0x4 #; write sys call 4 l.sys 0x1 #; call os print initial l.movhi r4, hi(basicteststr) #; move upper 16 in l.ori r4, r4, lo(basicteststr)#; or in the lower 16 l.jal string_len #; j & l l.addi r3, r0, 0x1 #; stdfile no 1 l.addi r5, r0, 0x1 #; strnlen l.addi r11, r0, 0x4 #; write sys call 4 l.sys 0x1 #; print upper l.addi r3, r0, 0x1 #; stdfile no 1 l.movhi r4, hi(resultstr) #; move upper 16 in l.ori r4, r4, lo(resultstr) #; or in the lower 16 l.addi r5, r0, rlen #; strnlen l.addi r11, r0, 0x4 #; write sys call 4 l.sys 0x1 #; call os print initial l.j local_exit #; all done l.addi r11, r0, 0x1 #; sys call use delay slot(exit) .global string_len .type string_len,@function string_len: l.or r13, r4, r4 #; preserve r4 l.addi r15, r0, 0x0 #; counter not_done: l.lbz r17, 0(r13) #; get a byte l.sfeqi r17, 0x0 #; see if we have null term l.bf done_loop #; check for flag null term l.addi r15, r15, 0x1 #; incr cntr in delay slot l.j not_done #; spin the loop l.addi r13, r13, 0x1 #; incr ptr to r4 mem done_loop: l.ori r15, r15, 0x30 #; ascii number adjust l.jr r9 l.sb 0(r4), r15 #; write mem in delay .global local_exit .type local_exit,@function local_exit: l.sys 1 #; call os call val in delay #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#