저는 x86 리얼 모드 프로그래밍을 배우고 있으며, 이것을 테스트하기 위해 QEMU을 사용하여 작은 부트 로더를 작성했습니다. 나는 학습을 위해 GNU 어셈블러를 선택했다. 다음 텍스트가 QEMU 디스플레이에 표시됩니다Int 10H가 QEMU에서 작동하지 않습니다.
#
# boot.s
#
.section .text
.globl start
start:
//setup stack
mov $0x7c0, %ax
mov %ax, %ss
mov $512, %sp
//setup video
mov $0x0, %eax
mov $0x0, %al
int $0x10
//print a character say 'm'
mov $'m', %al
mov $0x0E, %ah
int $0x10
1:
jmp 1b
: 하드 디스크에서
부팅 ...
문제 여기
어셈블리 코드 : 위의 메시지가 인쇄되고, 그 메시지는 계속 표시됩니다. ng.내가 조립하는 데 사용되는 스크립트, 링크는 다음과 같습니다
> to assemble : gcc -c boot.s
> to link : ld -T link.ld boot.o -o b.bin
> to put on bootsector of Hard-disk image
dd if=b.bin of=HD.img conv=notrunc
> to attach boot magic
echo -ne "\x55\xaa" | dd seek=510 bs=1 of=HD.img
> to emulate: qemu-system-i386 HD.img
내가 하나를 자신을 만드는 방법을 알고하지 않았기 때문에, 어디 선가 본 온라인 튜토리얼에서 복사 링커 스크립트 :
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}
추가 인수를 지정해야합니까, 아니면 코드에 실수가 있습니까? 스택의 설정이라고 생각했지만 많은 가능성을 시도했지만 작동하지 않았습니다.
하드 디스크 부팅 메시지가 나타나서 내 부트 로더가 화면에 m
문자를 표시하도록하려면 어떻게해야합니까?
내 작업 플랫폼은 당신의 링커 스크립트는 보호 모드 커널이 0x00100000라는로드 될 수있는 환경을 위해 작성된 것으로 보인다 페도라 23
"작동하지 않음"은 무엇을 의미합니까? 그것은 의미있는 문제 설명이 아닙니다. –