2013-03-09 2 views
1

Я хочу, чтобы имитировать работу над регистром, я объявляю класс Регистра, как следоватьИмитировать регистр процессора?

class Register{ 
    uint8_t reg_ax[2]; 
    Register(){ 
     reg_ax[0] = reg_ax[1] = 0; 
    } 
    uint16_t &ax(){ return (uint16_t &)reg_ax[0]; } 
}; 

теперь можно печатать и редактировать значение ax (что составляет 16 бит), как это:

Register regs; 
cout << regs.ax() << endl; 
regs.ax() = 5; 
cout << regs.ax() << endl; 

Это хорошо работает, но теперь, если я хочу напечатать и отредактировать al & ah низкую и высокую часть (которые являются 8 бит) ax что мне делать?! Я пробовал это, но он не работает!

uint8_t &al(){ return reg_ax[1]; } 
uint8_t &ah(){ return reg_ax[0]; } 

сейчас делает это не будет показывать какой-либо вывод:

cout << regs.al() << endl; 

Любая помощь?

+0

Что не работает? Любые сообщения об ошибках? –

+0

ДЕЙСТВИТЕЛЬНО работает? –

+0

никаких ошибок и компиляции, но do 'cout << res.al() << endl;' ничего не печатает! –

ответ

4

Возможно, проблема заключается в том, что вы пытаетесь напечатать unsigned char как unsigned char, и поэтому cout << regs.ah(); печатает символ нуль или некоторые такие?

Это работает для меня:

#include <iostream> 
#include <cstdint> 

using namespace std; 

class Register{ 
    uint8_t reg_ax[2]; 
public: 
    Register(){ 
     reg_ax[0] = reg_ax[1] = 0; 
    } 
    uint16_t &ax(){ return (uint16_t &)reg_ax[0]; } 
    uint8_t &al(){ return reg_ax[1]; } 
    uint8_t &ah(){ return reg_ax[0]; } 
}; 


int main() 
{ 
    Register regs; 
    regs.ax() = 500; 
    cout << regs.ax() << endl; 
    cout << (int)regs.ah() << endl; 
    cout << (int)regs.al() << endl; 
    return 0; 
} 

Я отправляю полный пример, так же, как вы должны сделать. Затем вы можете увидеть, что у вас есть, и все, что мне нужно было догадываться, правильно по сравнению с вашим кодом.

+2

Ваш метод 'ax()' должен выражать конструкцию 16-разрядного целого с использованием двух байтов, а не полагаться на литье. Кастинг будет заказывать байты в endianess платформы, выполняющей программу, которая может быть не такой же, как и симулированный CPU. –

+0

спасибо, что отлично поработал: D –

+0

-1: Извините, это не так, как определить структуры доступа регистра в аппаратно-ориентированном домене. (см. ссылку на SO-ответ на мой пост) Я думаю, насколько уродливыми будут сеттеры. Во-вторых, если листинг на C++, почему бы не использовать C++-стиль?Кастинг ссылки на int? Это должно работать? –

1

Использование массивов для реализации низкого/высокого байта или 16-битного регистра - не самая лучшая идея. Как я написал в комментарии, lear about union,: в контексте определения переменных, выравнивания данных в памяти.

Это должно дать вам идею горячую реализовать удобный доступ к регистру STRUCT/класс: Using nibbles (4 bits variables) in windows C/C++

и не забывайте использовать атрибут __ ((__ упакована)) из любого схоже для вашей платформы.

Отредактировано: Я могу потерять баллы за это, но это может быть полезно для вас :-). Как только я внедрил инструмент для доступа к регистру (с отображением памяти) любым способом, побитовым, красным и т. Д. Это может дать вам представление об использовании std::bitset. Код находится здесь: https://code.google.com/p/jeeamtee/wiki/Main

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