Assembly ARM从寄存器打印十六进制数(不使用C)
我正在尝试计算ARM程序中包含字符串的元音,然后将以十六进制计算的元音数打印到控制台。我可以在寄存器r2中看到它正确计数(在本例中为0x2),但我正在做的事情是阻止数字传输到r0并正确打印。有人能给我指一下正确的方向吗?我不能使用任何C打印命令,只需SWI_WriteC打印到控制台。(注意:我在网上找到的所有东西都使用C来打印数字) 注意:这是我的第一篇文章,所以请原谅任何格式错误。我对ARM也很陌生(这是我的第一个项目)Assembly ARM从寄存器打印十六进制数(不使用C),assembly,arm,Assembly,Arm,我正在尝试计算ARM程序中包含字符串的元音,然后将以十六进制计算的元音数打印到控制台。我可以在寄存器r2中看到它正确计数(在本例中为0x2),但我正在做的事情是阻止数字传输到r0并正确打印。有人能给我指一下正确的方向吗?我不能使用任何C打印命令,只需SWI_WriteC打印到控制台。(注意:我在网上找到的所有东西都使用C来打印数字) 注意:这是我的第一篇文章,所以请原谅任何格式错误。我对ARM也很陌生(这是我的第一个项目) 提前感谢您提供的任何帮助 我怀疑SWI_WriteC将字符的ASCII码
提前感谢您提供的任何帮助 我怀疑SWI_WriteC将字符的ASCII码打印出来,然后将其打印到控制台。因此,如果输入时
r0
为2,它将打印代码为2的字符
但是,ASCII代码为2的字符不是数字2。它是非打印字符。数字2的ASCII码为50或0x32。事实上,数字0至9的代码为48至57或0x30至0x39,字母A至F位于65至70(0x41至0x46),小写字母A至F位于97至102(0x61至0x66)
因此,您需要的是一个例程,它获取0到15范围内的数字,将其转换为相关数字或字母的ASCII码,然后将该ASCII码传递给SWI_WriteC
假设你的元音不超过15个,那就行了。如果你有16个或更多,你的十六进制数将有两个或更多的数字,这是事情变得有点棘手的地方。这很接近,但是
ldrbr0,[r2],PrintNumber
中的#1
正在加载地址的字节值,地址是元音的数量!这绝对不对。我们需要将其更改为mov r0,r2
,将r2
转换为r0
,这可能是SWI_WriteC
接受其参数的地方。非常感谢,就这样。我按照卢克的建议做了,还把它改成了mov r0,r2,效果很好!再次感谢你的帮助!
SWI_WriteC EQU &0 ;output character in r0
SWI_Exit EQU &11 ;finish program
ENTRY
Start ADR r1, text
MOV r2, #0 ;counter for number of vowels
BL ParseChar ;call to parse each character and test if vowel
BL PrintNumber ;call PrintNumber subroutine, prints number of vowels
ALIGN
SWI SWI_Exit ;finish
ParseChar LDRB r0,[r1], #1 ;load a character in r0
CMP r0, #0 ;testing if null
BNE TestChar ;if not null, TestChar subroutine
MOV pc, r14 ;if null, return
TestChar TEQ r0, #'a' ;test if character is an a
TEQNE r0, #'e' ;if not above, test if it is an e
TEQNE r0, #'i' ;if not above, test if it is an i
TEQNE r0, #'o' ;if not above, test if it is an o
TEQNE r0, #'u' ;if not above, test if it is a u
TEQNE r0, #'A' ;if not above, test if it is an A
TEQNE r0, #'E' ;if not above, test if it is an E
TEQNE r0, #'I' ;if not above, test if it is an I
TEQNE r0, #'O' ;if not above, test if it is an O
TEQNE r0, #'U' ;if not above, test if it is an U
ADDEQ r2, r2, #1 ;if vowel was found add 1 to R1
B ParseChar ;returns to ParseChar
PrintNumber LDRB r0, [r2], #1 ;load number from r2
SWI SWI_WriteC ;print
MOV pc, r14 ;return
text DCB "a1u",&0a,&0d,0
END