저는 Nick Blundell의 Scratch에서 제공하는 Writing a Simple Operating System 책을 따르고 있습니다. 21 페이지의 작업을 수행하려고합니다. 초기화 된 데이터가 bin 파일에서 어떻게 작동하는지 테스트하는 간단한 프로그램을 작성했습니다. 프로그램은 다음과 같습니다.
hello.asm
section .data
test: db 'A'
section .text
mov ah,0x0e
mov al,[test]
int 0x10
jmp $
times 510-($-$$) db 0
dw 0xaa55
그런 다음 컴파일하려면 다음을 수행하십시오.
nasm hello.asm -f bin -o hello.bin
실행하려면 :
qemu-system-i386 hello.bin
문제는 예상되는 출력이 문자 'A'이지만 내가 얻은 것은 문자 'S'입니다.
출력 :
라벨 test
이 제대로 작동하지 않는 것 같지만 이유를 모르겠습니다.
사용하는 경우 NASM을 과 -f bin
옵션의 .text
섹션은 이전의 평면 이진 파일에 나타납니다 .data
섹션. 이 때문에 코드를 컴파일하면 처음 512 바이트에 코드 ( .text
) 세그먼트 가 포함 되고 데이터는 처음 512 바이트 뒤에 나타납니다. 이와 같은 부트 로더에서 사용할 때 처음 512 바이트의 데이터를 원합니다. 함께 -f bin
할 수있는 가장 좋은 방법 및 부트 로더 제거입니다 .data
섹션과 코드 뒤에하지만 부트 로더 서명하기 전에 데이터를 배치합니다.
ORG 지시문을 사용하여 원점도 설정해야 합니다. 부트 로더는 물리적 주소 0x07c00
또는 0x0000 : 0x7c00의 CS : IP (또는 기타 동등한 세그먼트 오프셋 쌍 ) 에서 메모리에로드됩니다 . 가장 간단한 방법은 org 0x7c00
코드 상단에서 사용 하는 것입니다. 이렇게하면 0x7c00에 상대적인 오프셋과 레이블이 생성됩니다. 기본 NASM은 사용하는 -f bin
옵션은 0000의 원점을 사용하는 것입니다.
당신이 사용하는 경우 org 0x7c00
당신은 사용해야합니다 DS 제대로 메모리에있는 데이터에 액세스 할 수 제로의 세그먼트 레지스터 값을.
코드는 다음과 같을 수 있습니다.
org 0x7c00
section .text
xor ax,ax
mov ds,ax ; DS = AX = 0
mov ah,0x0e
mov al,[test]
int 0x10
jmp $
test: db 'A'
times 510-($-$$) db 0
dw 0xaa55
일반적으로 스택도 설정하는 것이 좋습니다. 유용 할 수있는 몇 가지 일반적인 부트 로더 팁 과 함께 Stackoverflow 답변 이 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다