【问题标题】:Clarity About TST Instruction - ARM Assembly关于 TST 指令的清晰说明 - ARM 汇编
【发布时间】:2021-11-23 15:38:58
【问题描述】:

所以这里我有以下代码(ARMv6 程序集):

wait$: 
    ldr r2,[r0,#24] //read 32 bits from addr + 24 in r0 and store in r2
    tst r2,#0x80000000 //????
    bne wait$

我了解除tst 指令之外的所有行。我在网上做了一些研究,我能找到的最佳定义是:

测试一个寄存器是零还是负。在寄存器和自身之间执行逻辑与。

我在理解它的含义时遇到了一些困难,因此我尝试使 C 等同于 tst 指令,这就是我得到的:

if(valRead & 0x80000000 != 0){} 

上面的代码似乎不起作用。 tst 的更容易理解的定义是什么?在 C 中它的等价物是什么?

【问题讨论】:

  • 这澄清了你的问题? stackoverflow.com/questions/54131662/…
  • @Frankie_C 与我的定义几乎相同
  • TST 不会在寄存器与其自身之间执行逻辑与,而是使用第二个操作数并根据结果相应地设置零标志。 and 本身用于检查零结果。 C 定义是有效的,即使删除了!=0 部分。如果它对您不起作用,请检查 ValRead 是否与 ldr r2,[r0,#24] 相同。
  • volatile int *ptr = /*whatever is in r0*/; while (ptr[6] < 0);
  • C 代码不起作用,因为您的括号错误。 != 在 C 中的绑定比 & 更紧密。您需要编写 if ((valRead & 0x80000000) != 0) 或只写 if (valRead & 0x80000000) 才能使其工作。

标签: c assembly arm armv6


【解决方案1】:

tst 的更容易理解的定义是什么?在 C 中它的等价物是什么?

一些背景

C 中没有等价物,因为高级语言的工作方式与具有“状态寄存器”(例如 ARM 或 x86)的 CPU 不同:

在 C 或 C++ 等高级语言中,可以直接执行条件代码:

if(a < b) ...

在带有“状态寄存器”的 CPU 上,条件代码的执行分两步完成:

  • 在第一步中,您执行一些计算(例如a-b)。
    在所谓的“状态寄存器”中,CPU 存储了一些关于结果的“相关”信息(例如符号)。
  • 第二步,真正的条件代码执行完毕。
    这只能根据“状态寄存器”中的信息来完成。

一个简化的例子:

if(a &lt; b) ... 操作可以在具有“状态寄存器”的 CPU 上执行以下方式:

/* Subtract b from a */
c = a - b;
/* (a < b) means that (a - b) is negative */
if(status.last_result_was_negative) ...

...但是,不需要操作的结果(示例中为c)。

TSTCMP说明

要执行if(...) 操作,通常需要两个操作:

  • 减法:
    ==&lt;&gt;&lt;=&gt;=!= 需要它。
  • AND 操作:
    需要检查值中的某些位是否已设置:
    if(a &amp; 0x8000) ...

...在这两种情况下,都不需要运算结果(与运算的差异或结果)。

因此,有两条指令(CMPTST)执行运算(CMP 执行减法,TST 执行 AND 运算)但丢弃结果:

TST 操作执行 AND 操作,根据结果设置“状态寄存器”中的信息,但丢弃实际结果。

这在像if(a &amp; 0xF000) ... 这样的行中是有意义的,如果a &amp; 0xF000 操作的结果是否为零,您只对“状态寄存器”保存信息感兴趣,但您对实际结果不感兴趣a &amp; 0xF000.

if(valRead & 0x80000000 != 0){} 

你需要括号:

if((valRead & 0x80000000) != 0){} 

否则编译器会理解:

if(valRead & (0x80000000 != 0)){} 

... 等同于:

if((valRead & 1) != 0){} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 2022-08-11
    • 2019-12-09
    • 2011-02-18
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多