2012-10-26 2 views
1

어셈블리 (pep8)에서 내 클래스 중 하나에 대한 프로그램을 작성하고 있습니다. 이 프로그램은 -32,768에서 32,767 사이의 정수를 취하여 이진 값을 출력합니다. 아래의 코드는 이진수를 거꾸로 출력하는 것을 제외하고는 작업을 수행합니다.어셈블리에서 이진을 이진으로 변환 (pep8) - 우아한 접근

이진수를 올바른 순서로 인쇄 할 수있는 우아한 방법이 있습니까? 즉, 모든 이진수를 로컬 변수에 저장하고 역순으로 인쇄하려고하지 마십시오.

 BR main 
int:    .EQUATE 0    ;local variable int 
out:    .EQUATE 2    ;local variable out 
index:   .EQUATE 4    ;local variable index 
stack:   .EQUATE 6    ;local variable for dynamic memory allocation 



main:   SUBSP  stack,i  ;allocate memmory 
       LDA   0,i   
       STA   index,s  ;initialize index 
       DECI  int,s  ;get user input and store it in num 
while:   LDA   index,s  ;while (num <= 16) 
       CPA   16,i   ; 
       BRGE  endWhile  ; 
       ADDA  1,i   ;index++ 
       STA   index,s  ; 
       LDA   int,s  ; 
       ANDA  0x0001,i  ;modulus 2 "%2" 
       STA   out,s  ; 
       DECO  out,s  ;output results 
       LDA   int,s  ; 
       ASRA      ;devide num by 2 
       STA   int,s  ; 

       BR   while  ; 
endWhile:  ADDSP  stack,i  ;deallocate memmory 
       STOP 
       .END 

답변

1

나는 조립이 특정 종류에 익숙하지 않은,하지만 당신이 왼쪽 값을 이동하고, 캐리 플래그 C을 선택하면 바이너리를 인쇄하면 모든 아키텍처에서 상대적으로 쉽다.

시프트 왼쪽으로 이동하면 가장 중요한 비트는 C이됩니다. 이제 다른 레지스터를 0으로 설정하고 을 돌려 소스 값을 왼쪽으로 옮긴 직후에 남겨 둡니다. 원래 값의 최상위 비트는 레지스터의 최하위 비트에 지금 :

Register C Value 
-------- - -------- 
00000000 x 11001010 // Initially 
00000000 1 10010100 // After left-shifting the value 
00000001 0 10010100 // After left-rotating the register 

출력 레지스터는 제로로 다시 설정하고, 계속. 그러면 올바른 순서로 비트가 출력됩니다.

이 트릭은 어셈블리 프로그래머 만 사용할 수 있습니다. 캐리 플래그 C이 도달 할 수 없으므로 C/C++ 프로그래머는 액세스 할 수 없습니다.

+0

답변 해 주셔서 감사합니다. 내가 취한 접근법 (2로 나누어 나머지를 저장)으로 동일한 결과물을 달성 할 수있는 방법이 있습니까? (나는 당신이 제안한 해결책이 온라인에 게시 된 것을 보았지만 원래의 접근 방식이 완전히 달랐기 때문에 부정 행위가 느껴지는 것을 보았습니다.) 귀하의 도움에 감사드립니다. – Zzz

+0

@Azzi이 방법을 사용하는 것이 어떤 종류의 속임수라고 생각하지 않습니다. "온라인"이전에 잘 돌아 왔습니다. 예를 들어, 저는 25 년 전 6502 년에 고등학교에서 그것을 배웠지 만, 그 전에는 널리 사용되어 왔습니다. 최소한의 수정으로 메소드를 사용하고 싶다면 'ANDA 0x8000, i'를 사용하여 가장 높은 비트를 추출한 다음 두 번 왼쪽으로 회전하여 최상위 비트를 최하위 위치로 가져옵니다. – dasblinkenlight

+0

도움을 주셔서 감사합니다 :) – Zzz