singlepost

COM-файл << На главную или назад  

Вобщем проблема в следующем: создаю 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 файлы. может я что-то не так делаю? или ошибкав коде? кто знает, подскажите пожалуйста.

140 ответов в теме “COM-файл”

  1. 4
    Юран Кербицков ответил:

    Дмитрий Коновалов
    спасибо большое, очень помогло для более глубокого понимания работы проги, но вот исправить мне это никак не удалось. получилось только на насм. поэтому решил остановиться пока на этом варианте.
    но в процессе поиска решения проблемы, перепробовал все компиляторы и в фасме у меня практически получилось все сделать, но там возникает проблема, решение которой мне найти не удалось, но очень хотелось бы, потому что мне фасм больше всего приглянулся и хотелось бы продолжить программировать на нем.
    Код:

    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

    это фасмовский код, отличается от насмовского только первой строчкой. но при насмовском коде дискета нормально читается в винде и нормально грузится из биоса, а при вышеуказанном коде под виндой дискета не читается, а из биоса все норм. может быть кто-нибудь знает почему возникает такая проблема с фасмом?

    З.Ы. Учел все замечания по поводу досовских прерываний и поправил код программы)) спасибо за подсказки)) программа пока простая, просто тест, хочу сделать работающую, а потом и усложнять можно)))

  2. 3
    Олег Кириченко ответил:

    Mov ah, $4C
    Int 21h

    - нет смысла писать тогда = )
    А вывод лучше делать напрямую, через $B800:$0000, т.к. Int 21h не будет работать без DOS = (

  3. 2
    Дмитрий Коковцев ответил:

    И еще: приведенный код написан под dos, поэтому в загрузчике он не будет работать. Используй функцию 09h BIOS

  4. 1
    Дмитрий Коковцев ответил:

    Привет любителям писать ОС :)
    Дело тут вот в чем. COM-файл обязан начинаться с адреса 100h. В данном случае tasm пишет в файл одну команду jmp, затем все байты до 07c00h заполняет нулями, и только потом пишет основной код. Из-за нулей размер файла составляет 7*16^3 + c*16^2 = 31744 байт

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.