В чем разница между этими двумя сегментами кода сборки? - PullRequest
2 голосов
/ 14 сентября 2011

Я учусь писать загрузчик для машины X86, используя утилиты "as" и "ld", но у меня возникает вопрос.

Файл сборки выглядит следующим образом:

AS=as
LD=ld

.s.o:
        ${AS} -a $< -o $*.o >$*.map

all: final.img

final.img: bootsect
        mv bootsect final.img

bootsect: bootsect.o
        ${LD} --oformat binary -N -e start -Ttext 0x7c00 -o bootsect $<

clean:
    rm -rf *.o *.map *.img

Когда я создаю файл bootsect.s ниже для сборки final.img, проблем нет, и на экране появляется «Hello world»

    .text
    .globl start
    .code16
start:
    jmp code
msg:
    .string "Hello world!\x0"
code:
    movw $0xb800, %ax
    movw %ax, %es #for display buffer address
        movw $0, %ax
    movw %ax, %ds   
    movw $msg, %si
    movw $0, %di
    cld
    movb $0x07, %al
1:
    cmp $0, (%si)
    je 1f
    movsb #DS:(E)SI to ES:(E)DI
    stosb #AL to ES:(E)DI
    jmp 1b
1:      jmp 1b
.org 0x1fe, 0x90
.word 0xaa55

Но если у меня есть небольшое изменение в bootsect.Выше приведено следующее:

    .text
    .globl start
    .code16
msg:
    .string "Hello world!\x0"
start:
    movw $0xb800, %ax
    movw %ax, %es #for display buffer address
    movw $0, %ax
    movw %ax, %ds   
    movw $msg, %si
    movw $0, %di
    cld
    movb $0x07, %al
1:
    cmp $0, (%si)
    je 1f
    movsb #DS:(E)SI to ES:(E)DI
    stosb #AL to ES:(E)DI
    jmp 1b
1:      jmp 1b
.org 0x1fe, 0x90
.word 0xaa55

На экране ничего не выводится.

Я запутался, почему?Не могли бы вы помочь мне?

Спасибо.

1 Ответ

4 голосов
/ 14 сентября 2011

Когда вы выводите двоичный файл, указанная точка входа не имеет никакого значения для запуска программы, так как нет заголовка для его указания. Загрузчик просто запускается с определенным смещением, которое с начальных загрузчиков является началом файл. Когда вы ставите строку как первое в вашей сборке, она также будет первой в вашем выводе, что означает, что процессор будет обрабатывать ее как код и пытаться выполнить ее. Если вам повезет, строка быстро сгенерирует недопустимый код операции, что позволит вам определить, что произошло. Если вам не повезло, строка будет верным кодом, и программа «запустится», но результаты будут не такими, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...