'spim'에 해당되는 글 1건

  1. 2010.03.21 [MIPS] MIPS assembler simulator XSPIM (8)
ASIC SoC2010.03.21 20:05
Computer archiecture 서적의 바이블인 Computer organization and design 에 보면
부록에서 SPIM이라는 MIPS Processor 시뮬레이터에 대한 언급이 나옵니다.

Assembler로 코딩한 것을 테스트 해 볼 수 있는 시뮬레이터입니다.
최신 버전이 8 이고 아래 사이트에 가면 다운로드 할 수 있습니다.


소스 코드로 다운로드할 수 있는데 빌드는 크게 어려운 점이 없으므로 쉽게 할 수 있습니다.

사용자 삽입 이미지

특징은 다른 시뮬레이텨들은 대부분 Binary 파일을 로드해서 사용하도록 되어 있는데 이 XSPIM/SPIM은 assembler파일을 로드해서 사용할 수 있도록 되어 있습니다.  그리고 다양한 OS에 포팅되어 있어서 리눅스는 물론이고 OSX까지 포팅되어 있습니다. MIPS 어셈블러를 테스트 해보고 싶은 분들에게는 좋은 출발점이 될 수 있는 프로그램입니다.

창을 열면 위와 같이 GUI창이 나오는데 마치 DDD를 보는 것 같은 느낌입니다.
용법은 대개 쉬워서 가운데 부분에 있는 버튼들을 잘 두들기면 됩니다.

실행 방법
  xspim assembler_file_name
입니다.

  예를 들어서 tt.endians.s 라는 어셈블러 파일을 실행하고 싶으면 다음과 같이 합니다.

  xspim tt.endians.s

그러면 다음과 같이 창이 나타납니다.
사용자 삽입 이미지
Step 커맨드 버튼을 눌르면 한 스텝씩 진행됩니다.
몇가지 System Function을 지원하는데 그중에 하나가 print문입니다.

tt.endians.s 파일은 아래와 같습니다.

......
        .data
saved_ret_pc:   .word 0         # Holds PC to return from main
m3:     .asciiz "The next few lines should contain exception error messages\n"
m4:     .asciiz "Done with exceptions\n\n"
m5:     .asciiz "Expect an address error exception:\n   "
m6:     .asciiz "Expect two address error exceptions:\n"
        .text
        .globl main
main:
        sw $31 saved_ret_pc

        .data
lb_:    .asciiz "Testing LB\n"
lbd_:   .byte 1, -1, 0, 128
lbd1_:  .word 0x76543210, 0xfedcba98
        .text
        li $v0 4        # syscall 4 (print_str)  <--
        la $a0 lb_
        syscall

        la $2 lbd_
        lb $3 0($2)
        bne $3 1 fail
        lb $3 1($2)
        bne $3 -1 fail
        lb $3 2($2)
        bne $3 0 fail
        lb $3 3($2)
        bne $3 0xffffff80 fail
.......
 
위에서 보는 것 처럼 $v0에 4를 넣고 (print str system call 번호입니다.)
$a0에 해당 스트링의 어드레스를 넣은 뒤에 syscall을 수행하면 위의 그림처럼 메시지가 출력됩니다.

디버깅시에 편한 용법입니다.

디버깅 창의 제일 밑에보면 수행되는 명령어 시퀀스를 하나씩 출력합니다.

SPIM Version 8.0 of January 8, 2010
Copyright 1990-2010, James R. Larus.
All Rights Reserved.
See the file README for a full copyright notice.
Loaded: /usr/local/lib/spim/exceptions.s
[0x00400000] 0x8fa40000  lw $4, 0($29)                   ; 183: lw $a0 0($sp) # argc
[0x00400004] 0x27a50004  addiu $5, $29, 4                ; 184: addiu $a1 $sp 4 # argv
[0x00400008] 0x24a60004  addiu $6, $5, 4                 ; 185: addiu $a2 $a1 4 # envp
[0x0040000c] 0x00041080  sll $2, $4, 2                   ; 186: sll $v0 $a0 2
[0x00400010] 0x00c23021  addu $6, $6, $2                 ; 187: addu $a2 $a2 $v0
[0x00400014] 0x0c100009  jal 0x00400024 [main]           ; 188: jal main <--
[0x00400024] 0x3c011001  lui $1, 4097                    ; 45: sw $31 saved_ret_pc
[0x00400028] 0xac3f0000  sw $31, 0($1)
[0x0040002c] 0x34020004  ori $2, $0, 4                   ; 52: li $v0 4 # syscall 4 (print_str)
[0x00400030] 0x3c011001  lui $1, 4097 [lb_]              ; 53: la $a0 lb_
[0x00400034] 0x342400a2  ori $4, $1, 162 [lb_]
[0x00400038] 0x0000000c  syscall                         ; 54: syscall
[0x0040003c] 0x3c011001  lui $1, 4097 [lbd_]             ; 56: la $2 lbd_
[0x00400040] 0x342200ae  ori $2, $1, 174 [lbd_]
[0x00400044] 0x80430000  lb $3, 0($2)                    ; 57: lb $3 0($2)
[0x00400048] 0x34010001  ori $1, $0, 1                   ; 58: bne $3 1 fail
[0x0040004c] 0x14230243  bne $1, $3, 2316 [fail-0x0040004c]
[0x00400050] 0x80430001  lb $3, 1($2)                    ; 59: lb $3 1($2)
[0x00400054] 0x3c01ffff  lui $1, -1                      ; 60: bne $3 -1 fail


00400014 에서 JAL을 하므로 00400024로 점프합니다. 이것은 main에 해당되는 어드레스입니다.
따라서 System Reset시에는 00400000부터 시작함을 알 수 있습니다.

해당되는 코드는

./CPU/exception.S

파일에 있습니다.  해당 파일을 보면

.......
# Standard startup code.  Invoke the routine "main" with arguments:
#       main(argc, argv, envp)
#
        .text
        .globl __start
__start:
        lw $a0 0($sp)           # argc
        addiu $a1 $sp 4         # argv
        addiu $a2 $a1 4         # envp
        sll $v0 $a0 2
        addu $a2 $a2 $v0
        jal main  <--
        nop

        li $v0 10
        syscall                 # syscall 10 (exit)

        .globl __eoth
__eoth:
.......

으로 되어 있어서 _start부터 리셋 스타트가 시작되고 있음을 알 수 있습니다.
여기서 jal main을 수행하므로 여기서 유저가 짠 프로그램으로 점프 하고 있습니다.

'ASIC SoC' 카테고리의 다른 글

EMACS에 Verilog Mode 설치하고 활용하기  (2) 2010.10.30
사상 최강의 보드  (2) 2010.04.18
[MIPS] MIPS assembler simulator XSPIM  (8) 2010.03.21
HD Quad Display/Processing Engine  (1) 2010.03.12
Sound Effect Processor  (0) 2010.02.01
[SC] Structure  (0) 2010.01.18
Posted by GUNDAM_IM