Ci-dessous, les différences entre deux révisions de la page.
Révision précédente | |||
— | back2root:programmation:virtual-cpu-v1 [2025/03/11 09:37] (Version actuelle) – [Tableau] frater | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Virtual CPU v1 ====== | ||
+ | Dans le cadre d'un projet de site WEB, j'ai eut besoin d' | ||
+ | Pour expérimenter un peu (et aussi pour le plaisir), j'ai eu envie de créer mon " | ||
+ | Celui-ci doit être simple, disposer d'un assembleur et être paramétrable. | ||
+ | |||
+ | ===== Caractéristiques ===== | ||
+ | |||
+ | Je me suis inspiré du Motorola 680x0 pour mon " | ||
+ | |||
+ | | Longueur d' | ||
+ | | instruction arithmétique | ||
+ | | registres d' | ||
+ | | registres de données | ||
+ | |||
+ | ===== Structure d'une instruction ===== | ||
+ | |||
+ | les deux premiers octets (16 bits) sont obligatoirement une instruction. | ||
+ | l' | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ 15 ^ 14 ^ 13 ^ 12 ^ 11 ^ 10 ^ 9 ^ 8 ^ 7 | ||
+ | | id |||| paramètre 1 | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ bits ^ descr. | ||
+ | | 15-12 | 4 bits d' | ||
+ | | 11-8 | 4 bits pour le 1er paramètre (si nécessaire)\\ c'est souvent la destination | ||
+ | | 7-4 | 4 bits pour le 2ème paramètre (si nécessaire)\\ c'est souvent la source | ||
+ | | 3-0 | 4 bits pour la longueur (si nécessaire) de l' | ||
+ | |||
+ | **La longueur (bits 3-0)** | ||
+ | |||
+ | nombre de byte(s) a lire en plus de l' | ||
+ | |||
+ | | 0x00 | aucun, l' | ||
+ | | 0x01 | 1 byte (BYTE) | ||
+ | | 0x02 | 2 bytes (WORD) | ||
+ | | 0x03 | 4 bytes (LONG) | ||
+ | |||
+ | **params #2** | ||
+ | |||
+ | souvent la source ou la définition du paramètre #2 | ||
+ | |||
+ | | 0x00..0x0B | ||
+ | | 0x0C..0x0E | ||
+ | | 0x0F | accès directe (les bytes suivant sont la valeur) | ||
+ | |||
+ | **params #1** | ||
+ | |||
+ | souvent la destination | ||
+ | | 0x00..0x0B | ||
+ | | 0x0C..0x0F | ||
+ | ===== Mode d' | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ 3 | ||
+ | | Taille | ||
+ | |||
+ | {{tablelayout? | ||
+ | ^ RegID ^ identifiant du Registre (0..3) | ||
+ | | b00 | spécifie un Registre de type Données (DATA) Dx | | ||
+ | | b01 | spécifie un Registre de type adresse (ADDR) Ax | | ||
+ | | b10 | spécifie une donnée pointée par le registre d' | ||
+ | | b11 | parametres | ||
+ | |||
+ | ce qui veut dire que l'on peut avoir : | ||
+ | {{tablelayout? | ||
+ | ^ Valeur | ||
+ | | 0 | ||
+ | | 1 | ||
+ | | 2 | ||
+ | | 3 | ||
+ | | 4 | ||
+ | | 5 | ||
+ | | 6 | ||
+ | | 7 | ||
+ | |||
+ | ===== Instruction Opcode ===== | ||
+ | |||
+ | "most significant bits", càd les 4bits de gauche | ||
+ | {{tablelayout? | ||
+ | | 0x0 | NOP or specific machine operands | ||
+ | | 0x1 | MOVE | | ||
+ | | 0x2 | ADD / INC | | ||
+ | | 0x3 | SUB / DEC | | ||
+ | | 0x4 | MUL | | ||
+ | | 0x5 | DIV | | ||
+ | | 0x6 | ROR | | ||
+ | | 0x7 | ROL | | ||
+ | | 0x8..0xB | ||
+ | | 0xC | PUSH / POP / CALL / RET | | ||
+ | | 0xE | CMP | | ||
+ | | 0xF | JMP (extended) | ||
+ | |||
+ | ===== Special instruction opcode ===== | ||
+ | {{tablelayout? | ||
+ | | 0x0000 | ||
+ | | 0x0FFF | ||
+ | | 0x0001 | ||
+ | | 0x0002 | ||
+ | | 0x0003 | ||
+ | |||
+ | <nspages back2root/ |