Встроенная сборка в C: динамические регистры - PullRequest
1 голос
/ 01 октября 2009

Я пытаюсь встроить некоторый ассемблерный код в мой код C:

__asm { mov reg,val };

Проблема: я хочу определить регистр и значение динамически. Я знаю, что 'val' может быть переменной, записанной в коде C, но я не знаю, как я могу выбрать регистр динамически (то есть выбрать в соответствии с пользовательским вводом-регистром 'dh' или 'dl').

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 01 октября 2009

Хорошо ... Это потребует от вас изменения кода во время выполнения.

Конструкция __asm { } происходит все во время компиляции, поэтому вы не можете повлиять на ее содержимое позже.

Конечно, самоизменяющийся код - это не совсем то, что современные операционные системы настроены так, чтобы делать его проще всего, поэтому вам придется перепрыгивать через несколько циклов (очистка кеша, кодирование в недоступных для записи сегментах и ​​т. д.).

Обновление: Конечно, вы могли бы использовать технику slashmais и switch между набором предварительно скомпилированных версий, но мне было бы страшно смешивать код на этом уровне (на ум приходит сбои в регистре).

4 голосов
/ 01 октября 2009

Используйте enum и включите C-код:

typedef enum
{
  R_AL,
  R_AH,
  R_AX,
  R_EAX,
...
} REGS;
...
REGS nReg;
...
switch (nReg)
{
    case R_AL: __asm { mov al,val } break;    
    case R_AH: __asm { mov ah,val } break;    
    case R_AX: __asm { mov ax,val } break;
    ...
}
...