




박찬오 2010/03/23 23:32 편집/삭제 댓글 작성 댓글 주소
이거 기억납니다. mmu랑 cash 동작을 관찰 해보려고
다운 받았는데 아무리 봐도 없어 저자 한테 물어보니
그런 것 없이 명령어만 시뮬레이션이 된다고 해서 결국
arm 시뮬레이터로 리눅스 돌려보고 끝났습니다..-.- 엉뚱한 결말
GUNDAM 2010/03/23 23:59 편집/삭제 댓글 작성 댓글 주소
잘 다녀오셨는가 ?
안그래도 연락없길래..
무슨 일 있나 궁굼했는데
건강하게 다녀왔으면 회사에 한번 놀러와
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를 구하신다면 같은 어셈블러를 생성할 가능성이 있을 것 같지만, 통상 교재는 몇년 전의 버전이므로, 지금의 컴파일러로는 같은 코드가 나오기 힘들다고 생각됩니다.
문의하신 내용을 보면 어느정도 어셈블러를 이해하고 계신듯 한데 그러면 필요에 따라서 어셈블러로 직접 코딩하는 것이 한 방법일 듯 합니다.
도움이 안되는 답변을 드립니다.
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로 하시는거죠 ?
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를 주시고 하시는게 좋습니다.

































당신의 의견을 작성해 주세요.
babyworm 2010/03/31 08:30 편집/삭제 댓글 작성 댓글 주소
전 짧아서 맘에 들더군요
GUNDAM 2010/03/31 09:38 편집/삭제 댓글 주소
음.. 살아 계셨군요
하도 조용하셔서, 최소한 이민가신 줄 알았습니다.
짧은것이 좋죠, 요샌 이 책 추천하며 다닌답니다. ^^