我们已经看到了如何将十六进制数字转换为其等效的ASCII。在本节中,我们将看到如何将两字节(4位)的十六进制数字转换为ASCII。这些数字的每个半字节都转换为其ASCII值。
我们使用一个子例程将十六进制数字转换为ASCII。在此程序中,我们多次调用该子例程。
在内存中,我们在20H和21H位置存储2字节的十六进制数。转换后的ASCII值存储在位置30H到33H。
十六进制数是2FA9H。ASCII等效值为32 46 41 39。
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 2FH |
21小时 | A9H |
。 。 。 | |
30小时 | 00小时 |
31小时 | 00小时 |
32小时 | 00小时 |
33小时 | 00小时 |
。 。 。 |
MOVR0,#20H;set source address 20H to R0 MOVR1,#30H;Set destination address 30H to R1 MOVR5,#02H;Set the counter as 2 for 2-bytes LOOP: MOVA,@R0; Get the first byte from location 20H MOVR4,A; Store the content of A to R4 SWAPA; Swap Nibbles of A ANLA,#0FH; Mask upper nibble of A ACALL HEX2ASC; Call subroutine to convert HEX to ASCII MOV@R1,B; Store the ASCII to destination INCR1; Increment the dest address MOVA,R4; Take the original number again ANLA,#0FH; Mask upper nibble of A ACALL HEX2ASC ; Call subroutine to convert HEX to ASCII MOV@R1,B; Store the ASCII to destination INCR1; Increment the destination address INCR0; Increase R0 for next source address DJNZR5,LOOP ; Decrease the byte count, and iterate HALT: SJMP HALT ;Stop the program ;This is a subroutine to convert Hex to ASCII. It takes A and B registers. A is holding the input, and B is for output HEX2ASC: MOVR2,A; Store the content of A into R2 CLRC;Clear the Carry Flag SUBBA,#0AH;Subtract 0AH from A JCNUM ;When carry is present, A is numeric ADDA,#41H;Add41H for Alphabet SJMP STORE ;Jumpto store the value NUM: MOVA,R2;Copy R2 to A ADDA,#30H;Add 30H with A to get ASCII STORE: MOVB,A;Store A content to B RET
在此程序中,我们将数字带入累加器。然后,为了分别获取十六进制数字,我们将应用屏蔽逻辑。
在这里,HEX2 ASC子例程使用寄存器A和B。A的作用类似于输入自变量,而B用作输出。
输出结果
地址 | 值 |
---|---|
。 。 。 | |
20小时 | 2FH |
21小时 | A9H |
。 。 。 | |
30小时 | 32小时 |
31小时 | 46小时 |
32小时 | 41小时 |
33小时 | 39小时 |
。 。 。 |