Загрузка кода на C через assembler

Тема в разделе "WASM.ASSEMBLER", создана пользователем optimusprime, 24 дек 2006.

  1. optimusprime

    optimusprime New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2006
    Сообщения:
    2
    Всем привет. Я хочу через assembler загрузить процедуру, написанную на С, причём не просто создать файл на ассемблере, из которого будет происходить вызов процедуры, но и самому загрузить этот файл в память. Такая ситуация, я создал свой загрузчик на дискете, так вопрос в том, как мне вручную запустить exe файл созданный C? Я вручную запускал exe-файлы на ассемблере, задавая перед запуском правильные значения сегментов, но вот пытаюсь сделать аналогию с С-шными exe, ничего не получается.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Какой компилятор, какая среда?
     
  3. optimusprime

    optimusprime New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2006
    Сообщения:
    2
    Использую Turbo Assembler 5.0, компилировал с помощью Turbo C 3.0.

    Код на ассемлере.
    .model small
    .stack 100h
    .code
    _main = start
    public _main

    extrn _test: far
    start:
    mov ah, 09h
    lea dx, msg_bef
    int 21h

    call _test

    mov ah, 09h
    lea dx, msg_aft
    int 21h

    mov ax, 4c00h
    int 21h
    .data
    msg_bef db "Now trying to call C procedure...", 0ah, 0dh, '$'
    msg_aft db "Now continue executing assembler code...", 0ah, 0dh, '$'
    end start

    Код на С

    int test(void)
    {
    printf("This is C procedure.\n");
    return 0;
    }

    Компилирую - создаю 2 объектных файла, а потом компилю их вместе(всё с помощью turbo c, но он пользуется линкером от tasm). Получаю exe. Вот его и хочу запустить, он весит 6.5 кб.
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Т.е. прога 16-битная...
    Для прог <64K настоятельно рекомендую использовать *.com.
    Т.е. собирать свою прогу не в *.exe а в *.com.
    Запускать просто - грузишь в память по адресу скажем BASE_ADDR+100h
    Настраиваешь все сегменты на BASE_SEG=(BASE_ADDR SHR 4), SP=0 и переходишь по адресу BASE_SEG:100h
    Всё.
    У exe надо обрабатывать таблицу перемещения - подробнее поищи формат MZ EXE.
     
  5. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    на всякий случай уточню, что BASE_ADDR должен делиться на 16, чтоб не было случайных ошибок