Как связать ассемблерный код вместе с C\С++ для запуска в DosBox с прерываниями?

Рейтинг: 5Ответов: 1Опубликовано: 17.11.2014
asm(".code16gcc\n");
#define G640x350x64c 0x10
#define T80x25 0x3
#define R320x200x16c 0xD
void setVMode(int mode);
int _main() {
setVmode(G640x350x64c);
return 0;
}
void setVMode(int mode) {
asm("mov ah,0");
asm("mov al,byte ptr[ebp+0x8]");
asm("int 0x10");
}

Итак, этот код рабочий, и он меняет видеорежим в консоли. Запускается в досбоксе, предварительно скомпилированный таким образом:

gсс -O0 -c  -masm=intel main.c -o main.o
ld main.o -o prog.com
objcopy prog.com -O binary
C:\Progra~1\DOSBox-0.74\DOSBox.exe

Т.е. создается бинарник, независимый от системы. И вот тут начинаются проблемы, если добавить какую-нибудь библиотечную функцию, ld автоматически не линкует библиотеки типа stdlib и прочих. Использование автоматической линковки с помощью gcc к успеху не приведет, нужен чистый бинарник, свободный от системной информации.

Ответы

▲ 1

Нужно либо писать сразу в интел асме этот код и обращаться к библиотекам там (наверняка у вас интел асм), либо использовать другой способ внедрения asm -- тот что используется в gcc без пропускания данных через masm