2013-03-03 3 views
2

현재 어셈블리 언어를 배우고 있습니다. 나는 가장 짧은 것에서 가장 큰 것까지 두 숫자를 교환하는 빠른 짧은 함수를 만들 수 있었다. 세 가지 숫자로이 작업을 수행 할 동일한 기본 토대를 적용하고 있지만 비교를 수행 할 때마다 무한 루프가됩니다. 이 함수는 *60을 사용하여 선언하고 있습니다. 어떻게 3 가지 숫자를 가장 적은 것부터 가장 큰 것으로 정확하게 정렬 할 수 있습니까? 또한, 동일한 기능을 추가 변경없이 두세 개의 숫자를 수행하는 방법이 있습니까?최소 세 자리 숫자 중 가장 큰 숫자로 정렬

몇 가지 어셈블리 프로그램은 구문이 약간 변경되었습니다. 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입니다.

나는 Little Man을 배운 적이 없지만 http://en.wikipedia.org/wiki/Little_man_computer을 기반으로합니다. 특정 줄 번호로 분기하는 것에 대해서는 아무 것도 보지 못했지만, 첫 번째 작업 예제를 기반으로 한 것처럼 보였습니다. 그 점을 이해하고 레이블을 적절히 번역 할 수 있습니다. (fingers crossed)

위키 피 디아 항목에는 의사 코드 사본이 여러 개 있지만 색인을 사용하는 것에 관해서 Little Man에서 아무것도 보지 못했기 때문에 Wikipedia 항목의 첫 번째 "최적화 버블 정렬"psuedocode에서 루프를 풀고 싶었습니다. 배열과 같은 메모리 위치에 액세스 할 수 있습니다. 배열이 순서대로 있는지 확인하지 않습니다.

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 

위키 피 디아 (Wikipedia)에 따르면, 리틀 맨 (Little Man)을 가장 잘 묘사 한 코드는 다음과 같습니다. 레이블을 수정해야 할 수도 있습니다. 내가 함수`안에 두 루프를 배치 할 수있는 경우는 다음 함수에 뛰어 것 주문해야있을 경우

  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

관련 문제