ARM汇编子程序

问题描述 投票:1回答:1

我在使用汇编语言时遇到了一些困难,不幸的是,当我在Google上搜索信息时,找不到任何可以帮助我解决问题的信息。我已经编写了这段代码,我正在寻求帮助,以查看是否有一种方法可以使它更简单(如果可能)。另外,如果评论有误,请让我知道。

        NAME main
        PUBLIC main
        SECTION .text: CODE (2)
        THUMB

main    
        LDR R4, =0x0097         ; R4 = 97 in hex 
        BL SUBROUTINE           ; Go to Subroutine

STOP    B STOP

SUBROUTINE
        MOV R1, #1              ; Initialize R1 to 1        
        MOV R2, #0              ; Initialize R2 to 0        
        MOV R0, #0              ; Initialize R0 to 0        
        PUSH {R4}               

LOOP
        CMP R0, #8              ; Bits counter
        BEQ DONE                ; Go to DONE R0 = 8
        ADD R0, R0, #1          ; Calculates the bits
        AND R3, R4, R1          ; Checks if R3 = R4
        CMP R3, #1              ; Comparing result with 1
        BEQ ONE                 ; Jump to ONE
        LSR R4, R4, #1          ; Right shift by 1
        B LOOP

ONE
        ADD R6, R6, #1          ; Saving #1 in R6
        LSR R4, R4, #1          ; Right shift by 1
        B LOOP

RETURN0
        MOV R2, #0              
        POP {R4}
        B STOP

RETURN1
        MOV R2, #1
        POP {R4}
        B STOP

DONE
        CMP R6, #2
        BEQ RETURN0
        CMP R6, #4
        BEQ RETURN0
        CMP R6, #6
        BEQ RETURN0
        CMP R8, #8
        BEQ RETURN0
        B RETURN1

        END

任务如下:该子例程在寄存器R4中具有输入参数,并提供返回值寄存器R2中的值。该子例程将检查8个最小的奇偶校验输入参数的有效位。如果奇偶校验为偶数,则值为0为返回,如果奇偶校验为奇数,则返回值1。均等意味着一的数目是偶数,一的数目是奇数奇偶校验很奇怪。

提前感谢

assembly
1个回答
0
投票

下一次使用CODE(编辑器中的花括号)代替打印屏幕(例如,您无法从prtscn复制粘贴)。我从未使用过ARM汇编语言,但会使用这种方法:

  1. 与输入的前24位(如果不确定它们是否始终为0),则相加
  2. 将输入移动到任何GPR(例如R5)
  3. 将R5移至任何其他GPR(例如R6)
  4. 将R6的所有位除最低有效位之外
  5. 测试R6是否为零(如果不为零,则增加一些计数器)
  6. 逻辑右移R5
  7. 转到2。(重复八次)
  8. 您的柜台中有1个数字

这是我的方法。不过,我不确定这是否是最好的。应该更简单。如果ARM有任何一种方式可以进行进位轮换,那么它将更加容易(如果进位位为零,则可以跳过计数器的递增操作)。

© www.soinside.com 2019 - 2024. All rights reserved.