2012-10-26 50 views
1

我正在爲裝配中的其中一個類(pep8)編寫一個程序。該程序應該取-32,768到32,767之間的整數,並輸出其二進制等效值。下面的代碼完成了任務,除了向後打印二進制數字。在裝配(pep8)中將Int轉換爲二進制 - 一種優雅的方法

有沒有一種優雅的方式讓我以正確的順序打印二進制數(即我不想將每個二進制數字存儲在本地變量中,然後按相反順序打印)。

 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。現在將另一個寄存器設置爲零,並且旋轉在將源值左移之後它立即離開。原始值的最顯著位現在在寄存器的最低位顯著:

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

相關問題