загрузка из ПЗУ

Тема в разделе "WASM.ASSEMBLER", создана пользователем dps86, 23 фев 2009.

  1. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    здравствуйте! помогите решить проблемку.
    есть прога на СИ, которая будет зашиваться в ПЗУ. она должна грузиться перед запуском операционной системы(red hat). говорят, что надо что то делать со стеком и возможно что-то еще, чтоб она грузилась. объясните, пожалуйста, что и как делать!
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dps86
    А какие требования? Стек можно не трогать а оставить тот который есть.
    Только его там мало. Буквально на вызов двух трех процедур. Можешь свой задать.
     
  3. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    Pavia, спасибо, что уделил время. собственно эта тема родилась из этой http://wasm.ru/forum/viewtopic.php?id=30733 . почитай пост в конце, пжлста
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dps86
    Стек можно и не троготь. А вот сегмент данных нужно настроить. Наверно лучше взять и прировнять сегменту кода.
     
  5. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    как это сделать в СИ?
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dps86
    Это делается не в си, а в ассемблере. Маленький код который настраивает си-шный код и передает ему управление.
    Компилируешь бинарники ассемблера и си. А после собираешь их линкером.

    Модель памяти tiny- код и данные будут в одном сегменте.

    Ты каким компилятором пользуешься?
     
  7. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    я tasm использую.
    ну вот смотри например как мне сделать так чтобы заработал след пример

    это небоьшая прога, которая содержит сигнатуру и передаст управление на основную прогу в пзу. (ее я компилил в тасме)
    prg segment
    assume cs:prg,ds:prg,es:prg,ss:prg
    org 100h
    start:
    DB 55h, АAh ; загрузочная сигнатура
    DB 01h ; размер блока в 200h байтовых секторах
    jmp x_code ; передача управления нашему коду
    retf
    prg ends
    end start



    а это основная прога, в которой просто нужно ввести пароль и которая расположится по адресу x_code(ее я компилил компилятором СИ)
    int main()
    {
    asm{
    input: ; ожидание ввода пароля
    ; ---------------------
    XOR DX,DX ; контрольная сумма
    enters:
    XOR AX,AX ; функция чтения символа с клавы
    INT 16h ; читаем символ
    CMP AL,0Dh ; это ENTER?
    JZ input ; если ENTER, начинаем ввод сначала
    XOR AH,AH ; очистить скан-код
    ADD DX,AX ; считаем CRC
    CMP DX, 'm' + 's' + 'o'
    JNZ enters ; если это не "mso", продолжаем ввод
    retf
    }
    return 0;
    }

    т.е. если все это правильно собрать в tiny, то должно работать?
     
  8. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    хотя нет, туплю. если все это будет в одном файле, тогда какой x_code. чет вообще не догоняю
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не забудь, что сумма всех байтов активных блоков (размер*512), включая 55АА, должна быть равна "0", иначе биос посчитает расширение сбойным.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dps86
    Так как ты не ответил на каком ты Си пишешь. Будем расматривать что на OpenWatcom.

    Тебе нужно написать startup на ассемблере.
    В котором проинициировать сегмент данных и кода. Пример можно глянуть сдесь
    C:\WATCOM\src\startup\dos\cstrt086.asm

    Набросал примерный код
    Код (Text):
    1. startup segment
    2.         assume  nothing
    3.         public  start
    4.         extrn   _Main                 : near ; Эта процедура ноходиться в Си.
    5.  
    6. ; ROM Head
    7. db 055h, 0AAh    ; Сигнатура
    8. db Len               ; размер блока в 200h байтовых секторах
    9. jmp start
    10. db 001h,002h,003h,004h,005h,006h,007h,008h,009h,00Ah,00Bh, 00Ch ; Резерв 12 пользовательских переменных
    11. dw offset PIR     ; Указатель на PIR структуру.
    12. start:
    13. ;       Биос передает переменные
    14. ;       AH - номер шины
    15. ;       AL - номер функции
    16.  
    17.         mov     cx,cs
    18.         assume  es:DGROUP
    19.         mov     es,cx                   ; Устанавливаем сегмент данных равным сегменту кода
    20.         mov     ds,cx                   ; Устанавливаем сегмент данных равным сегменту кода
    21.        
    22. ; Настраиваем стек хотя я бы его не трогал.
    23.         mov [OldSS],ss
    24.         mov [OldSP],sp
    25.  
    26.         mov     ss,cx                   ; Устанавливаем сегмент стека равным сегменту кода
    27.  
    28.         mov     bx,offset DGROUP:_end   ; получаем верхушку стека
    29.         add     bx,0Fh                  ;
    30.         and     bl,0F0h                 ; Выравнивание
    31.         mov     _STACKLOW,bx            ; ...
    32.         add     bx,__stacksize          ; устанавливаемый запрашиваемый размер стека, обычно 2КБайта
    33.        
    34.         mov    
    35.         mov     sp,bx                   ; set sp relative to DGROUP
    36.         mov     _STACKTOP,bx            ; set stack top
    37.  
    38.         call    __CMain  ; Вызываем код на Си.
    39.  
    40.         mov ss,[OldSS]
    41.         mov sp,[OldSP]
    42.  
    43.         retf
    44.  
    45. ends startup
    46. end     start
    После компилируешь и собираешь программу.
     
  11. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    Pavia, благодарю за помощь!!!!!!!!!!!
    еще пара вопросов

    немного переделал написаный тобой пример:

    startup segment
    assume cs:startup,ds:startup,es:startup,ss:startup
    ; public start
    extrn _Main : near ; Эта процедура ноходиться в Си.

    ; ROM Head
    db 055h, 0AAh ; Сигнатура
    db 1 ; размер блока в 200h байтовых секторах
    jmp start
    db 001h,002h,003h,004h,005h,006h,007h,008h,009h,00Ah,00Bh, 00Ch ; Резерв 12 пользовательских переменных
    ;dw offset PIR ; Указатель на PIR структуру.
    start:
    ; Биос передает переменные
    ; AH - номер шины
    ; AL - номер функции

    mov cx,cs
    ; assume es:lol: GROUP
    mov es,cx ; Устанавливаем сегмент данных равным сегменту кода
    mov ds,cx ; Устанавливаем сегмент данных равным сегменту кода

    call _Main ; Вызываем код на Си.



    input: ; ожидание ввода пароля
    ; ---------------------
    XOR DX,DX ; контрольная сумма
    enters:
    XOR AX,AX ; функция чтения символа с клавы
    INT 16h ; читаем символ
    CMP AL,0Dh ; это ENTER?
    JZ input ; если ENTER, начинаем ввод сначала
    XOR AH,AH ; очистить скан-код
    ADD DX,AX ; считаем CRC
    CMP DX, 'm' + 's' + 'o'
    JNZ enters ; если это не "mso", продолжаем ввод

    retf

    ends startup
    end start

    для чего нужны "Резерв 12 пользовательских переменных", Указатель на PIR структуру?
    тасм не понял что такое "assume es:lol: GROUP" и ругнулся. пришлось закомментить. и все заработало? нужна ли эта строка так сильно?
    кстати стек я решил все таки не править, как ты советовал

    прога на СИ выглядит так. (все эти 2 проги это только скилет, для проверки алгоритма работы)
    #include <conio.h>

    int main()
    {

    asm{

    MOV AH, 02h // ; функция управления курсором
    MOV DX, 0202h // ; куда выводить (DH - Y, DL - X)
    XOR BX,BX
    INT 10h // ; позиционируем курсор
    }
    return 0;

    }

    собрал tlink`ом объектные файлы. создался экзешник. пробовал создать ком, нифига. не хочет. пробовал перегнать exe в com утилиотй exe2bin, тоже не работает.

    в итоге я решил попробовать метод "ТЫКА")) удалил PE pзаголовок hex-редактором, оставил только то что нужно, забил нулями до 200н и посчитал контр сумму. все идеално работает.
    можно ли так делать, я про удаление заголовка в ручную? не загнется ли прога при первом удобном случае??
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dps86
    Это из стандарта PCI.

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

    Неверно. PE подразумивает 32битный код. А нужен 16 битный. То что заработало это тебе повезло.

    Лучше возьми 16битный компилятор си. Можно конечно и наоборот процессор перевести в защищенный режим и 32 бита но это гораздо сложнее.
     
  13. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    16битный компилятор си. я даже не знаю какой 16битный. весь инет облазил не нашел. Borland 3.х покатит??
     
  14. dps86

    dps86 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    28
    и как создать com файл? tlink с ключом /t не работает.