【问题标题】:ARM Assembly Even or Odd Number in RegisterARM 汇编寄存器中的偶数或奇数
【发布时间】:2014-02-14 20:22:26
【问题描述】:

我目前有一个“循环”,用于从 R4 打印数字,然后使用 Stdout 将该数字移动到 R1。但是我只想打印出偶数。因此,如果我打印所有内容,例如,我的序列将输出为 2、3、5、6、7、9、10 ...等,但我只想打印偶数(2、6、10 ...等)

这是我想要的,但我不确定 ARM 程序集是否允许这样做:

  1. 检查R4看寄存器里面的数是否是偶数。
  2. 如果数字是偶数,则 MOV R1、R4 并使用 Stdout 代码打印出来。
  3. 否则,如果 R4 中的数字是奇数,则继续循环,直到指定的次数。

任何帮助将不胜感激..

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    一个数的偶数可以由它的第 0 位来确定。奇数有 1,偶数有 0。

    在 ARM 程序集中,要执行条件,您需要执行影响标志的算术运算。要检查单个位的值,您可以使用 1 进行 AND,或者使用 1 进行 TST。后者是没有目的地的 AND - 它执行按位与但丢弃结果。 所以,回顾一下:

    TST r4, #1 ; TST with 1, like AND with 1, will zero out all bits but the rightmost one
    BNE Odd ; zero flag not set - meaning it's odd
    MOV R1, R4
    
    ; Output... Do you know how?
    
    
    Odd:
    ; Continue with the loop...
    

    【讨论】:

    • 非常感谢,正是我想要的。另外,是否可以添加所有打印的偶数?我知道他们被移到了 R1,但是否可以将这些值存储在某个地方,然后使用 ADD 命令来添加所有存储的数字,以便我可以打印出结果?
    • 当然。指定一个寄存器作为总和,在循环之前初始化为零,在BNE 行和Odd 标签之间放置一个ADD rx, r4 行(这样它是有条件的)。
    • 如果不想使用额外的寄存器或丢弃原来的寄存器,可以使用TST(例如TST r4,#1)。
    • 感谢你们俩的帮助。我也可以得到所有偶数的加法。根据一些 ARM powerpoint,TST (R1, R2) 为 R1 和 R2 设置 cc,我不确定这意味着什么。
    • @user3311682 r1 AND r2 - 在布尔运算中,而不是语言连词。 TST 只是 ANDS 没有目标寄存器(设置标志但丢弃结果)
    【解决方案2】:
     AREA program,CODE,READONLY
    
          ENTRY
          MOV R5,#01 
          MOV R0,#01
          LDR R1,=array
          MOV R2,#06
    LBL   LDR R0,[R1],#4
    
          ANDS R0,R5
          ADDEQ R3,R3,#01
          ADDNE R7,R7,#01
          SUBS R2,R2,#01
          B CHECK
    CHECK CMP R2,#00
    
          BNE LBL
          B STP  
    STP B STP     
    
    array DCD  0x10, 0x02, 0x04, 0x06, 0x08, 0x12,, 0x12;
    
          END
    

    【讨论】:

    • 欢迎来到 Stack Overflow。当代码附有解释时,它会更有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何回答所提出的具体问题。见How to Answer
    • 请注意,大约七年前的现有答案有一个很好的解释。这个答案是否提供了新信息?
    • MOV R0,#01 的意义何在?在读取1 之前,R0 会无条件地被ldr 覆盖。另外,为什么在 R5 中放置一个常量而不是 ands r0, #1?此外,subs r2, #1 已经根据它的非零设置了标志; cmp 是多余的。 b check 也是 NOP;如果没有该分支,执行将已经到达下一条指令。 B STP before 无限循环也是如此。此外,为了提高效率,您可以只计算循环中的奇数并计算 even = n - odd
    • 硬编码静态数组的长度通常是不好的风格,而不是让汇编器为你计算它。你的MOV R2,#06 差了一个。或者实际上减了两个;在两个0x12 元素之间的 DCD 列表中有一个空元素。 IDK 如果0x12,, 0x12 实际上会在 ARMasm 中组装。大多数汇编程序都提供了一种方法来定义一个汇编时间常数,该常数等于两个位置之间的距离,例如array_len equ $ - array,或任何 ARMasm 使用的语法。
    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多