天邪299 2021-06-13 10:23 采纳率: 0%
浏览 14

急急急!!!哪位大神会做Arm??

你的ARM CPU为特定的指令产生四个主要的flag输出:

N - 负值

Z - 零

C - Carry

V - 溢出

提供最少的ARM指令,该指令将单独设置这些标志,同时清除所有其他标志。因此,你应该产生一个标志序列。

为了使你的生活更轻松,假设以下指令在你的指令之前被执行。提示:溢出标志是一个棘手的问题,它需要至少两条ARM指令。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解释一下为什么您的ARM CPU不提供算术-移位-左指令。

  • 写回答

1条回答 默认 最新

  • 新华 2024-03-17 18:43
    关注

    要单独设置ARM CPU的N、Z、C和V标志,同时清除所有其他标志,我们可以考虑一个具体的策略。下面的ARM指令示例基于通用ARM架构,适用于大多数ARM处理器。注意,确实需要至少两条指令来单独设置溢出(V)标志,因为它通常涉及算术运算的结果,而这些结果同时影响其他标志。以下是如何单独设置每个标志的示例指令:

    1. N(负值)标志设置,清除其他所有标志:
      先执行一个操作清除所有标志,然后设置N标志。
      ```c
      MOVS R0, #0 ; Clear flags with an operation that results in Z flag being set
      SUBS R0, R0, #1 ; Set N flag by subtracting 1, resulting in 0xFFFFFFFF (-1)
    
    这会导致N标志被设置(因为结果是负数),Z标志被清除(因为结果非零),C和V标志因此次操作而清除。
    
    2. Z(零)标志设置,清除其他所有标志:
    只需执行一个产生零结果的操作。
    ```c
    
    MOVS R0, #0    ; Result is 0, Z flag is set, N, C, V flags are cleared
    
    1. C(进位)标志设置,清除其他所有标志:
      首先执行一个操作来清除所有标志,然后通过一个逻辑操作设置C标志。
      ```c

    MOVS R0, #1 ; Clear flags
    LSLS R0, R0, #31 ; Logical left shift, setting the C flag on the final shift

    
    4. V(溢出)标志设置,清除其他所有标志:
    设置V标志需要至少两条指令,这通常通过执行可能导致算术溢出的操作来完成。
    ```c
    MOVS R0, #0x7FFFFFFF ; Set R0 to the maximum positive value for a signed 32-bit integer
    ADDS R0, R0, #1       ; Adding 1 causes an overflow, setting the V flag
    

    此操作同时可能设置其他标志,所以为了仅设置V标志并清除其他所有标志,我们需要采用一种方法来确保其他标志(N, Z, C)不被这个操作设置或者之后立即清除它们,但实际上在ARM指令集中很难通过单个指令序列完美实现这一点,因为设置V标志的操作通常也会影响到N、Z和C标志。

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置