분석을 하다보면 어떤것은 '#'을 쓰고 어떤 곳은 '()'를 사용하고 또 '[]' 이런 것도 사용하여 lilo 소스를 보면서 이해 해봤습니다.
관련 문서를 찾지 못해 순전히 그럴것 같다는 가정입니다.
seg 0x7000 mov ax, #0x07C0 ! ax 레지스터에는 0x07C0이라는 상수 값이 들어간다. mov ax, 0x07C0 ! ax 레지서터에는 0x7000:0x07C0이 가르키는 곳으로 부터 2byte값을 읽어 저장한다. mov ds, ax ! ds 레지스터에 ax레지스터 안에 있는 값을 저장한다. ext_ex: .word 0 mov ext_es, es ! es 레지스터의 값을 0x7000:ext_es가 가르키는 곳에 2byte 저장한다. mov es, ext_ex ! 0x7000:ext_ex가 가르키는 곳으로 부터 2바이트를 읽어 es레지스터에 저장한다. mov es, #ext_ex ! ext_ex의 오프셋 값을 es에 저장한다. mov al, byte ptr (si+4) ! 0x7000:si+4가 가르키는 곳의 1byte 값을 al 레지스터에 넣어라 mov byte ptr (si+4), #18 ! 0x7000:si+4가 가르키는 곳에 18을 저장하여라 break: .byte 0 mov byte ptr break, #0 ! 0을 0x7000:break에 저장하여라 (괄호가 사용되지 않아도 포인팅 연산이 된다.!) mov ax,[0x1c*4] ! ax레지스터에 0x7000:0x1c*4주소에 있는 2byte 의 값을 저장한다. mov [0x1c*4], #break ! break의 오프셋 값을 0x7000:0x1c*4가 가르키는 곳에 2byte 저장한다.
'#'은 다음에 오는 인자를 상수(?)로 바꾼다고 생각하면 될거 같습니다.
'()'는 그냥 괄호의 본래 역확에 충실하여 계산 우선순위를 정하는 거라고 생각됩니다.
'()'는 C언어에서 '*p'역활을 하는거 같습니다.
- mov bx, #break
- mov al, (bx) 를 하게 되면 변수 break의 값이 al에 저장되는 것입니다.
만약
- mov al, bx 를 하게 되면 bx의 값이 al에 저장되겠죠. 즉, break의 주소값이 al에 저장되는 것인데 al 과 bx의 사이즈가 틀려 컴파일 에러가 나겠네요.
- '()'는 AT&A 문법
'[]'는 현재 지정된 세그먼트를 무시하고 0x0000 부터 사용하는 거라고 생각됩니다.
'[]'는 intel 문법으로 AT&T의 '()'와 동일한다.
'byte ptr' or 'work ptr'은 C언어에서 강제 형변환 정도로 예상됩니다.
댓글 2
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] | woos | 2016.04.09 | 2197 |
1485 | First.S, Second.S 분석한 자료 | 도영주 | 2013.08.03 | 1441 |
1484 | kernel 에서 실행 순서 관련 문서 | 도영주 | 2013.08.03 | 1880 |
1483 | 오늘 스터디 시간에 잠깐 찾은 second.S 분석 pdf [1] | 제한재 | 2013.07.27 | 1841 |
1482 | lilo 분석 참고 자료 | 시갈 | 2013.07.27 | 1463 |
» | 헷갈리는 주소, 포인터 연산에 대하여 정리( #, (), [] ) [2] | 시대유감 | 2013.07.20 | 3164 |
1480 | Register 관련 몇 가지 정리. | 도영주 | 2013.07.16 | 3244 |
1479 | 처음 어셈블리 해보시는데 할만하세요? [4] | 백창우 | 2013.07.08 | 1891 |
1478 | SVN 사용법 정리 [2] | 시대유감 | 2013.06.30 | 2135 |
1477 | 회식사진 투척합니다. [5] | 김택훈 | 2013.06.30 | 2291 |
1476 | 7장 소스1 | 시갈 | 2013.06.22 | 1415 |
1475 | 분석 관련 자료 [3] | 백창우 | 2013.06.15 | 1849 |
1474 | 리눅스 커널 분석 환경 [3] | 시대유감 | 2013.06.10 | 2023 |
1473 | 오늘 풀리지 않은 문제 관련 [1] | 이경욱 | 2013.06.02 | 3305 |
1472 | OS 커널의 구조와 원리 실습 방법 [1] | 시갈 | 2013.05.26 | 5696 |
1471 | 제안사항 입니다. [2] | 강정근 | 2013.05.07 | 3193 |
1470 | ELF 파일 포맷 정리 [6] | 도영주 | 2013.05.04 | 11542 |
1469 | TOZ 신청방법 아시는분?! [4] | 강정근 | 2013.04.29 | 2724 |
1468 | 안녕하세요. 빠른진행을 위해 어플로 접근성을 높여보아요^^ [1] | Napoleon | 2013.04.22 | 3583 |
1467 | 교제 및 장소(투표 종료) [14] | 조유준 | 2013.04.22 | 3838 |
1466 | 반갑습니다. 이성미입니다. [1] | 이성미 | 2013.04.22 | 3396 |
.
Memory 참조에 관한 Assembler 문법 링크입니다.
http://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory
문서에 따르면 인텔과 AT&T 의 Syntax 차이가 있는데 저희가 보고있는 소스에는 혼용되어 사용되고 있는 것 같네요.
간단히 정리하면, 아래 두 Syntax 는 동일한 표현입니다.
인텔 - segment :[base reg. + index reg.*scale + disp]
AT&T - segment:disp(base reg., index reg., scale)
각 필드는 생략 가능하며, scale 에는 1, 2, 4, 8 값만 올 수 있습니다.
LILO 의 second.S 에서 본 소스를 인텔 Systax 로 바꿔보면, 이렇게 되지 않을까요??
MAP(si) == [si+MAP]
MAP+2(si) == MAP + [si+2]