서로다른 OS 에서 어찌 컴파일 되지 않는가.. 에 대한 중간 보고물입니다. 무엇이 틀렸는지 태클걸어주세요;ㅅ;
생각없이 서로다른 OS에서의 차이를 연구하는 과제에 도전했습니다
더구나 어셈블과정을 한번도 배워보지 않은상태에서 하려고 했다가
깊게 들어가면 들어갈수록 보통 난감한게 아니네요-_-;;
처음엔 분명 두개가 참조하는 라이브러리가 틀려서 그럴거다 라고
맹목적으로 생각했는데 가다보니 컴파일러 뒤져봐야 하는경우도 생기고
지금 중간 결과물 나오는 꼴을 보니 이후에는 라이브러리와 시스템콜(?)
까지 뒤져봐야 하는 결과가 나오겠네요...휴-_-
일단은 대충 이런방향으로 가고있습니다 하는 식의 결과물이 나오긴
했는데 이렇게 가는게 맞는가 모르겠습니다. 접근법도 그렇고..
저는 하나도 모른다는것에서 출발한것이니 얘가 왠 헛소릴 하나 하셔도
할말이 없습니다..;ㅅ;
하지만 왠지 맨땅에 헤딩하는 기분으로 들이대다보니 요길 파면
나오겠구나 하는 생각도 쪼금 드네요
우리 교수님 말씀에 보리와 학생은 밟아야 잘큰다 라는 명언을
남기셨습니다-_-(경남 진주 G대 컴과 Y교수님)
인정사정없이 밟아주세요..
ps : 해석이 안되는 부분이 있습니다, 어찌 알아들어야 할까요
Immediate form long jumps and calls are lcall/ljmp $section, $offset in
AT&T syntax; the Intel syntax is call/jmp far section:offset. Also, the
far return instruction is lret $stackadjust
in AT&T syntax; Intel syntax is
ret far stackadjust.
ps2 : 첨부파일이 문제가 있어서 다시 올렸습니다;;
첨부 | 파일 크기 |
---|---|
![]() | 295.35 KB |
영문 해석입니다.
"AT&T 문법으로 immediate long 분기 및 long 호출은 lcall/ljmp $section, $offset이 되며
Intel 문법으로는 call/jmp far section:offset이 된다.
far return 명령은 AT&T 문법으로 lret $stackadjust가 되고 Intel 문법에서 ret far stackadjust가 된다."
입니다.
long 하고 far를 섞어 놓아서 혼동될 수도 있겠는데요 같은말입니다. x86의 분기나 호출 명령은
코드 효율을 위해 near, 일반, far 로 구분해 뒀습니다. (용어는 정확하지 않습니다) 예를 들어 jmp near xxx
라고 하면 8bit offset 만으로 분기를 합니다.일반 점프는 32bit offset으로 분기를 하고far 점프는
selector 값을 포함하여 다른 selector의 영역으로 분기를 합니다. (이건 x86의 메모리 아키텍쳐를 이해하
고 있어야 정확히 이해하실 수 있을 겁니다.) 위에서는 selector 부분을 section이라고 해 뒀군요.
AT&T 문법과 Intel 문법은 어셈블러의 문법 차이 입니다. GNU AS 같은 어셈블러는 AT&T 문법을 쓰고
MASM이나 NASM, TASM 같은 어셈블러는 Intel 문법을 사용합니다. 두개의 가장 큰 차이는 source 와
destination의 위치가 반대로 되어 있다는 차이가 있습니다. (그 외에도 많지만 직접 알아 보시는게
좋을 듯 싶네요)
그럼...
Immediate form long jumps and calls are lcall/ljmp $section, $offset in
AT&T syntax; the Intel syntax is call/jmp far section:offset. Also, the
far return instruction is lret $stackadjust
in AT&T syntax; Intel syntax is
ret far stackadjust.
댓글 달기