我有以下装配线(我还添加了一个 C 代码实现,我将如何在 C 中执行它):
.................
A: MOVSX EAX, BYTE PTR DS:[ECX] | while(ecx != NULL){
ADD EDX, EAX |
INC ECX | char *eaxPtr = *ecx;
CMP BYTE PTR DS:[ECX], 0x0 | int edxValue += *(int *)eaxPtr;
JNZ SHORT A | ecx++;
ADD EDX,0xB |
MOV EAX,EDX | }
SUB EAX,0xB | int eaxValue = edxValue;
RETN |
问题是我已经在寄存器 ECX 中存储了字符串“30;,;1,73,:2”。上面的例程所做的是遍历字符串并添加字符串的组成部分,例如 30 或 ANSCII 表示;等等在寄存器 EDX 中。结果,我在 EDX 中的值为 00000264。我不明白的是流水线的末端。尤其是以下几行:
ADD EDX,0xB
MOV EAX,EDX
SUB EAX,0xB
为什么我们先将 0xB 添加到寄存器 edx 中,然后将其存储到 eax,然后从 eax 中减去 0xB?整个相当于这一行:
MOV EAX,EDX
有人知道编译器为什么这样做吗?因为优化?还是有其他原因?
顺便说一句:我的 C 代码实现是否正确?