Chào mọi người,
Mình đang học môn kiến trúc máy tính trong kỳ học này và có được giao một bài tập như sau:
Write a program replacing all non-ASCII characters in a valid C source file with C-language
hexadecimal escape sequences. The program should be capable of producing valid C source from a C program containing non-ASCII characters embedded in strings and character constants.
All the text processing programs with file i/o should define getc and putc functions for single-character i/o, providing proper buffering of input and input operations with at least 512-byte buffers.
Theo mình hiểu được thì yêu cầu của bài sẽ là duyệt file C và thay thế các từ không thuộc bảng mã ASCII (code >127) sang dạng escape sequance là \x??
với ?? tương ứng với character code trong hệ 16.
Mình đã thực hiện được input filename từ bàn phím và đọc nội dung file vào buffer.
Mình muốn hỏi cách để tìm được ký tự nào có code > 127 trong MIPS và làm thế nào để replace được sang dạng hexadecimal escape sequences. Mà không dùng quá nhiều lệnh rẽ nhánh (If) trong chương trình.
Phía dưới đây là code của mình,
Rất cảm ơn nếu ai đó giúp được, bởi đây là một môn học rất khó đối với mình
.data
message: .asciiz "Please input file name \n"
userInput: .space 256
fileWords: .space 1024
.text
.globl main
main:
#ask user for input
li $v0, 4
la $a0, message
syscall
#read user data/input from keyboard
li $v0, 8
la $a0, userInput
li $a1, 256
syscall
nameClean:
li $t0, 0 #loop counter
li $t1, 256 #loop end
clean:
beq $t0, $t1, L5
lb $t3, userInput($t0)
bne $t3, 0x0a, L6
sb $zero, userInput($t0)
L6:
addi $t0, $t0, 1
j clean
L5:
#HOW TO READ INTO A FILE
li $v0,13 # open_file syscall code = 13
la $a0, userInput # get the file name
li $a1,0 # file flag = read (0)
syscall
move $s0,$v0 # save the file descriptor. $s0 = file
#read the file
li $v0, 14 # read_file syscall code = 14
move $a0,$s0 # file descriptor
la $a1,fileWords # The buffer that holds the string of the WHOLE file
la $a2,1024 # hardcoded buffer length
syscall
# print whats in the file
li $v0, 4 # read_string syscall code = 4
la $a0,fileWords
syscall
#Close the file
li $v0, 16 # close_file syscall code
move $a0,$s0 # file descriptor to close
syscall