Всем привет. Я хочу через assembler загрузить процедуру, написанную на С, причём не просто создать файл на ассемблере, из которого будет происходить вызов процедуры, но и самому загрузить этот файл в память. Такая ситуация, я создал свой загрузчик на дискете, так вопрос в том, как мне вручную запустить exe файл созданный C? Я вручную запускал exe-файлы на ассемблере, задавая перед запуском правильные значения сегментов, но вот пытаюсь сделать аналогию с С-шными exe, ничего не получается.
Использую 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 кб.
Т.е. прога 16-битная... Для прог <64K настоятельно рекомендую использовать *.com. Т.е. собирать свою прогу не в *.exe а в *.com. Запускать просто - грузишь в память по адресу скажем BASE_ADDR+100h Настраиваешь все сегменты на BASE_SEG=(BASE_ADDR SHR 4), SP=0 и переходишь по адресу BASE_SEG:100h Всё. У exe надо обрабатывать таблицу перемещения - подробнее поищи формат MZ EXE.