Публикувана е четвъртата задача. Срокът е до 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"
работят както трябва.
Трябва да сте влезли в системата, за да може да отговаряте на теми.