сборка — C ++ Получение адреса класса / структуры в 8086

Я пытаюсь выяснить, как получить и сохранить адрес объекта struct / class в архитектуре 8086 с использованием Borland C ++ Compiler.

Попытка сделать что-то вроде:

    struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};

int main() {
Data* r = new Data();
unsigned int temp;
asm {
mov temp, bx
mov bx, r
mov bx[0], ax
mov bx[4], cx
mov bx[6], dx
}
r->b = temp;
// write registry values on screen and check with actual register values
}

Сейчас я попробовал много способов сделать:

mov bx, r

Строка работает (используя FP_OFF ​​и FP_SEG), но безуспешно.
Я просто перемещаю значения регистра во временные переменные, а затем записываю эти переменные в структуру, например:

    struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};

int main() {
Data* r = new Data();
unsigned int ta, tb, tc, td;
asm {
mov ta, ax
mov tb, bx
mov tc, cx
mov td, dx
}
r->a = ax;
r->b = bx;
r->c = cx;
r->d = dx;
// write registry values on screen and check with actual register values
}

Но я хотел бы знать, как бы я сделал это, используя адрес объекта, чтобы я мог уменьшить количество используемых переменных и уменьшить беспорядок в коде.

ОБНОВИТЬ

Я думаю, что нашел правильный путь:

    struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};

int main() {
Data* r = new Data();
unsigned int dataOff, dataSeg;
dataOff = FP_OFF(r);
dataSeg = FP_SEG(r);
asm {
push ds
push bx

mov bx, dataOff
mov ds, dataSeg

mov bx[0], ax
mov bx[4], cx
mov bx[6], dx
pop WORD PTR bx[2]
pop ds
}
// write registry values on screen and check with actual register values
}

Я забыл изменить регистр DS (сегмент данных), чтобы он соответствовал значению сегмента ячейки памяти объекта.
Было бы неплохо, чтобы кто-то подтвердил, что это правильный путь.

2

Решение

Вы можете указать имя структуры и поле следующим образом:

mov [bx+Data.a], ax
mov [bx+Data.c], cx
mov [bx+Data.d], dx
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector