Size: a a a

Ассемблер

2019 November 04

FT

Fistashka Tryam in Ассемблер
Прикольно
источник
2019 November 05

ВХ

Віталій Халак in Ассемблер
Rokker Ruslan
В закромах нашёл старый институтский проект. Решил переписать на vue/ts, может кому будет интересно (github.com/rokkerruslan/i8080). Что за проект?
В институте писали под Intel 8080 (во многих институтах изучают это старьё, так как принципы не поменялись, а проц простой), но в эмуляторе была проблема, не работала инструкция JC (если знаете на базовом уровне как работает cpu то понимаете что многие алгоритмы писать не удобно, а для обучения удобство главное). Ну и я решил реализовать свой.

В целом он работал, но хреново (небыло многих нужных вещей). И тут опа, попадается мне на глаза (3 года как закончил институт). Я тут же расчехлил vue и typescript, быстро нарисовал интерфейс, несколько выходных и уже вышло что-то готовое.

Хоть и переписан был в быстром темпе, но всё же нашлось время на такую штуку как отладчик, так что можете заценить.

Итого, что есть:
- Ассемблер - связка лексического/синтаксического анализатора, вычислителя и кодогенератора.
- Эмулятор - тут особо нечего сказать, эмулятор как эмулятор, только имеется поддержка останова цикла выполния инструкций для точек останова (debugger).
- Редактор - связыват работу двух предыдущих компонент.

Всё работает очень просто, пишите программу, нажимаете Go, далее пройдёт цикл ассеблирования, загрузки исполняемого файла в память эмулятора и начнётся собственно выполнение. Можно выполнять программу по шагам или продолжить выполнение до следующей точки останова (частота выборки меняется в поле `frequency`).

Отладка - работает как в обычных gui редакторах - клик мышкой по области левее строки, как только выполнение дойдёт до этой инструкции cpu встанет (внутри работает достаточно сложно из-за необходимости поддержки со стороны всё трёх компонент, от ассемблера нужна генерация отладочной информации (какая инструкция на какой строке), от эмуторятора - способ остановки выполнения, от редактора - визуализаций брейкпоинтов и интерфейс для их переключения, но эти сложности упрятаны..

Интерфейс позволяет просматривать полное состояние CPU на всём этапе исполнения программы, значения регистров (program counter, stack pointer, accumulator etc), флагов состояния процессора, а как же любого участка памяти. При этом, когда выполнение приостановлено можно менять эти значения. Посылать прерывания можно и во время выполнения. Реализация интерфейса использует vue.

Бред? Да, бред, спросите зачем? Просто по фану. Много людей в институте обучается на i8080, может кому и пригодиться. Да и как пример hello-world приложения на vue которое чуть больше чем 10 строчек кода (суммарно весть проект без yarn.lock менее 10к строк кода).

На странице examples, есть примеры программ. Можете запустить локально, ничего не надо кроме node/yarn (всё работает в браузере).

have fun.

P.S. Ссылочка на github page - rokkerruslan.github.io
P.S.2. Переписывал в торопях (практически в одну итерацию), будет некое кол-во регрессий.
P.S.3. Мобилки нет (просто не представляю как такой интерфейс должен выглядеть на мобильных устройствах)
STC и CMC не работают. посмотрел в исходник - там ж-а. примерьі тоже г-о.
источник

RR

Rokker Ruslan in Ассемблер
), а вы не смотрите в браузере, они же минифицированы (это нормально), смотрите на гитхабе (https://github.com/rokkerruslan/i8080/blob/master/web/src/emulator/index.ts#L1644)
источник

楽園松本 in Ассемблер
Timka
int main() {
   int n, k;
   scanf("%d%d", &n, &k);
   int mx = 1;
   for (int i = 0; i < n; ++i)
       mx *= k;
   int* out = malloc(n, sizeof(int));
   for (int x = 0; x < mx; ++x) {
       for (int i = 0; i < n; ++i) {
           out[n - i - 1] = x % k;
           x /= k;
       }
       for (int i = 0; i < n; ++i)
           printf("%d", out[i]);
       printf("\n");
   }
}
А как выглядит вывод?
источник

楽園松本 in Ассемблер
Счётчик
источник

楽園松本 in Ассемблер
источник

T

Timka in Ассемблер
楽園松本
А как выглядит вывод?
сам код проверил, там пара мелких багов
источник

T

Timka in Ассемблер
без них выводит числа подряд, как в условии
источник

FT

Fistashka Tryam in Ассемблер
Мужики привет, скажите что быстрее использовать в цикле jzn или cmp ?
источник

楽園松本 in Ассемблер
Fistashka Tryam
Мужики привет, скажите что быстрее использовать в цикле jzn или cmp ?
Это разные вещи. Как можно в цикле обойтись без одной из низ?
источник

楽園松本 in Ассемблер
Ты имел в виду: loop или jmp? Loop очень медленный. Почему - хз
источник

FT

Fistashka Tryam in Ассемблер
Просто народ пишет что jnz работает быстрее
источник

FT

Fistashka Tryam in Ассемблер
Ребят помогите с кодом, честно скажу ассемблер пробухал в техникуме. Но азы немного знаю. Сейчас две процедурки скину
источник

FT

Fistashka Tryam in Ассемблер
Вот код которыqй переворачивает массив десятичных чисел
источник

FT

Fistashka Tryam in Ассемблер
asm
 push ebx
 mov ebx, [eax].TArrayInt.DataIn
 mov ecx, 6

@@loop :
 mov eax, 6
 sub eax, ecx

 mov eax, [ebx+eax*type integer]
 mov [edx+ecx*type integer], eax

 dec ecx
 jnz @@loop
 mov [ebx].TArrayInt.DataOut, edx
 pop ebx
end;
источник

FT

Fistashka Tryam in Ассемблер
6 элементов массива
источник

FT

Fistashka Tryam in Ассемблер
Первый элемент пока не понял почему не выдает
источник

FT

Fistashka Tryam in Ассемблер
Вот код с такой же конструкцией только через cmp
источник

FT

Fistashka Tryam in Ассемблер
asm
 push ebx
   mov ebx, [eax].TArrayIn.DataIn
   xor ecx, ecx

 @@loop :
   mov eax, 6
   sub eax, ecx

   mov eax, [ebx+eax*type integer]
   mov [edx+ecx*type integer], eax

   inc ecx
   cmp ecx, 6

 mov [ebx].TArrayInt.DataOut, edx
 pop ebx

end;
источник

FT

Fistashka Tryam in Ассемблер
Тут почему то выдает одни нули
источник