ошибка встроенной сборки gnu

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

open.c:10: Error: junkptr номер 'после выражения`

open.c:10: Error: suffix or operands invalid forles ''

Это мой файл:

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;
}

person Youssef Khloufi    schedule 02.12.2012    source источник


Ответы (3)


"les %%bx, dword ptr nombre \n\t"

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

person uncleO    schedule 02.12.2012

Правильный способ записать в регистры ES и BX 32-битный указатель с именем nombre - это подключить переменную 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;       
}
person Youssef Khloufi    schedule 02.12.2012

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

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

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

person Aki Suihkonen    schedule 02.12.2012
comment
Я пишу это для небольшого ядра крошечной ОС под названием OSO, в котором используются старые технологии, такие как файловая система fat12 и 16-битная архитектура процессора. Int22h сделан для моего ядра, у меня уже есть процедура прерывания для этого. - person Youssef Khloufi; 03.12.2012