Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› Интерпретатор asm
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 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 соотв структуры. Вообщем, нужен светлый взгляд со стороны, поделитесь идеями =)



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 13 апреля 2008 15:30
· Личное сообщение · #2

не буду ставить под вопрос саму необходимость интерпретатора (уверен, это сделают другие).
\Freecod пишет:
сдвиг должен быть в Си как shr \ shl

<< и >>
ты бы сначала C подучил, а потом брался писать на нем.



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 13 апреля 2008 15:40
· Личное сообщение · #3

К модераторам : Грохните вторую копию темы

Freecod пишет:
Теперь ещё веселее - интерпретация к примеру mov [ax+2], dx

Тебе придется в таком случае эмулировать адресное пространство проги и в результате ты дойдешь до того что или изменишь синтаксис или у тебя получиться что- то типа своего компилера.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 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)



Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 13 апреля 2008 16:52
· Личное сообщение · #5

Но как обратится к al, ah?
& и >>



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 00:02
· Личное сообщение · #6

Ну вы меня зарядили оптимизмом =\ В _принципе_ адрестное пространство будет общим у ближайших переменных, только если их руками выделять, в одной куче. Но тогда сама суть автомата пропадает =( Так что пока это задвинем.
Регистры и примитивные команды <op_2op> <reg>,<reg> уже работают. Остался крупный вопрос - скобки...



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 09:47
· Личное сообщение · #7

А как сконвертить char * в DWORD? ну вообщем поместить указатель?
DWORD eax = byf;
char *byf;

Вообще в Си я смогу потом использовать конкретное числовое значение 4 байта как указатель?




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 14 апреля 2008 10:19
· Личное сообщение · #8

DWORD(...)

-----
invoke OpenFire




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 10:22 · Поправил: Freecod
· Личное сообщение · #9

Да что такое с фоксом сегодня... посты дупит.
Кстати, почему я свой пост стереть не могу?



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 14 апреля 2008 11:31
· Личное сообщение · #10

(DWORD) а не DWORD()

-----
Shalom ebanats!




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 11:32
· Личное сообщение · #11

На BCB6 и DWORD() схавал...



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 11:43
· Личное сообщение · #12

tomac: Способ получения нижних частей регистра работает на ура. Возникла новая проблема - сунуть изменённую нижнюю часть обратно в "батько" =)




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 апреля 2008 12:45 · Поправил: Rascal
· Личное сообщение · #13

пепетс. какой нах эмуль асма, кодить сначала стоит научиться. кури в сторону |, & и маски вида 0x0F, 0xF0

SLV пишет:
(DWORD) а не DWORD()

итак итак катит. просто DWORD() компиль напрягает, ибо это напоминает конструктор с параметрами, поэтому приведение типов делается со скобкой на самом типе, а не на значении. Так что пральнее юзать (DWORD)var;

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 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





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 апреля 2008 13:37
· Личное сообщение · #15

омг. уж лучше бы дефайны сделал с & да |, нежели заводить структуры для такой плевой задачки.

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 14 апреля 2008 14:05
· Личное сообщение · #16

по-моему структуры и юнионы тут удобнее, хотя, на вкус и цвет...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 14 апреля 2008 14:53
· Личное сообщение · #17

eax и справа BL. удобно то удобно, но наглядность хромает. тада уж L и H называть поля. да и обращения к юниону тож не очень eax.__reg8. кароч каждому свое.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 59.9 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 16:10 · Поправил: El_Diablo
· Личное сообщение · #18

[del plz]



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2008 23:54
· Личное сообщение · #19

Rascal пишет:
пепетс. какой нах эмуль асма, кодить сначала стоит научиться.

Дорогой друх =) Если бы это было исключительно моё желание - я бы забил ещё на стадии создания нормальной бнф ;)



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 апреля 2008 06:17
· Личное сообщение · #20

Rascal: предложи пример с & и | , если не влом.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 апреля 2008 07:54 · Поправил: s0larian
· Личное сообщение · #21

Freecod, ыыы...

dword eax;
word ax = eax & 0xffff;
byte al = ax & 0xff,
ah = ax >> 8;


ты бы почитал книжку по С, что ли...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 15 апреля 2008 08:13
· Личное сообщение · #22

ну а запись
dword eax;
word ax;
byte al;
byte ah;

eax = eax & 0xffffff00 | al;
eax = eax & 0xffff00ff | (ah << 8);
eax = eax & 0xffff0000 | ax;

типа такого

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 апреля 2008 09:22
· Личное сообщение · #23

эта, с unions делать лучше т.к. компилер выплюнит код (инструкции) для этих по-битовых операций. Если компилить .cpp то можно без typedef. Да и __ я бы орезал... Короче бери код от OKOB и чисти.



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 апреля 2008 10:06
· Личное сообщение · #24

Да я уже почистил от лишнего, всё робит, ОКОВу спасиб.
PS Я сэмулировал mov. Наверное я бог. =)




Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 15 апреля 2008 14:19
· Личное сообщение · #25

SLV пишет:
(DWORD) а не DWORD()

Согласно стандарту, обе записи равносильны.



Ранг: 50.2 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 15 апреля 2008 14:52
· Личное сообщение · #26

gazlan
Потому что POD?



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 15 апреля 2008 17:03
· Личное сообщение · #27

А как работать с такими указателями в обычном DWORD? Допустим у меня 2 таких указателя, нужно записать DWORD ptr:[x], DWORD ptr:[y]. как быть?




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 15 апреля 2008 20:55
· Личное сообщение · #28

*(DWORD*)

-----
invoke OpenFire




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 16 апреля 2008 05:01
· Личное сообщение · #29

Что-то не выходит... например у мну
DWORD d; \ в d указатель на переменную типа DWORD
Как записать что-то по этому указателю?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати