- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Delphi 移动目标的原子操作构建在 AtomicXXX
系列内部函数之上。 documentation说:
Because the Delphi mobile compilers do not support a built-in assembler, the System unit provides four atomic intrinsic functions that provide a way to atomically exchange, compare and exchange, increment, and decrement memory values.
这四个函数是:
其他提供原子操作的 RTL 函数,例如TInterlocked
的静态类方法类,是建立在这四个内在函数之上的。
对于面向 ARMv7 的移动编译器,这四个原子内在函数是否有任何对齐要求?如果有,它们是什么?
文档没有列出任何此类要求。然而,众所周知,该文档是不准确的,我没有信心将没有任何规定的要求作为不存在此类要求的明确证据。
顺便说一句,XE8 documentation for intrinsic functions声明桌面编译器不支持这些原子内在函数。这是不正确的——桌面编译器支持这些内在函数。
最佳答案
XE8编译
var
a: integer;
AtomicIncrement(a);
至
3e: 2201 movs r2, #1
40: 900c str r0, [sp, #48] ; 0x30
42: 910b str r1, [sp, #44] ; 0x2c
44: 920a str r2, [sp, #40] ; 0x28
46: 980b ldr r0, [sp, #44] ; 0x2c
48: e850 1f00 ldrex r1, [r0]
4c: 9a0a ldr r2, [sp, #40] ; 0x28
4e: 4411 add r1, r2
50: e840 1300 strex r3, r1, [r0]
54: 2b00 cmp r3, #0
56: d1f6 bne.n 46 <_NativeMain+0x46>
因此原子性是使用ldrex/strex来实现的.
如果我正在解释community.arm.com处的信息正确地,对于 4 字节操作(ldrd/strd),所需的对齐方式是 DWORD 对齐;对于 8 字节操作,所需的对齐方式是 QWORD 对齐。
其他原子函数以类似的方式实现,因此应适用相同的要求。
AtomicDecrement(a);
68: 980f ldr r0, [sp, #60] ; 0x3c
6a: e850 1f00 ldrex r1, [r0]
6e: 9a0e ldr r2, [sp, #56] ; 0x38
70: 1a89 subs r1, r1, r2
72: e840 1300 strex r3, r1, [r0]
76: 2b00 cmp r3, #0
78: d1f6 bne.n 68 <_NativeMain+0x68>
AtomicExchange(a,b);
82: 990f ldr r1, [sp, #60] ; 0x3c
84: 6008 str r0, [r1, #0]
86: 4873 ldr r0, [pc, #460] ; (254 <_NativeMain+0x254>)
88: 9a10 ldr r2, [sp, #64] ; 0x40
8a: 5880 ldr r0, [r0, r2]
8c: 6800 ldr r0, [r0, #0]
8e: f3bf 8f5b dmb ish
92: 900d str r0, [sp, #52] ; 0x34
94: 980f ldr r0, [sp, #60] ; 0x3c
96: e850 1f00 ldrex r1, [r0]
9a: 9b0d ldr r3, [sp, #52] ; 0x34
9c: e840 3200 strex r2, r3, [r0]
a0: 2a00 cmp r2, #0
a2: 910c str r1, [sp, #48] ; 0x30
a4: d1f6 bne.n 94 <_NativeMain+0x94>
AtomicCmpExchange(a, 42, 17);
ae: 990f ldr r1, [sp, #60] ; 0x3c
b0: 6008 str r0, [r1, #0]
b2: f3bf 8f5b dmb ish
b6: 202a movs r0, #42 ; 0x2a
b8: 2211 movs r2, #17
ba: 900b str r0, [sp, #44] ; 0x2c
bc: 920a str r2, [sp, #40] ; 0x28
be: 980f ldr r0, [sp, #60] ; 0x3c
c0: e850 1f00 ldrex r1, [r0]
c4: 9a0a ldr r2, [sp, #40] ; 0x28
c6: 4291 cmp r1, r2
c8: d105 bne.n d6 <_NativeMain+0xd6>
ca: 990b ldr r1, [sp, #44] ; 0x2c
cc: 9a0f ldr r2, [sp, #60] ; 0x3c
ce: e842 1000 strex r0, r1, [r2]
d2: 2800 cmp r0, #0
d4: d1f3 bne.n be <_NativeMain+0xbe>
关于delphi - 原子内在函数的对齐要求是什么(如果有)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173879/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!