검색어 'XSPIM'에 대한 1 개의 검색 결과

  1. 2010/03/21 [MIPS] MIPS assembler simulator XSPIM by GUNDAM (8)
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을 수행하므로 여기서 유저가 짠 프로그램으로 점프 하고 있습니다.

2010/03/21 20:05 2010/03/21 20:05
GUNDAM 이 작성.

당신의 의견을 작성해 주세요.

  1. Comment RSS : http://newtypeunion.com/rss/comment/175
  2. 박찬오 2010/03/23 23:32  편집/삭제  댓글 작성  댓글 주소

    이거 기억납니다. mmu랑 cash 동작을 관찰 해보려고
    다운 받았는데 아무리 봐도 없어 저자 한테 물어보니
    그런 것 없이 명령어만 시뮬레이션이 된다고 해서 결국
    arm 시뮬레이터로 리눅스 돌려보고 끝났습니다..-.- 엉뚱한 결말

  3. GUNDAM 2010/03/23 23:59  편집/삭제  댓글 작성  댓글 주소

    잘 다녀오셨는가 ?
    안그래도 연락없길래..
    무슨 일 있나 궁굼했는데
    건강하게 다녀왔으면 회사에 한번 놀러와

  4. dike 2010/03/30 01:25  편집/삭제  댓글 작성  댓글 주소

    안녕하세요, 건담님.
    건담님 포스팅을 보고 mips cross compiler 환경을 맥에서 구성하여서
    현재 공부를 하고있는 학생입니다..^^

    물어볼게 있어서 염치불구하고 이렇게 질문드립니다.

    제가 gcc 3.4.4 에 toolchain 잘 구성하고 mipsel-unknown-linux-gcc -S test.c
    이런식으로 컴파일을 하면 잘 되고, 인스트럭션들도 .s 안에 잘 생성되는듯 싶습니다.

    그런데 제가 배우는 책과 인스트럭션이 상이한부분이 많아서요,

    NOT 을 원래 0과 nor 하여 수행하는데 제 SPIM 에서는 xor 랑 비교한 후 다른 작업을하고..
    i(n>1) 과 같은 것도 slt->beq 를 거치지 않고 바로 bgtz 로 가버리네요..

    제 요지는 현재 컴파일러가 만들어주는 인스트럭션들은 MIPS 용 인스트럭션은 맞지만
    버젼이 다르거나.. 하는 문제가 있다는 겁니다. (제가 배우는 책하구요.)

    제 책은 대학교재로 쓰이고있어서 가능하면 이수준으로 맞추고 싶은데 혹시 여기에 대해서 조언해주실수 있나요..? :)

    기다리겠습니다 . 감사합니다.

    • GUNDAM 2010/03/30 09:04  편집/삭제  댓글 주소

      질문하신 요지는 현재 배우시는 책하고 , 컴파일러에 의해서 생성되는 어셈블러하고 틀리는 문제여서, 이를 맞추고 싶으시다는 의미로 이해가 됩니다.

      현재 배우시는 책이 어떤것인지 잘 모르겠습니다만,

      컴파일러를 가지고 아키텍쳐를 바꾸어가며, 테스트를 해보니 모두 0과 NOR를 해버리고 있습니다.

      이 경우에 해당되는 지는 모르겠으나, 일반적인 경우에도 Compiler의 지속적인 성능 개선으로 인해 컴파일러의 버전이 틀려지면, 같은 C 코드를 넣어도 틀린 어셈블러가 생성이 되는 경우가 있습니다. 따라서 교재가 쓰여진 시점의 Compiler를 구하신다면 같은 어셈블러를 생성할 가능성이 있을 것 같지만, 통상 교재는 몇년 전의 버전이므로, 지금의 컴파일러로는 같은 코드가 나오기 힘들다고 생각됩니다.

      문의하신 내용을 보면 어느정도 어셈블러를 이해하고 계신듯 한데 그러면 필요에 따라서 어셈블러로 직접 코딩하는 것이 한 방법일 듯 합니다.

      도움이 안되는 답변을 드립니다.

  5. dike 2010/03/30 09:57  편집/삭제  댓글 작성  댓글 주소

    앗, GUNDAM 님, 답변감사합니다.

    건담님GCC 에서는 0 과 NOR 를 한다는 말씀이신가요?

    제 컴파일러는 현재 !a 과 같은 라인을 컴파일할 때
    xori $2,$2,0x0
    sltu $2,$2,1
    이렇게 컴파일을 하고있습니다.

    컴파일커맨드는 mipsel-unknwon-linux-gnu-gcc -S file.c
    이런식으로 하고 있는데요,

    제가 무엇을 잘못해서 저렇게 어셈블러가 나오는 것일까요? ^^;
    건담님 컴파일러처럼만 컴파일 되면 됩니다 ..ㅎㅎ

    • GUNDAM 2010/03/30 12:20  편집/삭제  댓글 주소

      제가 질문을 잘못 이해 했는것 같습니다.

      ~a와 !a는 당연히 틀립니다.
      ~a는 logical not을 의미하고

      !a는 relational not을 의미합니다.

      즉 전자는 논리연산할 때에 NOT이 되고
      후자는 관계연산을 의미하는 NOT입니다.

      전자로 할 경우에는 원하시는 대로 0과 nor을 하게 되고
      후자로 할 경우에는 작성하신 코드대로 sltu를 하게 됩니다.

      if ( a < 0 ) 과 같은 의미가 되겠네요

      int foo( int a )
      {
      return ~a;
      }

      int foo2( int a )
      {
      return !a;
      }

      를 넣고 컴파일 해보시면 아래와 같이 나옵니다.

      .file 1 "test2.c"
      .section .mdebug.abi32
      .previous
      .gnu_attribute 4, 1
      .text
      .align 2
      .globl foo
      .set nomips16
      .ent foo
      .type foo, @function
      foo:
      .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
      .mask 0x00000000,0
      .fmask 0x00000000,0
      .set noreorder
      .set nomacro

      j $31
      nor $2,$0,$4

      .set macro
      .set reorder
      .end foo
      .size foo, .-foo
      .align 2
      .globl foo2
      .set nomips16
      .ent foo2
      .type foo2, @function
      foo2:
      .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
      .mask 0x00000000,0
      .fmask 0x00000000,0
      .set noreorder
      .set nomacro

      j $31
      sltu $2,$4,1

      .set macro
      .set reorder
      .end foo2
      .size foo2, .-foo2
      .ident "GCC: (GNU) 4.4.2"

      과 같습니다.

      당연한 이야기이지만 컴파일 하실떄 -O2로 하시는거죠 ?

  6. dike 2010/03/30 20:30  편집/삭제  댓글 작성  댓글 주소

    아!!!! 그렇군요!! 잘나옵니다!
    제가 이번에 막 공부를 하는 입장이라서요, ㅎㅎㅎ
    크 정말정말 감사합니다 더욱 열심히 공부할 마음이 생기네요. ㅎㅎㅎ

    아 그런데 제가 그냥 optimazition option 안주고 컴파일하는데요,

    -O2 옵션을 주니까 제가 공부한 부분을 넘어서는 것들이 나오는거같아요
    lw $25,%call16(fact)($28) 이런거같은..

    그냥하면 문제가 있나요? ㅠ ㅎㅎ

    • GUNDAM 2010/03/31 09:36  편집/삭제  댓글 주소

      -O2를 주고 안주고의 문제는 개인 취향의 문제이지만, Assembler와 C코드의 문맥상 흐름을 일치시킬려면 가능하면 주는 게 좋습니다.
      안그러면 같은 작업이지만 메모리로 데이터를 카피하고 또 올리고 (바느질 한다고 표현하기도 합니다.) 하는 작업을 하기 때문에, 문맥 흐름을 파악하는데 곤란한 경우가 많습니다. 어셈블러 한두 줄이면 될 코드를 열 몇줄동안 준비하고 반복한다고 생각하시면 됩니다.

      Assembler의 문법 문제는 한 두번 공부 하시면 해결 될 문제여서,
      Assembler와 C간의 상관 관계를 파악하는데에는 -O2를 주시고 하시는게 좋습니다.

[로그인][오픈아이디란?]