当前位置: 首页 > wzjs >正文

b2c电商平台的特点有哪些什么软件可以优化关键词

b2c电商平台的特点有哪些,什么软件可以优化关键词,禅城区企业网站建设,凡科网多页网站怎样做每一种实用的通用计算架构都存在有条件执行某些代码的机制。 例如,这种机制用于实现 C 语言中的 if 结构,此外还有其他一些不太常见的情况;与许多其他架构一样,Arm 也使用一组标记(flags)来实现条件执行&am…

每一种实用的通用计算架构都存在有条件执行某些代码的机制。 例如,这种机制用于实现 C 语言中的 if 结构,此外还有其他一些不太常见的情况;与许多其他架构一样,Arm 也使用一组标记(flags)来实现条件执行,这些标记存储了有关先前操作的状态信息。

案例

请看一段简单的 C 代码:

for (i = 10; i != 0; i--) {do_something();
}

编译器可按如下方式实现该结构:

mov r4, 10
loop_label:bl 		do_somethingsub 	r4, r4, #1cmp 	r4, #0bne 	loop_label

最后两条指令尤其值得关注。cmp指令将r40进行比较,如果cmp的结果是not equal(不等于),那么bne指令只是一条b(branch)条件指令。代码之所以能运行,是因为cmp指令设置了一些全局标志,表示操作的各种属性。而bne指令实际上只是一个带有 ne条件代码后缀的 b(branch)指令,通过读取这些标志来决定是否进行分支跳转。

下面的代码实现了一个更有效的解决方案:

mov r4, 10
loop_label:bl 		do_somethingsubs 	r4, r4, #1bne 	loop_label

sub 指令添加后缀 s 会使其根据运算结果自行更新标志。 这个后缀可以添加到许多(但不是所有)算术和逻辑运算中。

文章的后续,我将解释CPSR条件标志是什么、它们存储在哪里,以及如何使用条件代码来测试它们。

The Flags

设置条件标志的最简单方法是使用比较操作,如cmp。 这种机制在许多处理器架构中都很常见,而且 cmp的语义(如果不考虑细节的话)可能也很相似。此外,我们已经看到,许多指令(如示例中的 sub)都可以通过添加 s 后缀进行修改,并根据结果更新条件标志。 这一切都很好,但标志存储的是什么信息,我们又该如何访问这些信息呢?

附加信息存储在 APSR(应用处理器状态寄存器)CPSR(当前处理器状态寄存器)中,这些标记表示简单的属性,如结果是否为负数,并通过各种组合来检测更高层次的关系,如 "大于 "等。 描述完标记后,我将解释它们如何映射到条件代码(如上一示例中的 ne)。

Armv7 上,尽管APSR CPSR有不同的名称,但实际是一样的,仅几个条件标志是为APSR定义的,其他无法访问,所以无论如何都不应该直接访问APSP的其他位,APSR本质是对CPSR在应用层的精简。

注意:GCC < 4.3.3版本不支持APSR,如果要访问,则必须在汇编代码中使用CPSR


N: Negative

N标志置位:说明指令结果为负

Z: Zero

Z标志置位:说明指令结果为零

C: Carry (or Unsigned Overflow)

C标志置位:说明无符号运算的结果溢出 32 位寄存器(该位可用于实现 64 位无符号运算)

V: (Signed) Overflow

V标志置位原理和C标志一致都是溢出,但是有符号运算

例如,0x7fffffff是32位所表示最大的二进制整数,当0x7fffffff + 0x7fffffff会造成有符号溢出,此时V标志置位,但不是一个无符号溢出/进位 (0xfffffffe),所以C标志不置位。

标志设置案例

请看下面的例子:

ldr r1, =0xffffffff
ldr r2, =0x00000001
adds r0, r1, r2

操作计算的结果将会是0x100000000最高位会被丢弃,因为32位目标寄存器无法储存,所以最终的真实结果是:0x00000000,案例的标志位最终结果:

FlagExplanation
N = 0结果为0,被认为是正值,因此N(negative)位置0
Z = 1结果为0,所以Z(zero)位置1
C = 1由于运算结果无法容纳 32 位寄存器 最高位被丢弃,所以处理器会将 C(carry)位置 1
V = 0从二进制带符号的算术角度,0xffffffffff实际上表示-1,因此所做的运算实际上是(-1) + 1 = 0,该运算显然没有溢出,因此V(overflow)位置 0

如果你感兴趣,你可以通过ccdemo应用程序进行检查,输出类似:

$ ./ccdemo adds 0xffffffff 0x1
The results (in various formats):Signed:         -1 adds          1 =          0Unsigned: 4294967295 adds          1 =          0Hexadecimal: 0xffffffff adds 0x00000001 = 0x00000000
Flags:N (negative): 0Z (zero)    : 1C (carry)   : 1V (overflow): 0
Condition Codes:EQ: 1    NE: 0CS: 1    CC: 0MI: 0    PL: 1VS: 0    VC: 1HI: 0    LS: 1GE: 1    LT: 0GT: 0    LE: 1

如何读取标志

我们已经搞清楚如何去设置标志,但是去有条件执行一些代码的结果是什么?如果你不能去反应他们,那么去设置这些标志是无意义的。

最常见的测试标志的方式是使用条件执行指令,这个指令和其他结构是相似的,如果你熟悉其他指令,那么你可能识别,

我们已经知道了如何设置标记,但如何才能有条件地执行某些代码呢? 如果不能对标记做出反应,那么设置标记就毫无意义。

测试标记的最常用方法是使用条件执行代码。 这种机制与其他体系结构中使用的机制类似,因此,如果你熟悉其他机器,你可能会识别出以下模式,它与 C 的 if/else 结构一一对应:

cmp		r0, #20
bhi		do_something_else
do_someing:@ This code runs if (r0 <= 20).b 	continue		@Prevent do_something_else from executing.
do_something_else:@ This code runs if (r0 > 20).
continue:@ Other code

实际上,将其中一个条件代码附加到指令中,如果条件为真,指令就会执行。 否则,指令什么也不执行,基本上就是一个 nop

下表列出了可用的条件代码,其含义(标志位由cmpsubs指令设置)以及要测试的标志位:

CodeMeaning(for cmp or subs)Flags Tested
eqEqualZ==1
neNot equalZ==0
cs or hsUnsigned highter or same (or carry set)C==1
cc or loUnsigned Lower (or carry clear)C==0
miNegative. The mnemonic stands for “minus”N==1
plPositive or zero. The mnemonic stands for “plus”N==0
vsSigned overflow. The mnemonic stands for “V set”V==1
vcNo signed overflow. The mnemonic stands for “V Clear”V==0
hiUnsigned higher(C1)&& (Z0)
lsUnsigned lower or same(C0)&& (Z1)
geSigned greater than or equalN==V
ltSigned less thanN!=V
gtSigned greater than(Z0)&& (NV)
leSigned less than or equal(Z==1)|| (N!=V)
al(or ommitted)Always executedNone tested

前几个代码的原理非常明显,因为它们测试的是单个标志,但其他代码依赖于特定组合的标志。在实际操作中,你很少需要知道具体发生了什么,助记符掩盖了比较的复杂性。

下面是我之前给出的 for 循环代码示例:

mov r4, 10
loop_label:bl 		do_somethingsubs 	r4, r4, #1bne 	loop_label

现在应该很容易弄清楚这里到底发生了什么:

  • subs指令根据r4 - 1的结果设置标志。特别是,如果结果是0,Z标志位将被置位(Z=1),如果结果是其他,Z标志将被复位(Z=0)。
  • bne指令只有在ne条件为真的情况下才会执行,而只有当Z=0时,ne条件才为真,所以bne会遍历循环,直到Z被置1(即此时r4 = 0)。

专用比较指令

cmp指令(我们在第一个案例看到过)可以看做是一条不储存结果的sub指令;如果两个操作数相同,减法的结果将为零,因为eqZ标志之间存在映射关系。 当然,我们也可以使用假寄存器的sub指令,但只有在有空余寄存器的情况下才能这样做。 因此,专用比较指令非常常用。

实际上有四条专用比较指令,它们执行的操作如下表所示:

InstructionDescription
cmpWorks like subs, but does not store the result.
cmnWorks like adds, but does not store the result.
tstWorks like ands, but does not store the result.
teqWorks like eors, but does not store the result.

请注意,专门的比较操作不需要后缀 s;它们只更新标志,因此后缀是多余的。

结束语

虽然条件标志机制在原理上相当简单,但需要考虑的细节很多,看一些实际例子可能会有所帮助! 我将在今后的博文中介绍一些实际使用的例子。

[文章翻译来源]:condition-codes-1-condition-flags-and-codes

更好的翻译不如原文的表达精确,希望大家有能力的情况下,阅读英文原文章!

http://www.dtcms.com/wzjs/398114.html

相关文章:

  • 阿里巴巴做网站教程最近新闻热点大事件
  • 如何做网站报价百度seo怎么做网站内容优化
  • 网站建设电子商务课总结和体会网络舆情分析报告范文
  • 模板网站建设价格网站网址大全
  • 如何建立免费的网站百度网址大全下载到桌面
  • 新乐网站建设seo推广软件排行榜前十名
  • 视频网站开发 博客园百度搜索提交入口
  • 佛山网站建设公司怎么样营销运营主要做什么
  • 我的三次做网站的经历重庆黄埔seo整站优化
  • 网站建设未来发展前景泉州seo培训
  • 做网站banner教育培训平台
  • 商城网站栏目电脑优化软件推荐
  • 福永网站建设公司哪家好谷歌seo博客
  • 网站建设公司发展吴忠seo
  • 做c2c网站的弊端论述搜索引擎优化的具体措施
  • 中国做外贸网站有哪些佛山网站优化软件
  • 长沙网站推广公司我的百度账号
  • 企业网站建站系统搜索引擎网站入口
  • 网站备案图标代码营销是什么
  • 中文网站外链查询工具b站网页入口
  • 代做机械设计的网站成都网站seo推广
  • 江苏网站备案要多久东莞网络公司代理
  • 把域名解析到其他网站的ip上海网站seo快速排名
  • 不符合网站外链建设原则的是网络营销推广8种方法
  • vs网站毕业设计怎么做seo网站优化优化排名
  • 象刀设计网站上海网络推广
  • 建e室内设计网玄关seo引擎优化方案
  • 网站评价及优化分析报告河南网站优化
  • 网站名词排名怎么做石家庄seo外包公司
  • 厦门市建设局网站规划标准seo全网推广