Asaf
Asaf

Reputation: 129

Printing a value entered by user using syscall 3 and syscall 5 EduMIPS64

I trying to read an input from user and print it. In the beginning, I print a request to the user, the user enter a value and I want to print it.

                            .data                           
params_sys5:                .space      8
params_sys3:                .space      8

prompt_msg_LBound:          .asciiz     "Enter lower bound for x,y\n"
prompt_msg_LBound_val:      .asciiz     "Lower bound for x,y = %d\n"
xyL:                        .word64     0
prompt_msg_UBound:          .asciiz     "Enter upper bound for x,y\n"
prompt_msg_UBound_val:      .asciiz     "Upper bound for x,y = %d\n"
xyU:                        .word64     0
prompt_msg_UBoundZ:         .asciiz     "Enter upper bound for z\n"
prompt_msg_UBoundZ_val:     .asciiz     "Lower bound for z = %d\n"
zU:                         .word64     0

prompt_msgAns:              .asciiz     "x = %d, y = %d, z = %d\n"
                            .word64     0
                            .word64     0
                            .word64     0

xyL_Len:                    .word64     0
xyU_Len:                    .word64     0
zU_Len:                     .word64     0

xyL_text:                   .space      32  
xyU_text:                   .space      32  
zU_text:                    .space      32

ZeroCode:                   .word64     0x30    ;Ascii '0'

                            .text
main:                       daddi       r4, r0, prompt_msg_LBound
                            jal         print_string

                            daddi       r8, r0, xyL_text    ;r8 = xyL_text
                            daddi       r14, r0, params_sys3 
                            daddi       r9, r0, 32  
                            jal         read_keyboard_input
                            sd          r1, xyL_Len(r0) ;save first number length

                            ld          r10, xyL_Len(r0)    ;n = r10 = length of xyL_text
                            daddi       r17, r0, xyL_text
                            jal         convert_string_to_integer   ;r17 = &source string,r10 = string length,returns computed number in r11

                            sd          r11, xyL(r0)
                            daddi       r4, r0, prompt_msg_LBound_val
                            jal         print_string                            

end:                        syscall     0

print_string:               sw          $a0, params_sys5(r0) 
                            daddi       r14, r0, params_sys5
                            syscall     5
                            jr          r31


read_keyboard_input:        sd          r0, 0(r14)  ;read from keyboard
                            sd          r8, 8(r14)  ;destination address
                            sd          r9, 16(r14) ;destination size
                            syscall     3
                            jr          r31

convert_string_to_integer:  daddi       r13, r0, 1  ;r13 = constant 1
                            daddi       r20, r0, 10 ;r20 = constant 10
                            movz        r11, r0, r0 ;x1 = r11 = 0
                            ld          r19, ZeroCode(r0)                               
For1:                       beq         r10, r0, EndFor1    
                            dmultu      r11, r20    ;lo = x * 10
                            mflo        r11 ;x = r11 = lo = r11 * 10
                            movz        r16, r0, r0 ;r16 = 0
                            lbu         r16, 0(r17) ;r16 = text[i]
                            dsub        r16, r16, r19   ;r16 = text[i] - '0'
                            dadd        r11, r11, r16   ;x = x + text[i] - '0'
                            dsub        r10, r10, r13   ;n--
                            dadd        r17, r17, r13   ;i++
                            b           For1
EndFor1:                    jr          r31             

I'm trying to get the first number, the lower bound of x,y. For example, I type the number 5, so in the end the xyL representation is 5 but the printed string is:

Enter lower bound for x,y Lower bound for x,y = 0

How do I print the entered value and after that do same with the next string?

Thanks.

Edit:======================================================================= I changed the .data by adding another data type .space 8 to save the address and now instead of jumping to print_string to print the value, I call syscall 5, for example:

prompt_msg_LBound:          .asciiz     "Enter lower bound for x,y\n"
prompt_msg_LBound_val:      .asciiz     "Lower bound for x,y = %d\n"
LBound_val_addr:            .space      8                       
xyL:                        .space      8

and in the .code section:

                            sd          r11, xyL(r0)                                
                            daddi       r5, r0, prompt_msg_LBound_val
                            sd          r5, LBound_val_addr(r0)                                                             
                            daddi       r14 ,r0, LBound_val_addr
                            syscall 5

But I still want to use the print_string to print the string:prompt_msg_LBound_val with the user entered value.

How can I do that?

Upvotes: 0

Views: 215

Answers (1)

Andrea Spadaccini
Andrea Spadaccini

Reputation: 12651

The print_string sample function in the manual is not meant to be used with placeholders, just with plain strings.

If you add placeholders to the format string, then SYSCALL 5 will keep reading from memory the value of those placeholders. In this case, it just reads and display the value 0, which by accident is what's in memory.

See the printf() example from the manual (slightly updated and annotated) to check how to use placeholders:

                .data
format_str:     .asciiz   "%dth of %s:\n%s version %i.%i.%i is being tested!"
s1:             .asciiz   "February"
s2:             .asciiz   "EduMIPS64"
fs_addr:        .space    4         ; Will store the address of the format string
                .word     10        ; The literal value 10.
s1_addr:        .space    4         ; Will store the address of the string "February"
s2_addr:        .space    4         ; Will store the address of the string "EduMIPS64"
                .word     1         ; The literal value 1.
                .word     2         ; The literal value 2.
                .word     6         ; The literal value 6.
test:
                .code
                daddi     r5, r0, format_str
                sw        r5, fs_addr(r0)
                daddi     r2, r0, s1
                daddi     r3, r0, s2
                sd        r2, s1_addr(r0)
                sd        r3, s2_addr(r0)
                daddi     r14, r0, fs_addr
                syscall   5
                syscall   0

Upvotes: 1

Related Questions