2016-06-18 2 views
1

나는 asm에서 프로그램을 코딩하고 있습니다. 조금은 알고 있지만 전문가는 없습니다. 화성 에뮬레이터를 사용하고 있습니다. 필자가 이해하지 못하는 부분은 파일을 만들고 file.vig와 같은 특정 확장자를 갖는 방법입니다. 내가 원하는 것은 파일을 만들고, 내가 원하는 이름을주고 그것에 쓰는 것이다. 지금까지이 중 아무 것도 작동하지 않았습니다. 나는 화성의 실행 시간 동안 프로그램의 나머지 부분을 작동 시키지만,이 파일의 생성과 수정은하지 않습니다.어셈블리 MIPS - 특정 확장명의 파일 만들기

파일 이름 포인트 문자열 등에 문자열에

고해상도 포인트 : file.vig

li $v0, 13  # system call for open file 
la $a0, FileName # output file name 
li $a1, 577  # Open for writing (flags are 0: read, 1: write) 
li $a2, 0x1ff  # was recommended for file permissions 
syscall    # open a file (file descriptor returned in $v0) 
move $s6, $v0  # save the file descriptor 

# 쓰기는 당신이 반환을 확인하지 않았다

li $v0, 15  # system call for write to file 
move $a0, $s6  # file descriptor 
la $a1, res  # address of buffer from which to write 
li $a2, 15  # hardcoded buffer length 
syscall 
move $a0, $s6 
li $v0, 16   # close 
syscall 
li $v0, 10 
syscall 

답변

1

을 열어 파일에 귀하의 open 시스템 호출의 값입니다. $a1을 577로로드하고 이 아니고이 아니므로 1을 반환했습니다. [libc과 비슷하지 않으며이 값에 대해 까다롭기 때문입니다.] 여기

은 [무상 스타일의 정리를 용서하십시오] 약간 올바른 옵션으로 오픈이 데모를 다시 시도하도록 조정 프로그램,이다 :

.data 
FileName: .asciiz "file.vig" 
bad_msg: .asciiz "open syscall failed\n" 
ok_msg:  .asciiz "open was okay\n" 
res:  .byte 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 

    .text 
    .globl main 
main: 
    li  $a1,577     # Open for writing (flags are 0: read, 1: write) 
    li  $a2,0x1ff    # was recommended for file permissions 

main_retry: 
    li  $v0,13     # system call for open file 
    la  $a0,FileName   # output file name 

    syscall       # open a file (descriptor returned in $v0) 
    move $s6,$v0     # save the file descriptor 
    bltz $s6,main_fail   # did open fail? fly if yes 

    la  $a0,ok_msg 
    li  $v0,4 
    syscall 

    # Write to file just opened 
    li  $v0,15     # system call for write to file 
    move $a0,$s6     # file descriptor 
    la  $a1,res     # address of buffer from which to write 
    li  $a2,15     # hardcoded buffer length 
    syscall 

    move $a0,$s6 
    li  $v0,16     # close 
    syscall 

main_exit: 
    li  $v0,10 
    syscall 

main_fail: 
    la  $a0,bad_msg 
    li  $v0,4 
    syscall 

    li  $a1,1     # correct write mode (O_WRONLY) 
    li  $a2,0     # file permissions are ignored by mars 
    j  main_retry