在此问题中,我们将看到如何将8位BCD编号转换为其等效的二进制(十六进制)。BCD编号存储在位置20H。转换后,结果将存储在30H。
因此,让我们假设数据为D5H。程序将D5H的二进制值转换为BCD值213D。
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 94 |
21小时 | |
。 。 。 |
MOVR0,#20H; Initialize the address of the data MOVA,@R0;Get the data from an address, which is stored in R0 MOVR2,A; Store the content of A into R2 CLRA;Clear the content of A to 00H MOVR3,#00H LOOP: ADDA,#01H;increment A by 01H DAA; Decimal Adjust of the accumulator content INCR3; Increase R3 to keep track of the hex value CJNEA,02H,LOOP ;Run the loop until A = R2 MOVR0,#30H; Point the destination location MOVA,R3; Move R3 to A MOV@R0,A; Store A content to the memory location pointed by R0 HALT: SJMPHALT
这里的逻辑很简单。我们只是从内存中取出数字。并将该值存储到R2中。通过此值,我们可以在执行循环时进行比较。
首先将累加器(A)和寄存器R3设置为00H。因此,我们只是将A的值增加01H。我们可以使用 INC A指令来增加值,但是在这种情况下,可以通过使用 ADDA#01H来增加值。其背后的原因是INC指令不影响CY和AC标志。但是,使用 DA A指令进行十进制调整时需要这些标志。增加A的值后,将执行DA A指令以将值转换为十进制。通过使用该十进制值,我们可以与R2中存储的数字进行比较。在每次迭代中,R3的值增加1,这就像一个计数器。因此,最后,我们从寄存器R3获得输出。
输出结果
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 94 |
21小时 | |
。 。 。 | |
30小时 | 5E |
31小时 | |
。 。 。 |
我们也可以使用其他逻辑来做同样的事情。在这里,不需要其他循环即可完成任务。我们只是将BCD号码的第十位数字与0AH相乘。然后将第二个数字与结果相加以获得数字。
如果数字为94,则它将0AH乘以9。
(9 * 0AH) = 5AH, thenadding 4 with 5AH. (5AH + 4) = 5EH.
MOVR0,#20H; Initialize the address of the data MOVA,@R0; Get the data from an address, which is stored in R0 MOVR2,A;Store the content of A into R2 SWAPA; Swap the nibbles of A register ANLA,#0FH;Mask the Higher Nibble of A MOVB,0AH;Take 0AH = 10D into B MULAB ;Multiply A with B, and get result into A MOVA,R2;Copy R2 content to A ANLA,#0FH;Mask the higher nibble of A ADDA,R2 MOVR0,#30H;Point the destination location MOVA,R3;Move R3 to A MOV@R0,A;Store A content to memory location pointed by R0 HALT: SJMPHALT