Сортировка наименьшего по наибольшему из трех чисел

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

Некоторые ассемблерные программы имеют небольшие изменения в синтаксисе. ЗДЕСЬ - ссылка на учебную сборку компьютерного симулятора 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 

1 ответ

Решение

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

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

В записи Википедии есть несколько копий псевдокода, но я хотел развернуть циклы из первого псевдокода "Оптимизация пузырьковой сортировки" из записи Википедии, потому что в "Маленьком человечке" я ничего не видел об использовании индексов для доступа к областям памяти, которые вам нужны для массива. Там нет проверки, чтобы увидеть, если массив в порядке.

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
Другие вопросы по тегам