#c #компоновщик #cpp #ассемблер
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
Комментариев нет:
Отправить комментарий