2016-10-20 8 views
1
.data 
fnf: .ascii "The file was not found: " 
###important: UPDATE THIS PATH TO WHERE YOU SAVED THE TEXT FILE 
#asciiz directive creates null-terminated string 
file: .asciiz "C:/Users/mmono/OneDrive/Documents/input.txt" 
pstring:.asciiz " characters.\nFile contents:" 
buffer: .space 1024  
    .text 

# These lines opens and reads the file containing text to be modified 
main: 
    li $v0, 13  # System call to open file, $v0 set to file descriptor 
       # $v0 negative if failed to open file 
    la $a0, file # Load file to read, $a0 set to address of string 
       # containing file name 
    li $a1, 0  # Set read-only flag 
    li $a2, 0  # Set mode 
    syscall 
    add $s0, $v0, $zero # Save file descriptor in $v0 to new register $s0 
       # because $v0 will be used in other system calls 
    blt $v0, 0, err # Go to handler if failed to open file 

# These lines read text from file 
read: 
    li $v0, 14  # System call to read file 
    add $a0, $s0, $zero # Load file descriptor to $a0 
    la $a1, buffer # Set $a1 to address of input buffer where 
       # text will be loaded to 
    li $a2, 1024 # Set $a2 to number of characters to read 
    syscall 
    #after read, $v0 will have number of bytes read 
    #set last byte to null 
    la $a0, buffer 
    add $a0, $a0, $v0 #address of byte after file data 
    sb $zero, 0($a0) 

#initialize some registers 
init: 
    li $t0, 0  # $t0 will be message character iterator i 
       # initialize i=0 
    add $s1, $a1, $zero # save address start of buffer 

#loop to count characters, exclude white spaces and 
loop: 
    add $s2, $s1, $t0 # $s2 <= A + i, address of current character 
       # A: address start of buffer 
    lb $s3, 0($s2) # load char in message[i] to $s3 
    beq $s3, $zero, print #null, reached end of buffer 
    addi $t0, $t0, 1 #i++ 
    j loop  #continue counting 

# Print Data to console 
print: 
    li $v0, 1  # System call to print integer 
    add $a0, $t0, $zero # Load to $a0 integer to print 
    syscall 
    #print "File contents:" 
    li $v0, 4  # System call to print string 
    la $a0, pstring # Load to $a0 string to print 
    syscall 
    #print actual file contents 
    li $v0, 4  # System call to print string 
    la $a0, buffer # Load to $a0 string to print 
    syscall 

# Close File 
close: 
    li $v0, 16  # Close File Syscall 
    add $a0, $s0, $zero # Load File Descriptor 
    syscall 
    j done  # Goto done 

# Error 
err: 
    li $v0, 4  # System call to print string 
    la $a0, fnf # Load Error String 
    syscall 

# Done 
done: 
    li $v0, 10  # Exit Syscall 
    syscall 

이이 프로그램이 읽고있는 파일입니다에 적절한 자본을 가지고 있습니다. 그것은 input.txt라고합니다.는 어셈블리 코드

이것은 매우 유익하지만 더 많은 사진이 있으면 좋겠다. WOW !!!!!!!!!!! 너무 멋지다! 문제를 확장 한 후속 기사를 작성해야한다고 생각합니다. 우리는 당신처럼 더 통찰력있는 의견을 필요로합니다. 대단하다! 다른 사람에게 쓰기!


이 프로그램은 기간 후 첫 번째 문자는 개행 (줄 바꿈), 느낌표 또는 물음표가 대문자되도록 .txt 파일을 편집하고, 모든 원치 않는 총액을 제거해야합니다.

ASCII 코드를 변경하고 xor 비트를 사용하여 ASCII 문자를 변경 한 다음 문자로 변환한다고 가정합니다. 이것은 10 진수의 비트 열 "00100000"32가 대문자를 변경하기 위해 논리 연산자 "XOR"와 함께 사용될 수 있기 때문입니다.

의 대문자 "A"에 대한 8 비트 ASCII 표현은 01000001입니다. 이것을 0010000과 XOR하면이 소문자 "a"에 대한 ASCII 코드 인 01100001이 생성됩니다.

그러나이 작업은 문자에서만 수행 할 수 있으며 모든 특수 문자는 그대로 유지됩니다.

그래서 나는 다음과 같은 몇 가지 코드를 사용할 필요가 있다고 생각 : xori $ S3, $ s3,32

하지만 내 프로그램에서이를 구현하는 방법을 잘하지 않습니다. 도와 주셔서 감사합니다.

답변

0

swap_case이라는 두 가지 기능과 end_of_sentence이라는 두 가지 기능이 필요합니다.

이게 무슨 도움이됩니까? 파일에서 읽은 모든 문자에 대해 end_of_sentence으로 전화해야합니다. 이 작업은 ".", "?", "!", "\ n"중 하나 인 문자에 따라 1 또는 0을 반환하는 것입니다.

다른 함수는 단순히 문자를 가져와 대/소문자를 다른 대소 문자로 변환합니다. 이것을 사용하는 방법은 문자가 올바른 대소 문자가 아닌 경우에만 호출된다는 것입니다.

난 당신이 두 번째 기능을 구현하는 방법을 결정할 수 있습니다 첫 번째 함수

end_of_sentence: 
    li $v0, 1 
    beq $a0, '.', eos_ret 
    beq $a0, '?', eos_ret 
    beq $a0, '\n', eos_ret 
    beq $a0, '!', eos_ret 
    li $v0, 0  
    eos_ret: jr $ra 

시작됩니다. 다양한 방법이 있습니다.

나는 한 번 더 유용한 일이

isalpha: 
    li $v0, 0 
    blt $a0, 65, isalpha_ret 
    bgt $a0, 122, isalpha_ret 
    li $v0, 1 
    bge $a0, 97, isalpha_ret 
    ble $a0, 90, isalpha_ret 
    li $v0, 0 
    isalpha_ret: jr $ra 
생각