2012-12-02 7 views
0

Я пытаюсь написать ассемблерные в файле C, и я получаю 2 ошибки:гну встроенный ассемблер ошибка

open.c:10: Error: junk PTR Номбр»после expression`

open.c:10: Error: suffix or operands invalid for les'`

Это мой файл:

int open(char * nombre, unsigned char modo) 
{ 
    int retval; 
    int nrllamada = 6; 
    asm("mov $8,%%ah \n\t" 
     "les %%bx, dword ptr nombre \n\t" 
     "int $0x22 \n\t" 
     "mov %%eax,%0 \n\t" 
     : "=r"(retval) 
     : "a"(modo) 
); 
    return retval; 
} 

ответ

1

Правильный способ записи в регистры ES и BX 32-разрядный указатель с именем nombre заключается в подключении переменной переменной C для регистрации ECX, переместите нижние 16 бит ECX для регистрации BX, поверните регистр ECX 16 бит, чтобы более низкие 16 бит идут к более высоким 16 битам того же регистра и наоборот и, наконец, перемещают младшие 16 бит ECX в ES.

int open(char * nombre, unsigned char modo) 
{ 
    int retval; 
    // numero servicio 6 
    // nombre del fichero a abrir (ES:BX) y modo (AL) de apertura 
    asm("mov $6,%%ah \n\t" 
     "mov %%cx,%%bx \n\t" 
     "rol $16,%%ecx \n\t" 
     "mov %%cx,%%es \n\t" 
     "int $0x22 \n\t" 
     "mov %%eax,%0 \n\t" 
     : "=r"(retval) 
     : "a"(modo), "c"(nombre) 
); 
    return retval;  
} 
1
"les %%bx, dword ptr nombre \n\t" 

Вы PTR Номбр внутри строки. Возможно, это неверно. неужели вы хотите ссылаться на char * nombre в аргументах функции?

0

GCC - это 32-разрядный компилятор. Это также означает, что вы, скорее всего, попытаетесь избавиться от арифметики указателя типа es:bx и перейти к плоской 32-разрядной адресации (где base cs = ds = es = 0, а каждый предел сегмента равен 0xffffffff).

Доступ к регистрам состояния в пользовательском пространстве защищенного режима дает весьма вероятное исключение нарушения доступа.

Кроме того, что такое ОС, где допускается int 22h и где она ожидает ввода es: bx? В MS-DOS его не следует вызывать, поскольку он используется только как статическая переменная для восстановления других векторов прерываний.

+0

Он предназначен для небольшого ядра крошечной ОС под названием OSO, которую я пишу, и который использует старые технологии, такие как файловая система fat12 и архитектура архитектуры 16 бит. Int22h сделан для моего ядра, у меня уже есть процедура прерывания для этого. –

Смежные вопросы