Abap新语法里替代loop at啥语法[破涕为笑]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Abap新语法里替代loop at啥语法[破涕为笑]相关的知识,希望对你有一定的参考价值。

参考技术A LOOP AT ITAB INTO。
在写代码的时候,一般不推荐用带表头的内表,因为ABAP里面很对语句中内表出现的位置也是工作区可以出现的位置,如IF itab IS INITIAL就是判断工作区itab是否为空,而IF itab[] IS INITIAL才是判断内表是否为空。
在不带表头的内表中,如果要修改内表的内容,则可以用字段符号来方便操作,而不需要额外的MODIFY一下。

lea 0x4(%esp),%ecx 在 AT&T 语法中是啥意思?

【中文标题】lea 0x4(%esp),%ecx 在 AT&T 语法中是啥意思?【英文标题】:What does lea 0x4(%esp),%ecx mean in AT&T syntax?lea 0x4(%esp),%ecx 在 AT&T 语法中是什么意思? 【发布时间】:2010-08-13 23:00:13 【问题描述】:

lea 0x4(%esp),%ecx 在 at&t 汇编中是什么意思?

0x4(%esp) 到底是什么?

【问题讨论】:

【参考方案1】:

我是%esp + 0x4

LEA 代表加载有效地址。在这种情况下,这是一个简单的添加,如上所示。通常,人们和编译器不再真正使用它,因为 CPU 现在带有一个漂亮的地址生成单元(也称为 AGU),它允许您使用各种花哨的算法从寄存器和值计算地址。简而言之,无论您对 lea 做了什么,您现在都可以将其嵌入到任何其他指令中。

【讨论】:

呃,lea 指令仅占为我目前正在处理的代码生成的所有指令的不到 10%。确实,在 x86 上,您可以在加载或存储操作中嵌入任何 lea 操作(老实说,我对此表示怀疑),但代码仍然充满了不一定涉及加载或存储的指针运算。 是的,它允许您使用 x86 寻址模式的强大功能进行整数数学运算,而不仅仅是为加载/存储生成地址。但这是我所见过的关于这个事实的最倒退和最令人困惑的解释。不,你不能将额外的数学嵌入到另一条指令中。例如,如果我想实现eax << (edx*2 +1),我想要lea 1(%edx,%edx), %ecx; shl %cl, %eax。我无法编写一条 shl 指令,从某个预移位中获取 EAX 的移位计数并添加 EDX。 另见Using LEA on values that aren't addresses / pointers?。 LEA 唯一冗余的情况是您在加载或存储之前将其用于实际地址生成。那么是的,有时您可以直接对内存源操作数(甚至目标)使用复杂的寻址模式。尽管索引寻址模式在英特尔 Sandybridge 系列上效率较低:Micro fusion and addressing modes【参考方案2】:
lea ecx,[esp+4]

【讨论】:

我不是对你投反对票的人,但是,嗯,你知道直升机飞行员和微软技术支持的笑话吗? 我现在做。我认为问题是关于破译 at&t 语法【参考方案3】:

esp 是堆栈指针。 0x4 是偏移量。 AT&T 语法有command source, destination,这里的命令是LEA,即“加载有效地址”。

所以我们告诉 CPU 将地址“堆栈指针 + 4”加载到寄存器“ecx”中

【讨论】:

以上是关于Abap新语法里替代loop at啥语法[破涕为笑]的主要内容,如果未能解决你的问题,请参考以下文章

ABAP报表数据处理:内表数据汇总COLLECT和AT END OF、AT*

ABAP: AT ... ENDAT的使用

ABAP: AT ... ENDAT的使用

SAP常见查询组合

ABAP语法-At end of 和collect

abap语法中结构体与内表有啥区别?