JMPL과 JMP의 차이는 무엇인가요?
JUMP 명령어는 Near jump인 jmp와 Far jump인 ljmp가 있는 것으로 알고 있습니다.
"만들면서 배우는 OS 커널의 구조와 원리"
1장에 있는 소스(NASM)를 GAS 형식으로 바꿨습니다.
그래서 리눅스 bootsect.S 파일을 많이 참조했죠.
제가 NASM파일 형식을 GAS형식으로 바꾼 것입니다.
BOOTSEG = 0x07C0 # boot 시작번지
COLOR_VIDEO = 0xB800 # 컬러 비디오램 메모리.code16
.text.globl _start
_start:jmpl $BOOTSEG, $start2 # 0x7C0번지로 점프
start2:
movw %cs, %ax
movw %ax, %dsmovw $COLOR_VIDEO, %ax
movw %ax, %es
movw $0, %di
movw msgBack, %ax # '.' <= 주황색 문자
movw 0x7FF, %cx # Counter# cx 개수 만큼 주황색인 '.' 문자를 화면에 출력한다
paint:
movw %ax, %es:(%di)
addw $2, %di
decw %cx
jnz paint# ABC123을 출력한다
print:
movw $0, %di
movw $0x0641, %es:(%di) # 'A'
addw $2, %di
movw $0x0642, %es:(%di) # 'B'
addw $2, %di
movw $0x0643, %es:(%di) # 'C'
addw $2, %di
movw $0x0631, %es:(%di) # '1'
addw $2, %di
movw $0x0632, %es:(%di) # '2'
addw $2, %di
movw $0x0633, %es:(%di) # '3'loop:
jmp loopmsgBack:
.byte '.',0xE7# MBR Magic code
.org 510
boot_flag:
.word 0xAA55
저기서 ljmp 대신 왜 jmpl을 썼는지 궁금하며 두 개 명령어의 차이점을 알고 싶습니다.
이건 바이너리파일을 objdump 한것입니다.
boot.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start>:
0: 66 ea 08 00 00 00 ljmpw $0x0,$0x8
6: c0 07 8c rolb $0x8c,(%edi)00000008 <start2>: 8: 8c c8 mov %cs,%eax
a: 8e d8 mov %eax,%ds
c: b8 00 b8 8e c0 mov $0xc08eb800,%eax
11: bf 00 00 a1 56 mov $0x56a10000,%edi
16: 00 8b 0e ff 07 26 add %cl,0x2607ff0e(%ebx)0000001b <paint>:
1b: 26 89 05 83 c7 02 49 mov %eax,%es:0x4902c783
22: 75 f7 jne 1b <paint>00000024 <print>:
24: bf 00 00 26 c7 mov $0xc7260000,%edi
29: 05 41 06 83 c7 add $0xc7830641,%eax
2e: 02 26 add (%esi),%ah
30: c7 05 42 06 83 c7 02 movl $0x5c72602,0xc7830642
37: 26 c7 05
3a: 43 inc %ebx
3b: 06 push %es
3c: 83 c7 02 add $0x2,%edi
3f: 26 c7 05 31 06 83 c7 movl $0x5c72602,%es:0xc7830631
46: 02 26 c7 05
4a: 32 06 xor (%esi),%al
4c: 83 c7 02 add $0x2,%edi
4f: 26 c7 05 33 06 eb fe movl $0xe72e,%es:0xfeeb0633
56: 2e e7 00 0000000054 <loop>:
54: eb fe jmp 54 <loop>00000056 <msgBack>:
56: 2e cs
57: e7 00 out %eax,$0x0
...000001fe <boot_flag>:
1fe: 55 push %ebp
1ff: aa stos %al,%es:(%edi)
첨부 | 파일 크기 |
---|---|
![]() | 79.62 KB |
저도 배우는 입장에서 저 코드를 보면..저 코드는 32bit 코드 같
저도 배우는 입장에서 저 코드를 보면..
저 코드는 32bit 코드 같습니다.
66 EA 08 00 00 00 c0 07
8c(32bit mov 명령어??)
66 이 16, 32전환 코드이고 EB 가 jmp 명령어
대충 해석해 보면
66EA 07c0:00000008
jmp(16비트) 07c0:00000008 같습니다.
원래 16비트 jmp는 07c0:0008이 되어야 할것 같습니다만.
그때문이 아닐까 .. 추측해봅니다.^^
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기