繁体   English   中英

在ARM Assembly中将整数转换为十六进制字符串

[英]Converting integer to hex string in ARM Assembly

我试图弄清楚如何将32位整数转换为其十六进制表示形式。 我知道我需要将最后4位分开,使用开关盒来查找它对应的十六进制字符。 然后我需要对4位中的每位重复此操作。 我正在努力寻找如何将4位中的每一个从LSB转换为MSB。 有人可以帮忙吗? 谢谢!

如注释中所建议的,屏蔽和移位将使您组成单词的各个半字节(半字节)。 但是,要使用putchar或等效字符打印数字,您需要将这些半字节转换为ASCII字符。 为此,您不需要“开关箱”(或者相当于汇编语言的“跳转表”)。 假设只有16个条目,则可以使用查找表,也可以有条件地将其添加到半字节中以形成字符。

ASCII数字0-9的字符代码为48-57。 大写字母的字符代码从A的65开始(小写字母的数字从97开始),当然0xA代表十进制值10。因此,如果其值为10或10,则可以将半字节转换为十六进制字符串更多,否则为48。 (等效地,无条件地添加48,如果结果值为58或更大,则再添加7。)

您需要从最高有效数字开始打印十六进制数字,这是该字的第28-31位中的半字节。 如果每次输出一个字符时将整个单词向左移4位,则位28-31将始终包含要处理的下一个半字节。

以下内容未经测试,就不在我头上了,因此不作任何保证,但这可能会使您走上正轨:

    ; Assume number to be converted is in r4.  Note r4 is clobbered

    ; Initialise loop counter
    MOV   r5, #8
.loop
    ; Take most significant nibble from r4 into r0
    MOV   r0, r4, LSR #28

    ; Shift r4 for next time
    MOV   r4, r4, LSL #4

    ; For each nibble (now in r0) convert to ASCII and print
    ADD   r0, r0, #48
    CMP   r0, #58              ; did that exceed ASCII '9'?
    ADDHS r0, r0, #7           ; add 'A' - ('0'+10) if needed
    BL    putchar

    ; Decrement loop counter, loop if not zero
    SUBS  r5, r5, #1
    BNZ   .loop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM