Публикувана е четвъртата задача. Срокът е до 17:30 следващата сряда.
Успех!
P.S. От вас се иска само да имплементирате Asm.asm и инструкциите. Всички останали детайли по реализацията са по ваше усмотрение, стига да влизат в ограниченията.
Публикувана е четвъртата задача. Срокът е до 17:30 следващата сряда.
Успех!
P.S. От вас се иска само да имплементирате Asm.asm и инструкциите. Всички останали детайли по реализацията са по ваше усмотрение, стига да влизат в ограниченията.

Какво е очакваното поведение, ако има условен jmp без преди това да е имало cmp в програмата?
От една страна семантично има логика никога да не скача: примерно резултатът от последния cmp не е отрицателен, понеже не е имало последен такъв.
От друга - ако искаме да сме близо до asm логиката, където ZF и SF винаги имат някакви стойности трябва и мястото, където пазим резултата от последния cmp да има някаква първоначална стойност.
@Никола: Няма да тестваме такава ситуация. Очаквайте коректни програми – няма да има невалидни инструкции, пропуснати аргументи (например няма да има mov ax, или само inc) и т.н.
Иначе на мен ми се струва нормално флаговете да имат начална стойност, например 0. Но както казах, няма да има такива примери.
харесва ми задачата :)
Ако под Ruby така или иначе стои C, който може да изпълнява на място Assembler, то каква е нуждата да минаваме през DSL?
Ако под Ruby така или иначе стои C, който може да изпълнява на място Assembler, то каква е нуждата да минаваме през DSL?
Из условието:
Тъй като Ruby е език от много високо ниво самата идея да добавим подобна функционалност е в разрез с идеите, стоящи зад него. Затова пък ще можем да упражним създаване на DSL-и.
Няма „нужда“. Идеята на задачата не е да пускате истински Assembler, а да проиграте на Ruby нещо, което прилича на него.
Може ли малко подсказка. Няма да навлизам в подробности как точно съм тръгнал да я решавам, но срещам трудност с това, че когато имам примерно mov ax, 0, не знам как да използвам ax като указател към регистъра ax, ами на негово място получавам стойността на ax, т.е. ax е нещо, за което компилаторът търси стойност (гледа дали е метод или променлива). Как мога да направя така, че да не опитва да го оцени, ами просто да го вземе както е, а аз да мога да си го ползвам вече в тялото на mov?
@Александър: Подсказката ти е да видиш това предизвикателство и решенията към него. :-)
Да, и аз такива подозрения имах. Мерси :)
Предварително се извинявам за тъпия въпрос.
Предполагам, че след като jump инструкция ни върне на по-горна такава и програмата продължи изпълнението си, не трябва да минаваме втори път през същия този jump? Тоест, трябва да се премахне от инструкциите, които предсои да бъдат изпълнени, иначе ми се струва, че ще зацикли.
@Пламене, повдигнах въпроса точно защото по принцип това не би направило една asm програма некоректна. Благодаря все пак за отговора.
@Аделина, би трябвало да цикли.
@Аделина, Никола е прав – нищо не се премахва, програмата си цикли. Виж примера в условието.
Какъв трябва да е резултатът от изпълнението на asm в случай на зацикляне?
@Мария, няма да има примери със зацикляне. Няма нужда да проверявате за такива неща. Окей е да оставите "интерпретатора" си или да зацикли, или да хвърли някаква Ruby грешка, която би се появила при зацикляне. Накратко – не се грижете за това.
Възможно ли е да имаме label mov (или която и да е от другите инструкции)?
it "implements CMP" do
Asm.asm do
mov ax, 2
mov bx, 2
cmp ax, bx
je 5
mov cx, 3
mov dx, 3
end.should eq [2, 2, 0, 3]
end
Този тест леко е сгрешен, защото аз инструкция номер 5 не виждам, а се очаква dx да е 3.
Броенето на инструкциите започва от 0, като единствено label не се брои. Инструкцията номер 5 е mov dx, 3.
@Цани:
Възможно ли е да имаме
label mov(или която и да е от другите инструкции)?
Няма да има такива тестове. Изглежда гадно и некоректно, а некоректни програми няма да ви се подават за тестове.
Леле това за label-а е написано в описанието на jmp и от там си мисля, че всички джъмпове не са инструкции. Благодаря @Емануела
Жокерче как подадената стойност на label да не се третира като обект, тъй като такъв не съществува?
@Венцислав Няма как, трябва да ползваме method_missing . Естествено няма как да имаш стойности като label label или label dx. Ти решаваш какво ще е най-добре да правиш като се извика име на label.
Има ли в тестовете label с име някакво число или започващ с число?
@Ангел: няма, но не би трябвало да ви е проблем дори и да имаше.
@Ангел и @Пламен, всъщност, проблем може да има, тъй като име на локална променлива или метод не може да започва с число (синтактична грешка е) и това не може да го има:
5bar
Но, да, такива тестове и примери няма да има, както Пламен каза.
@Ангел - може просто да разгледаш случайте, когато where е integer или не е - where.is_a?(Integer). Поне при мен етикети от рода на "3" работят както трябва.
Трябва да сте влезли в системата, за да може да отговаряте на теми.