2010-09-19 1 views
2

Итак, я учусь программировать на языке ассемблера для абстрактной машины, очень похожей на URM Machine. УРМ машина имеет 3 основные инструкции (или 4 в некоторой литературе):
к нулю регистра: Z (R)
увеличивать регистр: S (R)
Чтобы перейти к строке или этикетку, если регистры R1 и r2 содержат одно и то же значение: J (r1, r2, l)
Теперь моя абстрактная машина еще слабее, потому что при прыжках она только сравнивает регистр и литерал 0.
Чтобы компенсировать это, можно назначить любое значение в регистр (не только нулевое, как в URM), так и основные арифметические операции.
Обе машины допускают бесконечное количество регистров.Определите, является ли число отрицательным (на языке URM, как язык)

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

Мой вопрос: как я могу проверить, является ли число отрицательным? Возможно ли это только с этими инструкторами?

Признаюсь, что я не очень умный с такого рода языков низкого уровня ...

Моя максимальная программа следующим образом: (вход идет на r1 и r2 и выход поступает на r3)

maximo(){ 
    r5 := r1 - r3  
    jump (r5,0,maxr2) 

    r5 := r2 - r4 
    jump (r5,0,maxr1) 


    r3 := r3 + 1 
    r4 := r4 + 1 
    jump (r1,r1,maximo) 
} 

maxr1(){ 
    r3 := r1 
} 

maxr2(){ 
    r3 := r2 
} 

Спасибо!

ответ

0

Go этот ответ на CSTheory:

Initialise х ← v и у ← -v. Затем увеличивайте как x, так и y параллельно до тех пор, пока один из них не будет равен 0.

К Jukka Suomela