[완료] 어셈블리 list파일
글쓴이: jungwook / 작성시간: 수, 2009/09/30 - 3:38오후
안녕하세요.
지금 만들면서 배우는 os 커널을 공부하고 있는 학생입니다.
어셈블리어 파일을 리스트 파일로 만들었는데
여기서 젤 처음 숫자는 줄 번호고요, 그다임이 프로그램 내에서 offset인데,
3번째가 어셈블리어를 어셈블해서 나온 기계어로 알고 있습니다.
그런데 예를 들어 첫 줄 mov ax, cs 기계어로 변환 => 8CC8
이렇게 된거 아닌가요? 그렇다면 ax와 cs가 각각 16bit씩인데, mov에 대한 기계어 부분은 어떻게 된것인지??
좀 알려주세요..
그럼 모두 즐거운 하루 되세요.
4 [org 0] 5 [bits 16] 6 7 start: 8 00000000 8CC8 mov ax, cs 9 00000002 8ED8 mov ds, ax 10 00000004 31C0 xor ax, ax 11 00000006 8ED0 mov ss, ax 12 13 14 00000008 FA cli 15 16 00000009 0F0116[7F00] lgdt[gdtr] 17 18 0000000E 0F20C0 mov eax, cr0 19 00000011 660D01000000 or eax, 0x00000001 20 00000017 0F22C0 mov cr0, eax 21
Forums:
레지스터가
레지스터가 몇천개씩이나 있지는 않을테니 레지스터를 오퍼랜드로 지정하는데 많은 비트가 필요하지는 않겠지요.
MOV 명령 몇 비트 + 오퍼랜드 타입 몇비트 + 오퍼랜드인 레지스터 번호 몇비트 <- 이렇게 해서 16비트가 나왔을 겁니다.
자세한건 op 코드를 설명해 놓은 문서나 책을 찾아보세요.
레지스터 ax 에
레지스터 ax 에 들어가는 데이타가 16 비트라는 뜻입니다. ax 를 표현하는데 16비트가 필요하진 않습니다.
아~ 착각을 했네요.
아~ 착각을 했네요. ㅎ
답변 감사드립니다.^^
즐거운 하루 되세요
해독 해드린다면 0x8c
해독 해드린다면
0x8c = mov 명령
0xc8 = 2진수로 바꾸면 11001000
두번째 0xc8은 Mod R/M이라고 불리는 부분인데 오퍼랜드 조합이 무엇인지 알려주는 역할 합니다.
11 = 레지스터/메모리 조합여부 결정 (보통 11이면 모두 레지스터임)
001 = destination register (CS=0, DS=1, ...) ==>
000 = source register (AX=0, CX=1, DX=2, BX=3, BP=4 ...)
이정도면 충분하므로 뒤는 더 필요 없습니다.
mov 명령의 기계어코드는 0x8c말고도 많습니다. 오퍼랜드에 들어올 수 있는 조합이 하도 많기 때문에 이거 하나가지고는 다 못하죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기