2014-08-27 2 views
4

Я работаю над школьным проектом, чтобы написать программу, которая обнаруживает зависимости данных после чтения в инструкциях по сборке. У меня есть список списков, содержащих инструкции.Python: скрипт для обнаружения данных Опасности

Одним из таких примеров приведен список таких, как
line1 = [[LD a8,0x8910] [мул а3, a2,8] [ЗЫ а3, a3,4] [добавить а3, а3, а8]]

Здесь последняя команда добавления зависит от результата сдвига влево (shl), который в свою очередь зависит от результата mul intsruction.

Я хотел бы мой код для вывода зависимости как {мул -> ш -> добавить}

Другой пример: line2 = [[добавить a3, a2, a1] [суб a4, a5, a6] [добавить a9, a2, a4]] выход: {добавить -> добавить} {суб -> добавить}

Я хочу удалить опкоды инструкции, чтобы получить line1 = [[a8, 0x8910] [a3, a2,8] [a3, a3,4] [а3, а3, а8]] и затем экстрагируют операнды назначени в dst_list = [a8, a3, a3, a3} и исходные операнды в другой список как src_list = [0x8910, [ a2,8], [a3,4], [a3, a8]]. Я собираюсь взять n-й элемент из src_list и сравнить с 0 по n-1 элементов dst_list и выводить индексы, когда они совпадают. Наконец, используйте словарь для вывода инструкций, соответствующих моим индексам. Правильно ли мой подход? Может ли кто-нибудь помочь мне в том, как добиться этого в python?

До сих пор я пытался:

dest = re.findall(r'\[(?=([a-z0-9.]+))',str(line)) 
src = re.findall(r'\,(?=([a-z0-9]+))', str(line)) 
for i in dest: 
        dst_list.append([i]) 
for j in src: 
        src_list.append(j) 

#psuedo code to find hazards 
for nth src_item in src_list: 
    for 0 to n-1 dst_items in dst_list: 
      if src_list[src_item] == dst_list[dst_item] 
       OUTPUT dst_item -> src_item 

re.findall выше, дает мне один список со всеми операндами назначения и другой список с исходными операндами (мне нужен список списков с 2 Src аргументов каждого инструкция в одном списке).

Как это достичь?

+0

Не могли бы вы пояснить, что последний бит? Мне тяжело следить за тем, что вам нужно, и тем, что вы получаете. также, если вы не используете какой-то синтаксический заменитель, который не похож на действительный код python. – user2085282

+0

Последняя часть - это всего лишь псевдокод. Re.findall возвращает один список src_list = [0x8910, a2, 8, a3, 4, a3, a8] вместо [0x8910, [a2,8], [a3,4], [a3, a8]] – Mohan

ответ

1

Итак, давайте сначала предположим, что ваши инструкции по сборке будут иметь последовательное форматирование и что они находятся в списке строк, поскольку в противном случае вам придется делать кучу предварительной обработки в любом случае и должны обрабатывать код и инструкцию op разбор.

[op_code dest,src1,src2,...,srcn] 

например:

line1 = ["ld a8,0x8910","mul a3,a2,8","shl a3,a3,4","add a3,a3,a8"] 

С, что мы можем сделать некоторые питона магии и даже не беспокоиться о регулярных выражениях.

def instruction_reader(op_string): 
    opcode,values = op_string.split(" ") 
    values_list = values.split(',') 
    dest = values_list[0] 
    src = values_list[1:] 

    return (opcode,dest,src) 

С, что теперь вы можете поместить данные в правильных ведрах через некоторого список итераторы

list_of_all = [instruction_reader(item) for item in line1] 
opcodes = [op[0] for op in list_of_all] 
dests = [dest[1] for dest in list_of_all] 
srcs = [src[2] for src in list_of_all] 

Теперь вы просто должны делать сравнение между Суданским Красным Полумесяцем и dests найти зависимости.

dep_list = [] 
for i,dest in enumerate(dests): 
    for src in srcs: 
     if dest in src: 
      dep_list.append(opcodes[i]) 

, который может быть уменьшен в список понимания

dep_list = [opcodes[i] for i,dest in enumerate(dests) for src in srcs if dest in src] 

стороне: Да, есть много красивее способов сделать это в Python, но я понял то, что это немного проще для чтения/синтаксического анализа было бы лучше в этом случае.

+0

You предположим, что форматирование - '[op_code src, dest1, dest2, ...]', но в 'command_reader()', переменная 'src = [" dest1 "," dest2 ", ...]' и 'dest = src'. –

+0

@ Yep_It's_Me кричит, вы правы, спасибо, исправит. Прочтите его объяснение неправильно. –

+0

@JeffLangemeier: Как вы указали, инструкции не всегда имеют формат dest, src, src. Некоторые инструкции могут иметь только один src и некоторые даже 3. Есть несколько инструкций, которые не принимают никаких аргументов. Условно извлечение кодов операций - выполнение задачи. Любой более простой способ справиться с этим? – Mohan

Смежные вопросы