2013-03-03 2 views
2

В настоящее время я изучаю язык ассемблера. Я смог создать быструю короткую функцию для замены двух чисел от наименьшего до наибольшего. Я применяю ту же основную основу, чтобы сделать это с тремя числами, но каждый раз, когда я выполняю сравнение, он переходит в бесконечный цикл. Я объявляю эту функцию, используя *60. Как правильно сортировать три числа от наименьшего до наибольшего? Кроме того, есть ли способ, чтобы одна и та же функция выполняла сортировку из двух и трех чисел без каких-либо дополнительных изменений?Сортировка наименьшего из трех чисел

Несколько программ сборки имеют небольшое изменение в синтаксисе. HERE - это ссылка учебного сборочного компьютерного симулятора Little Man, который я использую в настоящее время.

Работы Своп с двумя числами:

INP  //Input x number 
STO 99  //Store x number 
INP  //Input y number 
STO 98  //Store y number 
BR 60  //Jump to function *60 
HLT  //End run 
*60   //Number SWAP function 
LDA 99  //Load x 
STO 87  //Move x to mailbox 87 
LDA 98  //Load y 
STO 86  //Move y to mailbox 86 
SUB 87  //Subtract y - x 
BRP 71  //Branch to line 71 if result is positive 
LDA 86  //SUB 87 gives a negative result- then y is smallest number. Load y 
OUT  //Display y 
LDA 87  //Load x- the greater number. 
OUT  //Display x 
HLT  //End here since y > x 
LDA 87  //BRP 71 branches here- then x is smallest number 
OUT   //Display x 
LDA 86  //y is the greater number 
OUT *  //display y 

ответ

3

Это пузырьковая сортировка, http://en.wikipedia.org/wiki/Bubble_sort, потому что он использует код SWAP три раза.

Я никогда не узнал Маленького Человека, но на основе http://en.wikipedia.org/wiki/Little_man_computer это должно сработать. Я ничего не видел о ветвлении к определенным номерам строк, но, похоже, - на основе вашего первого рабочего примера - что у вас это есть и, надеюсь, можно соответствующим образом перевести метки. (скрещенные пальцы)

В записи в Википедии есть несколько копий псевдокода, но я хотел развернуть петли из первого псевегокода «Оптимизация Bubble Sort» из записи в Википедии, потому что я ничего не видел в Little Man об использовании индексов для доступа к ячейкам памяти, которые вам нужны для массива. Нет проверки, чтобы убедиться, что массив в порядке.

Load the three values into registers r91-r93 

// loop 1 step 1 
if r92-r91>0 then  
    do nothing 
else  // swap them, using a temp register 
    temp=r92 
    r92=r91 
    r91=temp 
end if 
// loop 1 step 2 
if r93-r92>0 then 
    do nothing 
else  // swap them, using a temp register 
    temp=r93 
    r93=r92 
    r92=temp 
end if 
// loop 2 step 1 
if r92-r91>0 then 
    do nothing 
else  // swap them, using a temp register 
    temp=r92 
    r92=r91 
    r91=temp 
end if 

Write out the registers in order: r91, r92, r93 

Вот такой же код в моем лучшем приближении Маленького Человека, согласно статье Википедии. Возможно, вам придется исправить метки.

  INP  // Read in the first value 
     STA 91  // store it 
     INP  // Read in the second value 
     STA 92  // store it 
     INP  // Read in the third value 
     STA 93  // store it 
     LDA 92  // LOOP 1, STEP 1: 
     SUB 91  // 
     BRP STEP2 // if r91 and r92 are in order, don't swap them 
     LDA 92  // Begin swapping registers 
     STA 99  // temp = r92 
     LDA 91 
     STA 92  // r92 = r91 
     LDA 99 
     STA 91  // r91 = temp 
STEP2 LDA 93  // LOOP 1, STEP 2 
     SUB 92 
     BRP STEP3 // If r92 and r93 are in order, don't swap them 
     LDA 93  // Begin swapping registers 
     STA 99  // temp = r93 
     LDA 92 
     STA 93  // r93 = r92 
     LDA 99 
     STA 92  // r92 = temp 
STEP3 LDA 92  // LOOP 2, STEP 1 
     SUB 91 
     BRP STEP4 // if r91 and r92 are in order, don't swap them 
     LDA 92  // Begin swapping registers 
     STA 99  // temp = r92 
     LDA 91 
     STA 92  // r92 = r91 
     LDA 99 
     STO 91  // r91 = temp 
STEP4 LDA 91  // Write out the sorted values 
     OUT 
     LDA 92 
     OUT 
     LDA 93 
     OUT 
     HLT  // stop 
+0

Вы случайно не знаете, если я могу поместить эти две петли внутри функции '* 60'' как мой своп two' пример, что путь, если есть необходимость заказать он будет переходить к функции, а затем порядок и прыгать назад, чтобы продолжить сравнение второго числа с третьим? – CodingWonders90

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