Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых) |
eXeL@B —› Программирование —› Интерпретатор asm |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 13 апреля 2008 15:25 · Личное сообщение · #1 Пишу интерпретатор асма на BCB6, с бнф, лексическим, синтакс. и семант. анализом. И вот встал вопрос - как реализовать сами команды =) К примеру под регистры я выделю WORD reg_ax; Но как обратится к al, ah? Помню сдвиг должен быть в Си как shr \ shl, но конкретно не знаю =( Теперь ещё веселее - интерпретация к примеру mov [ax+2], dx Вертится в голове, что можно сделать универсальную функция func_mov и передать ей 2 указателя что ли, но конкретику уловить не могу. Скобки [] - всегда разадресация указателя? Переменные реализ. как структура String name; char *nnn для строк с инитом через new, для обычных word \ byte соотв структуры. Вообщем, нужен светлый взгляд со стороны, поделитесь идеями =) |
|
Создано: 13 апреля 2008 15:30 · Личное сообщение · #2 |
|
Создано: 13 апреля 2008 15:40 · Личное сообщение · #3 К модераторам : Грохните вторую копию темы Freecod пишет: Теперь ещё веселее - интерпретация к примеру mov [ax+2], dx Тебе придется в таком случае эмулировать адресное пространство проги и в результате ты дойдешь до того что или изменишь синтаксис или у тебя получиться что- то типа своего компилера. ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 |
|
Создано: 13 апреля 2008 16:29 · Личное сообщение · #4 Квадратные скобки - не всегда разыменование указателя, например что такое bx+[6] я не помню, но точно не bx+*(6) и не *(bx+*(6)). А с хранением переменных с именами может возникнуть серьезная проблема их размещения в памяти (не подряд), многие программы написанные на асме пользуются последовательным размещением данных ( например, к данным типа a db 0 b db 1 c db 2 ... обращаются потом как к массиву - передают в те же строковые команды (movs,lods,stos,scas)), да и вообще часто программы занимаются кошмарными делами, например модифицируют свой код (прим. вообще говоря, так делать не рекомендуется). Так что Stack прав. P.S. для выделения регистров еще можно пользоваться |, & (al = ax&00FFh) |
|
Создано: 13 апреля 2008 16:52 · Личное сообщение · #5 |
|
Создано: 14 апреля 2008 00:02 · Личное сообщение · #6 Ну вы меня зарядили оптимизмом =\ В _принципе_ адрестное пространство будет общим у ближайших переменных, только если их руками выделять, в одной куче. Но тогда сама суть автомата пропадает =( Так что пока это задвинем. Регистры и примитивные команды <op_2op> <reg>,<reg> уже работают. Остался крупный вопрос - скобки... |
|
Создано: 14 апреля 2008 09:47 · Личное сообщение · #7 |
|
Создано: 14 апреля 2008 10:19 · Личное сообщение · #8 |
|
Создано: 14 апреля 2008 10:22 · Поправил: Freecod · Личное сообщение · #9 |
|
Создано: 14 апреля 2008 11:31 · Личное сообщение · #10 |
|
Создано: 14 апреля 2008 11:32 · Личное сообщение · #11 |
|
Создано: 14 апреля 2008 11:43 · Личное сообщение · #12 |
|
Создано: 14 апреля 2008 12:45 · Поправил: Rascal · Личное сообщение · #13 пепетс. какой нах эмуль асма, кодить сначала стоит научиться. кури в сторону |, & и маски вида 0x0F, 0xF0 SLV пишет: (DWORD) а не DWORD() итак итак катит. просто DWORD() компиль напрягает, ибо это напоминает конструктор с параметрами, поэтому приведение типов делается со скобкой на самом типе, а не на значении. Так что пральнее юзать (DWORD)var; ----- Недостаточно только получить знания:надо найти им приложение |
|
Создано: 14 апреля 2008 12:50 · Личное сообщение · #14 typedef struct _REG16 { WORD W; WORD HW; } REG16, *P_REG16; typedef struct _REG8 { BYTE BL; BYTE BH; WORD HW; } REG8, *P_REG8; typedef union _REG { DWORD __reg32; REG16 __reg16; REG8 __reg8; } REG, *PREG; REG eax; eax.__reg32 = 0x12345678; WORD ax = eax.__reg16.W; // 0x5678 BYTE ah = eax.__reg8.BH; // 0x56 BYTE al = eax.__reg8.BL; // 0x78 ----- 127.0.0.1, sweet 127.0.0.1 |
|
Создано: 14 апреля 2008 13:37 · Личное сообщение · #15 |
|
Создано: 14 апреля 2008 14:05 · Личное сообщение · #16 |
|
Создано: 14 апреля 2008 14:53 · Личное сообщение · #17 |
|
Создано: 14 апреля 2008 16:10 · Поправил: El_Diablo · Личное сообщение · #18 |
|
Создано: 14 апреля 2008 23:54 · Личное сообщение · #19 |
|
Создано: 15 апреля 2008 06:17 · Личное сообщение · #20 |
|
Создано: 15 апреля 2008 07:54 · Поправил: s0larian · Личное сообщение · #21 |
|
Создано: 15 апреля 2008 08:13 · Личное сообщение · #22 |
|
Создано: 15 апреля 2008 09:22 · Личное сообщение · #23 |
|
Создано: 15 апреля 2008 10:06 · Личное сообщение · #24 |
|
Создано: 15 апреля 2008 14:19 · Личное сообщение · #25 |
|
Создано: 15 апреля 2008 14:52 · Личное сообщение · #26 |
|
Создано: 15 апреля 2008 17:03 · Личное сообщение · #27 |
|
Создано: 15 апреля 2008 20:55 · Личное сообщение · #28 |
|
Создано: 16 апреля 2008 05:01 · Личное сообщение · #29 |
|
Создано: 16 апреля 2008 05:55 · Личное сообщение · #30 2 раза обратиться, ты на каком языке вообще пишешь? Потому что Си ты явно не знаешь. ХЗ как на Си на паскале это выглядит так: d: DWORD; d:=DWORD(mem); - ложим в d указатель на некую память DWORD(Pointer(d)^):=$12345678; - пишем через указатель в память некий DWORD. ----- Yann Tiersen best and do not fuck |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Интерпретатор asm |