Сортировка наименьшего по наибольшему из трех чисел
В настоящее время я изучаю ассемблер. Я был в состоянии создать быструю короткую функцию, чтобы поменять местами два числа от наименьшего к наибольшему. Я применяю одну и ту же базовую основу, чтобы сделать это с тремя числами, но каждый раз, когда я выполняю сравнение, оно входит в бесконечный цикл. Я объявляю эту функцию с помощью *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