1

我正在尝试在 ARM 程序中计算包含字符串的元音,然后将十六进制计数的元音数量打印到控制台。我可以在寄存器 r2 中看到它计数正确(在本例中为 0x2),但我正在做的事情是阻止数字转移到 r0 并正确打印。有人可以指出我正确的方向吗?我不能使用任何 C 打印命令,只能使用 SWI_WriteC 打印到控制台。(注意:我能在网上找到的所有东西都使用 C 来打印数字)

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 

注意:这是我的第一篇文章,所以请原谅任何格式错误。我对 ARM 也很陌生(这是我的第一个程序)。

提前感谢您提供的任何帮助!

4

1 回答 1

0

我怀疑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 个或更多,你的十六进制数将有两个或更多数字,这就是事情变得有点棘手的地方。

于 2013-09-28T21:45:37.430 回答