RosettaCodeData/Task/String-interpolation-included-/RISC-V-Assembly/string-interpolation-included-.asm
2026-04-30 12:34:36 -04:00

260 lines
7.7 KiB
NASM

# riscv assembly raspberry pico2 rp2350
# program insstring.s
# connexion putty com3
/*********************************************/
/* CONSTANTES */
/********************************************/
/* for this file see risc-v task include a file */
.include "../../constantesRiscv.inc"
.equ BUFFERSIZE, 255
.equ CHARPOS, '@'
/*******************************************/
/* INITIALED DATAS */
/*******************************************/
.data
szMessStart: .asciz "Program riscv start.\r\n"
szMessEndOk: .asciz "Program riscv end OK.\r\n"
szCariageReturn: .asciz "\r\n"
szMessString: .asciz "New string = "
szMessErrorSize: .asciz "Error buffer size !"
szString: .asciz " string "
szString1: .asciz "insert"
szString2: .asciz "abcd@efg"
szString3: .asciz "abcdefg @"
szString4: .asciz "@ abcdefg"
.align 2
/*******************************************/
/* UNINITIALED DATA */
/*******************************************/
.bss
sConvArea: .skip 24
sBuffer: .skip BUFFERSIZE
.align 2
/**********************************************/
/* SECTION CODE */
/**********************************************/
.text
.global main
main:
call stdio_init_all # général init
1: # start loop connexion
li a0,0 # raz argument register
call tud_cdc_n_connected # waiting for USB connection
beqz a0,1b # return code = zero ?
la a0,szMessStart # message address
call writeString # display message
la a0,szString # string address
la a1,szString1 # string address
li a2,0
la a3,sBuffer
li a4,BUFFERSIZE
call strInsert
call displayResult
la a0,szString # string address
la a1,szString1 # string address
li a2,5
la a3,sBuffer
li a4,BUFFERSIZE
call strInsert
call displayResult
la a0,szString # string address
la a1,szString1 # string address
li a2,20
la a3,sBuffer
li a4,BUFFERSIZE
call strInsert
call displayResult
la a0,szString2 # string address
la a1,szString # string address
li a2,CHARPOS # character insertion
la a3,sBuffer
li a4,BUFFERSIZE
call strInsertAtChar
call displayResult
la a0,szString3 # string address
la a1,szString # string address
li a2,CHARPOS # character insertion
la a3,sBuffer
li a4,BUFFERSIZE
call strInsertAtChar
call displayResult
la a0,szString4 # string address
la a1,szString # string address
li a2,CHARPOS # character insertion
la a3,sBuffer
li a4,BUFFERSIZE
call strInsertAtChar
call displayResult
la a0,szMessEndOk # message address
call writeString # display message
call getchar
100: # final loop
j 100b
/***************************************************/
/* insertion string at position */
/***************************************************/
# a0 contains string1
# a1 contains insert string
# a2 contains position
# a3 contains address buffer
# a4 contains buffer size
strInsert:
addi sp, sp, -4 # reserve stack
sw ra, 0(sp) # save registers @ save registers
li t1,0 # init counter
li t3,0 # init counter result string
1: # loop to copy string begin
beq t1,a2,2f # = position ?
add t0,a0,t1 # compute byte address
lbu t2,(t0) # load byte string
beqz t2,2f # zero final ? -> insertion at end
add t0,a3,t3 # compute byte address
sb t2,(t0) # store byte string
addi t1,t1,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 1b # loop
2:
li t4,0
3:
add t0,a1,t4
lbu t5,(t0)
beqz t5,4f #end insertion string
add t0,a3,t3 # compute byte address
sb t5,(t0)
addi t4,t4,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 3b # loop
4:
beqz t2,6f # end string 1 ?
5:
add t0,a0,t1 # compute byte address
lbu t2,(t0) # load byte string
beqz t2,6f # zero final ?
add t0,a3,t3 # compute byte address
sb t2,(t0) # store byte string
addi t1,t1,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 5b # loop
6:
add t0,a3,t3 # compute byte address
sb x0,(t0) # store zero final
mv a0,t3 #return length
j 100f
99:
la a0,szMessErrorSize
call writeString # display message
li a0,-1 # error
100:
lw ra, 0(sp)
addi sp, sp, 4
ret
/***************************************************/
/* insertion string at character insertion */
/***************************************************/
# a0 contains string1
# a1 contains insert string
# a2 contains character insertion
# a3 contains address buffer
# a4 contains buffer size
strInsertAtChar:
addi sp, sp, -4 # reserve stack
sw ra, 0(sp) # save registers @ save registers
li t1,0 # init counter
li t3,0 # init counter result string
1: # loop to copy string begin
add t0,a0,t1 # compute byte address
lbu t2,(t0) # load byte string
beqz t2,3f # zero final ? -> insertion at end
beq t2,a2,2f # character insertion
add t0,a3,t3 # compute byte address
sb t2,(t0) # store byte string
addi t1,t1,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 1b # loop
2:
addi t1,t1,1 # jump character insertion
3:
li t4,0
4:
add t0,a1,t4
lbu t5,(t0)
beqz t5,5f # end insertion string
add t0,a3,t3 # compute byte address
sb t5,(t0)
addi t4,t4,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 4b # loop
5:
beqz t2,7f # end string 1 ?
6:
add t0,a0,t1 # compute byte address
lbu t2,(t0) # load byte string
beqz t2,7f # zero final ?
add t0,a3,t3 # compute byte address
sb t2,(t0) # store byte string
addi t1,t1,1
addi t3,t3,1
bge t3,a4,99f # error size ?
j 6b # loop
7:
add t0,a3,t3 # compute byte address
sb x0,(t0) # store zero final
mv a0,t3 #return length
j 100f
99:
la a0,szMessErrorSize
call writeString # display message
li a0,-1 # error
100:
lw ra, 0(sp)
addi sp, sp, 4
ret
/***************************************************/
/* display result string length */
/***************************************************/
# a0 contains string e
# a0 return length
displayResult:
addi sp, sp, -4 # reserve stack
sw ra, 0(sp) # save registers @ save registers
la a0,szMessString
call writeString
la a0,sBuffer
call writeString
la a0,szCariageReturn
call writeString
100:
lw ra, 0(sp)
addi sp, sp, 4
ret
/************************************/
/* file include Fonctions */
/***********************************/
/* for this file see risc-v task include a file */
.include "../../includeFunctions.s"