Вобщем проблема в следующем: создаю com файл в tasm. вот его код:
.model tiny
.code
org 100h
Start:
jmp BeginJMP
org 07C00h
BeginJMP:
jmp Begin
gnOEM db "DАТА "
gnSectSize dw 512
gnClustSize db 1
gnRessect dw 1
gnFatCnt db 2
gnRootSize dw 224
gnTotalSect dw 2880
gnMedia db 0F0h
gnFatSize dw 9
gnTrackSect dw 18
gnHeadCnt dw 2
gnHidenSect dd 0
gnHugeSect dd 0
gnBootDrv db 0
gnReserv db 0
gnBootSign db 29h
gnVolID dd 0
gnVoLabel db "BASE "
gnFSType db "FAT12 "
Begin:
mov ah, 09h
mov dx, offset message
int 21h
xor ax, ax
int 16h
mov ah, 4ch
int 21h
message db "Hello, world!!!",13,10,"$"
end start
как можно видеть из кода, он предназначен для записи в бут сектор дискеты. далее делаю:
tasm test
tlink /t test
создается com файл размером примерно 31 кб…в этом то и заключается проблема. не понимаю почему он такой большой. аналогичный код на nasm выдает файл размером 512 байт, что и необходимо мне. но мне все же интересно почему tasm создает такие большие com файлы. может я что-то не так делаю? или ошибкав коде? кто знает, подскажите пожалуйста.
10 января 2009 в 1:00
Дмитрий Коновалов
спасибо большое, очень помогло для более глубокого понимания работы проги, но вот исправить мне это никак не удалось. получилось только на насм. поэтому решил остановиться пока на этом варианте.
но в процессе поиска решения проблемы, перепробовал все компиляторы и в фасме у меня практически получилось все сделать, но там возникает проблема, решение которой мне найти не удалось, но очень хотелось бы, потому что мне фасм больше всего приглянулся и хотелось бы продолжить программировать на нем.
Код:
org 100h
org 7C00H
jmp Begin
gnOEM db '12345678'
gnSectSize dw 512
gnClustSize db 1
gnRessect dw 1
gnFatCnt db 2
gnRootSize dw 224
gnTotalSect dw 2880
gnMedia db 0F0h
gnFatSize dw 9
gnTrackSect dw 18
gnHeadCnt dw 2
gnHidenSect dd 0
gnHugeSect dd 0
gnBootDrv db 0
gnReserv db 0
gnBootSign db 29h
gnVolID dd 2a876CE1h
gnVoLabel db 'X boot disk'
gnFSType db 'FAT12'
Begin:
mov ah, 0ah
xor bh, bh
mov al, 55
mov cx, 10
int 10h
xor ah, ah
int 16h
int 19h
times 510-($-$$) db 0
dw 0AA55h
это фасмовский код, отличается от насмовского только первой строчкой. но при насмовском коде дискета нормально читается в винде и нормально грузится из биоса, а при вышеуказанном коде под виндой дискета не читается, а из биоса все норм. может быть кто-нибудь знает почему возникает такая проблема с фасмом?
З.Ы. Учел все замечания по поводу досовских прерываний и поправил код программы)) спасибо за подсказки)) программа пока простая, просто тест, хочу сделать работающую, а потом и усложнять можно)))
9 января 2009 в 18:03
Mov ah, $4C
Int 21h
- нет смысла писать тогда = )
А вывод лучше делать напрямую, через $B800:$0000, т.к. Int 21h не будет работать без DOS = (
9 января 2009 в 11:00
И еще: приведенный код написан под dos, поэтому в загрузчике он не будет работать. Используй функцию 09h BIOS
9 января 2009 в 10:05
Привет любителям писать ОС
Дело тут вот в чем. COM-файл обязан начинаться с адреса 100h. В данном случае tasm пишет в файл одну команду jmp, затем все байты до 07c00h заполняет нулями, и только потом пишет основной код. Из-за нулей размер файла составляет 7*16^3 + c*16^2 = 31744 байт