1

我正在为我的一个程序集(pep8)中的一个课程编写程序。该程序应该接受一个介于 -32,768 和 32,767 之间的整数,并输出它的二进制等价物。下面的代码完成了这个任务,只是它向后打印了二进制数。

有没有一种优雅的方式让我以正确的顺序打印二进制数(即我不想将每个二进制数字存储在局部变量中,然后以相反的顺序打印它们)。

        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
4

1 回答 1

2

我不熟悉这种特殊的程序集,但是如果您将值左移并检查进位标志,则在所有体系结构中打印出二进制文件都相对容易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超出了他们的范围。

于 2012-10-26T18:24:44.213 回答