Не пойму, что надо линкеру
ENTRY(start)
SECTIONS
{
.text :
{
*(.text)
}
}
На выходе говорит вот что:
Объектник сгенерирован gcc. На вход подан параметром. Что хочет эта %нь - непонятно. Что делать и кто виноват?
Note: работаю под виндой
ENTRY(start)
SECTIONS
{
.text :
{
*(.text)
}
}
На выходе говорит вот что:
Объектник сгенерирован gcc. На вход подан параметром. Что хочет эта %нь - непонятно. Что делать и кто виноват?
Note: работаю под виндой
Таки, а где комманд лайн сборки данной вундервафли и ее объектникафф?
PS: Лечу баги по фотографии. Дорого.
Компиляция:
Линковка:
rootboot.s - это недоделанный файл, чисто для проверки, ассемблируется без приколов. Но если вам интересно - вот:
// ROOTBOOT.S
// BOOT FILE MUST BE PLACED AT 0th SECTOR OF BOOT DEVICE
//
start:
jmp main
nop
readSector:
// IN:
// DX - SECTOR NUMBER
// SI - BUFFER ADRESS
pusha
movw %dx, %ax
movw $0x12, %cx
movw %si, %bx
xor %dx, %dx
div %cx
mov %al, %ch
shrb $1, %ch
movb %dl, %cl
incw %cx
movb %al, %dh
andb $1, %dh
movb $1, %dh
movw $0x201, %ax
xorb %dl, %dl
int $0x13
jnc readSectorExit
readSectorExit:
popa
ret
printMessage:
printMessageExit:
ret
main:
mainExit:
jmp mainExit
Написан мной, только с одной "купюрой" - функцией чтения сектора дискеты.
Блин, я становлюсь предсказуемым... Не помогло.
Точно - раздел Общалка:) тема Анекдоты про программистов...
Хирург (старожил): А-а-а-а!! Один глаз не работает, умора! (*ржет*)
Скальпель (старожил): Блин, ламеры достали!
Админ (администратор): Новичок, читайте правила форума, пользуйтесь поиском. Первое предупреждение.
Доктор_Лектор (завсегдатай): Да ладно вам, помогите ему. Не видите - у человека горе.
Гость1: Новичок, а чего ты хочешь-то? Формулируй вопрос правильно.
Новичок: Гость1, я хочу чтобы оба галза видели. Можешь подсказать как это сделать?
Гость1: А-а-а, чтобы оба видели - не знаю тогда. Я по иглоукалыванию специализируюсь.
Новичок: Админ, я пользовался поиском, но ничего не нашел.
Помогите кто-нибудь, пациент на столе лежит, я ему уже легкое вскрыл - не помогает!!
Хирург (старожил): А-а-а!! Легкое вскрыл, я щас уссусь! (*ржет покатом*)
Гость2: Новичок, глазной нерв проверял?
Медбрат (опытный): Новичек, какой глаз не работает - левый или правый?
Админ (администратор): В правилах форума написано, что здесь запрещено задавать вопросы про симметричные органы. Кроме того, по каким словам ты искал? По слову "глаз"? А надо было - по "бинокуларус окулярус". Вот - [набор ссылок] почитай про то, как надо пользоваться поиском на форумах.
Новичок: Гость2, а где искать глазной нерв? Поменял глаза местами, теперь оба не работают (( Срочно - что делать, скоро наркоз заканчивается.
Гость3: А пациент какой расы - негроид или монголоид?
Скальпель (старожил): Гость3, а какая разница?
Гость3: Ты хочешь сказать, что между негроидом и монголоидом нет разницы? Еще Новичка ламером называл =)
Доктор_Лектор (завсегдатай): Между негроидом и монголоидом есть разница, факт.
Новичок: Как узнать расу?
Скальпель (старожил): Спросить у пациента
Новичок: Пациент без сознания. Может в паспорте записано?
Скальпель (старожил): Гость3, разница есть, но какая разница в конкретном нашем случае??
Гость3: Скальпель, очевидная. У негроидов глаза большие и навыкате, а у монголоидов щелки глаз узкие - может у пациента просто глазные щели заужены, их надрезать надо.
Новичок: Спасибо, Гость3! Надрезал веки - легче стало вынимать глазные яблоки. Переставил еще раз, не рабоатают
ПС: на всякий случай надрезал ноздри и анус.
Новичок: Эй, есть кто-нибудь?
Новичок: Что делать-то?
Новичок: Все, тема закрыта, я его к окулисту направил.
Скальпель (старожил):НОВИЧЕК, А ТЫ ЧТО - НЕ ОКУЛИСТ??? =8-0
Новичок: Неа. Гинеколог.
Админ (администратор): Новичек, второе предупреждение.
Читай правила. Здесь форум окулистов. Еще одно предупреждение и - бан.
Хирург (старожил): А-а-а-а!! Гинеколог!! Все, сливайте воду, я уссался! (*ржет*)
Но все равно - попробовал - не пашет...
objcopy rootboot.o rootboot.bin -O binary
На выходе rootboot.bin - попробовал, пашет (покрайней мере почти как никсовый, разница в выравнивании и никсовый добавл в конец бинарника GNU чётотам:))
%si - адрес моей строки
И все-таки, что делать? Неправильно читает переменные...
Повторяю просьбу: мне надо перенастроить адреса в бинарнике без лд, которое, к сожалению, глючит.
Код? Минуточку... UPOS - это имя моей системы, а UPFS - ее фс. Вот асм:
// ROOTBOOT.S
// BOOT FILE MUST BE PLACED AT 0th SECTOR OF BOOT DEVICE
//
.code16
start:
jmp main
nop
// DATA FOR IDENTIFICATION
UPFS_ident: .ascii "U P F S DISK FS\0"
blockSizeInSectors: .word 1
firstSpecialBlock: .word 1
readSector:
// IN:
// DX - SECTOR NUMBER
// SI - BUFFER ADRESS
pusha
movw %dx, %ax
movw $0x12, %cx
movw %si, %bx
xor %dx, %dx
div %cx
mov %al, %ch
shrb $1, %ch
movb %dl, %cl
incw %cx
movb %al, %dh
andb $1, %dh
movb $1, %dh
movw $0x201, %ax
xorb %dl, %dl
int $0x13
jnc readSectorExit
readSectorExit:
popa
ret
printMessage:
// SI - MESSAGE
lodsb
testb %al, %al
jz printMessageExit
movb $0x0E, %ah
movb $0x07, %bl
int $0x10
jmp printMessage
printMessageExit:
ret
main:
xorw %ax, %ax
movw %ax, %ss
movw %ax, %es
movw %ax, %ds
movw $0x7C00, %sp
movw %sp, %bp
movw $msgStarting, %si
addw $0x7C00, %si
call printMessage
mainExit:
jmp mainExit
// DATA FOR ROOTBOOT
msgStarting: .ascii "UPOS booter starting...\0"
Переменные, о которых я говорил - это типа firstSpecialBlock. В данной версии кода не упоминается обращение к ним, но я проверял - выдает чепуху, хотя по дефолту - единица.
Сегмент - можно попробовать. А org (origin) делается, как вы знаете, в вязалке, которая у меня не пашет.
ПС. Я НЕ настаиваю, просто, может у кого-то есть исходник работающей версии лд. Поделитесь, я перекомпилю под виндой и проблем не будет. Ну если кому не жаль, конечно...
// ROOTBOOT.S
// BOOT FILE MUST BE PLACED AT 0th SECTOR OF BOOT DEVICE
//
.code16
start:
jmp main
nop
// DATA FOR IDENTIFICATION
.data
UPFS_ident: .ascii "U P F S DISK FS\0"
blockSizeInSectors: .word 1
firstSpecialBlock: .word 1
.text
readSector:
// IN:
// DX - SECTOR NUMBER
// SI - BUFFER ADRESS
pusha
movw %dx, %ax
movw $0x12, %cx
movw %si, %bx
xor %dx, %dx
div %cx
mov %al, %ch
shrb $1, %ch
movb %dl, %cl
incw %cx
movb %al, %dh
andb $1, %dh
movb $1, %dh
movw $0x201, %ax
xorb %dl, %dl
int $0x13
jnc readSectorExit
readSectorExit:
popa
ret
printMessage:
// SI - MESSAGE
lodsb
testb %al, %al
jz printMessageExit
movb $0x0E, %ah
movb $0x07, %bl
int $0x10
jmp printMessage
printMessageExit:
ret
main:
xorw %ax, %ax
movw %ax, %ss
movw %ax, %es
movw $0x7C0, %bx
movw %bx, %ds
movw $0x7C00, %sp
movw %sp, %bp
movw $msgStarting, %si
//addw $0x7C00, %si
call printMessage
mainExit:
jmp mainExit
// DATA FOR ROOTBOOT
.data
msgStarting: .ascii "UPOS booter starting...\0"
То ли здесь ошибка, то ли сегменты не работают. В сегмент записывал не 0x7C00, а 0x7C0, потому что адрес в сегменте = база*0х10+смещение. Так же?
Поумолчанию данные читаются менно с сегмента DS + смещение, если не сказано иначе. Зааттачьте скомпыленнный бинарник сектора.
PS: А также раз уж пишите бут сектор добавьте в конце AA55 или как его там, иначе биосу такое творчество может и не понравиться.
добавьте в конце AA55 или как его там
[/quote]
Да по смещению 510 от начала сектора, да и сектор должен быть кратен 512 байтам желательно :)
Вобщем из скрипта линкера убираем OUTPUT_FORMAT("binary") икомпилим бинарник в 3 комманды:
ld -o rootboot.hz rootboot.o -T rootboot.ld
objcopy rootboot.hz rootboot.bin -O binary
PS: А также раз уж пишите бут сектор добавьте в конце AA55 или как его там, иначе биосу такое творчество может и не понравиться.
Ramon, вы меня, походу, вообще идиотом считаете... Эти два священных байта я ставил с самого начала, правда, не через ассемблер, а через махонькую самодельную программку, которая делала файл образа с моей фс на нем. Кстати, выход я нашел. Сейчас покажу:
main:
movw %cs, %ax
cmpw $0, %ax
jne mainContinue
movw $msgRecalling, %si
addw $0x7C00, %si
call printMessage
call $0x7C0, $0
mainContinue:
movw %cs, %ax
movw %ax, %ss
movw %ax, %es
movw %ax, %ds
movw $0, %sp
movw %sp, %bp
movw $msgStarting, %si
call printMessage
...
То есть, я перезапускаю свой же код, просто не по адресу $0000:7C00, а по $07C0:0000, и все данные автоматом читаются с нужным сдвигом.
А можно сделать то же самое, но чтобы линковались не один, а несколько файлов в один бинарник? Пройдет ли простое добавление INPUT(...) и OUTPUT(kernel.bin)?
Вобщем из скрипта линкера убираем OUTPUT_FORMAT("binary") икомпилим бинарник в 3 комманды:
ld -o rootboot.hz rootboot.o -T rootboot.ld
objcopy rootboot.hz rootboot.bin -O binary
Странно, сделал все так - через три команды и без строчки в скрипте, но виртуалка зависла, и это при том, что исходник я не менял, а прежняя версия работала. Что это значит?
Я обнаружил причину зависания виртуалбокса. Файл rootboot.bin получился нулевого размера. ПОЧЕМУ????? :^(
.section .text
.globl _start
_start:
nop
xor %di, %di
mov $0xb800, %ax
mov %ax, %ds
mov $message, %si
move:
xor %dx, %dx
mov %cs:(%si), %dl
cmp $0, %dl
jz idle
mov %dl, (%di)
inc %di
movb $0x1e, (%di)
inc %di
inc %si
jmp move
idle:
mov $0, %dh
movb $msg_len, %dl
mov $0, %bh
mov $2, %ah
int $0x10
enter_loop:
movb $0 , %ah
int $0x16
cmp $1, %ah
je shootdown
cmp $' ',%al
jl enter_loop
cmp $'~',%al
jg enter_loop
mov %al, (%di)
inc %di
movb $0x1e, (%di)
dec %di
jmp enter_loop
shootdown:
mov $0x5301, %ax
xor %bx,%bx
int $0x15
mov $0x530e, %ax
xor %bx,%bx
mov $0x0102, %cx
int $0x15
mov $0x530f, %ax
mov $0x0001, %bx
mov $0x0001, %cx
int $0x15
mov $0x5308, %ax
mov $0x0001, %bx
mov $0x0001, %cx
int $0x15
mov $0x5307, %ax
mov $0x0001, %bx
mov $0x0003, %cx
int $0x15
.section .data
message:
.asciz "Press Esc to shootdown..."
msg_len = .-message-1
С таким скриптом:
SECTIONS
{
.text 0x7c00:
{
*(.text)
}
.data 0x7c80:
{
*(.data)
}
}
Покеж свой скрипт линкера и сорс который компилишь.
Покеж свой скрипт линкера и сорс который компилишь.
Сорс, собственно, тот же. Напоминаю(чтобы вы не переходили на предыдущую).
// ROOTBOOT.S
// BOOT FILE MUST BE PLACED AT 0th SECTOR OF BOOT DEVICE
//
.code16
.globl _start
_start:
jmp main
nop
// DATA FOR IDENTIFICATION
UPFS_ident: .ascii "U P F S DISK FS\0"
blockSizeInSectors: .word 1
firstSpecialBlock: .word 1
readSector:
// IN:
// DX - SECTOR NUMBER
// SI - BUFFER ADRESS
pusha
movw %dx, %ax
movw $0x12, %cx
movw %si, %bx
xor %dx, %dx
div %cx
mov %al, %ch
shrb $1, %ch
movb %dl, %cl
incw %cx
movb %al, %dh
andb $1, %dh
movb $1, %dh
movw $0x201, %ax
xorb %dl, %dl
int $0x13
jnc readSectorExit
readSectorExit:
popa
ret
printMessage:
// SI - MESSAGE
lodsb
testb %al, %al
jz printMessageExit
movb $0x0E, %ah
movb $0x07, %bl
int $0x10
jmp printMessage
printMessageExit:
ret
main:
movw %cs, %ax
cmpw $0, %ax
jne mainContinue
movw $msgRecalling, %si
addw $0x7C00, %si
call printMessage
call $0x7C0, $0
mainContinue:
movw %cs, %ax
movw %ax, %ss
movw %ax, %es
movw %ax, %ds
movw $0, %sp
movw %sp, %bp
movw $msgStarting, %si
call printMessage
mainExit:
jmp mainExit
// DATA FOR ROOTBOOT
msgStarting: .ascii "UPOS loader starting...\n\r\0"
msgRecalling: .ascii "Recalling...\n\r\0"
Как видите, проблема с перемещением была решена. Работало(до этого). Скрипт вязалки:
SECTIONS
{
.text :
{
*(.text)
}
}
Есть только текстовая секция, но секции данных нету и в асме. Посоветуйте, пожалуйста.
Так делают начальное смещение? Спасибо, а то я не знал.
Ну хоть кто-нибудь!
// ROOTBOOT.S
// BOOT FILE MUST BE PLACED AT 0th SECTOR OF BOOT DEVICE
//
.code16
.section .text
.globl _start
_start:
jmp main
nop
// DATA FOR IDENTIFICATION
UPFS_ident: .ascii "U P F S DISK FS\0"
blockSizeInSectors: .word 1
firstSpecialBlock: .word 1
readSector:
// IN:
// DX - SECTOR NUMBER
// SI - BUFFER ADRESS
pusha
movw %dx, %ax
movw $0x12, %cx
movw %si, %bx
xor %dx, %dx
div %cx
mov %al, %ch
shrb $1, %ch
movb %dl, %cl
incw %cx
movb %al, %dh
andb $1, %dh
movb $1, %dh
movw $0x201, %ax
xorb %dl, %dl
int $0x13
jnc readSectorExit
readSectorExit:
popa
ret
printMessage:
// SI - MESSAGE
lodsb
testb %al, %al
jz printMessageExit
movb $0x0E, %ah
movb $0x07, %bl
int $0x10
jmp printMessage
printMessageExit:
ret
main:
movw %cs, %ax
cmpw $0, %ax
jne mainContinue
movw $msgRecalling, %si
addw $0x7C00, %si
call printMessage
call $0x7C0, $0
mainContinue:
movw %cs, %ax
movw %ax, %ss
movw %ax, %es
movw %ax, %ds
movw $0, %sp
movw %sp, %bp
movw $msgStarting, %si
call printMessage
mainExit:
jmp mainExit
.section .data
// DATA FOR ROOTBOOT
msgStarting: .ascii "UPOS loader starting...\n\r\0"
msgRecalling: .ascii "Recalling...\n\r\0"