Методи обнови решението на 15.01.2014 14:52 (преди почти 11 години)
+class Object
+
+ def ax()
+ 'ax'
+ end
+
+ def bx()
+ 'bx'
+ end
+
+ def cx()
+ 'cx'
+ end
+
+ def dx()
+ 'dx'
+ end
+
+end
+module Jumps
+
+ def jmp(label)
+ if(labels_lookup_table[label] == nil)
+ @@operations_log.each(&:eval)
+ else
+ @@operations_log.each(&:eval)
+ end
+ end
+
+ def je(label)
+ end
+
+ def jne(label)
+ end
+
+ def jl(label)
+ end
+
+ def jle(label)
+ end
+
+ def jg(label)
+ end
+
+ def jge(label)
+ end
+
+end
+module Asm
+
+ include Jumps
+
+ def Asm.asm(&block)
+ @@registers = {'ax' => 0, 'bx' => 0, 'cx' => 0, 'dx' => 0}
+ @@flag = 0
+ @@operations_log = []
+ @@labels_lookup_table = {}
+ block.call
+ @@registers.values
+ end
+
+ def mov(destination_register, source)
+ if (@@registers[source] == nil)
+ @@registers[destination_register] = source
+ else
+ @@registers[destination_register] = @@registers[source]
+ end
+ @@operations_log << "mov #{destination_register}, #{source}"
+ end
+
+ def inc(destination_register, source = 1)
+ if (@@registers[source] == nil)
+ @@registers[destination_register] += source
+ else
+ @@registers[destination_register] += @@registers[source]
+ end
+ @@operations_log << "inc #{destination_register}, #{source}"
+ end
+
+ def dec(destination_register, source = 1)
+ if (@@registers[source] == nil)
+ @@registers[destination_register] -= source
+ else
+ @@registers[destination_register] -= @@registers[source]
+ end
+ @@operations_log << "dec #{destination_register}, #{source}"
+ end
+
+ def cmp(destination_register, source)
+ if (@@registers[source] == nil)
+ @@flag = (@@registers[destination_register] <=> source)
+ else
+ @@flag = (@@registers[destination_register] <=> @@registers[source])
+ end
+ @@operations_log << "cmp #{destination_register}, #{source}"
+ end
+
+ def label(label)
+ @@labels_lookup_table[label] = @@operations_log.size
+ end
+
+end
+
+include Asm
Използвал си клас променливи, което е лошо. Казвали сме го безброй пъти на лекции, включително и на последната сбирка. Това ще ти струва наказателни точки.
Наказателни точки ще има и за този include Asm
в края на програмата, защото това е една от анти-практиките, които показахме на лекции, свързана с решението на последното предизвикателство. Това го има и в слайдовете, от което следва, че не си прочел тези слайдове. Това също ще ти струва наказателни точки.
Освен тези неща, имаш ред други възможнисти за подобрения в кода и дизайна. Тъй като срокът на задачата току-що изтече, може да разгледаш решенията на колегите си, както и нашето (в GitHub е).