2017-01-09 62 views
-1

c = | a - b |를 반환하는 어셈블리 코드를 작성해야합니다. 내가 사용하도록 허용하고 유일한 명령은 다음과 같습니다이것을 보여주는 c = | a - b | 제한된 작업으로 assambly 사용

INC - 하나 개의 레지스터에 저장된 값을 올리기.

DIC - 하나 개의 레지스터에 저장된 값을 감소시킨다. 코드 (LABEL)의 점에

JNZ -Jump. 마지막 작업이 코드 줄 근처에서 수행되는 한 0이 아닙니다.

HALT - 코드를 중지.

당신이 원하는 (가능한 한 덜으로 사용하도록하는 것이 바람직하다) 모든 레지스터의 값이 0으로 초기화 될 때 당신은 많은 레지스터를 사용할 수 있습니다

.

나는 이것을하려고하지만 불행히도 나는 매번 붙어있다. 그게 내가 현재 가지고있는 작업은 다음과 같습니다

Label 3 
Dec a 
Jnz label 1 

Label 2 
Inc c 
Dec b 
Jnz label 2 
Dec c 
Halt 

Label 1 
Dec b 
Jnz label3 

Label4 
Inc c 
Dec a 
jnz label4 
Halt 

이 양수 만, 난 지금은 음수를 위해 무엇을해야하는지 아이디어가있다.

+0

어디서 붙어 있었습니까? 알고리즘을 알아 냈어? 가상 코드 또는 플로우 차트를 할 수 있습니까? – Jester

+0

예, 죄송합니다. – NotSure

+0

다시 편집하고 올바른 형식을 사용하도록 수정해야합니다. –

답변

1

음수 값으로 디버깅 했습니까? 나에게 어떤 조합에 대해서는 실제로 바르게 돌아서서 작동하는 것처럼 보입니다. 그러면 다른 사람들을 위해 다시 5-0과 같이하지 않을 것입니다.

나는 당신이 숫자는 2의 보수로 인코딩 된 비트와 음의 값의 양을 해결 한 실제와 같은 바이너리 CPU 아키텍처에 대해 이야기, 그래서 주변 작동 "뒤틀림"가정합니다.

그래서 ... 나는 당신이 할 수 있다고 생각 :

do { dec a, dec b } while jnz 
    ; that will achieve: a = a-b, b = 0 

    ; set b = a, d = -a 
set_b_and_d_from_a: 
    inc b 
    dec d 
    dec a 
    jnz set_b_and_d_from_a 

find_positive_value: 
    inc c 
    dec b 
    jnz find_positive_value_try_d_too 
    halt ; c = |a-b| for (a-b) >= 0 
find_positive_value_try_d_too: 
    dec d 
    jnz find_positive_value 
    halt ; c = |a-b| for (a-b) < 0 
; the positive value will take fewer "dec" to reach 
; so one of the halt is reached sooner 
; with "c" set to the number of "dec" used 

는 "label4는"그들에게 그들이 무엇을, 어떤 어떤 의미를 부여하는 "label1"을하지 마십시오.