我有以下反汇编:
mov BL, [EAX]
inc EAX
mov [EDX], BL
inc EDX
我可以看到这是以下结果:
uint8_t foo = bar;
++bar;
uint8_t tmp = foo;
++foo;
但这假设 C99。是否有其他一些 C 构造可以生成上面的代码?
我有以下反汇编:
mov BL, [EAX]
inc EAX
mov [EDX], BL
inc EDX
我可以看到这是以下结果:
uint8_t foo = bar;
++bar;
uint8_t tmp = foo;
++foo;
但这假设 C99。是否有其他一些 C 构造可以生成上面的代码?
如果您只想要答案而不需要解释,请滚动到本文底部。
该[register]符号代表“获取存储在其中的值register并将其解释为地址”。如果寻址的实体大小不明确,则可以使用DWORD PTR [register]forDWORD大小的指针(对于其他指针大小类似)进行澄清。
mov BL, [EAX]
此行将EAX寄存器中的值视为指向单个字节( 的大小BL)的指针,从该地址读取一个字节并将其存储在BL.
inc EAX
这一行增加 的值EAX,有效地前进到下一个字节。
mov [EDX], BL
该行将EDX寄存器中的值视为指向单个字节的指针(同样,另一个操作数的大小告诉我们这一点),并将存储的字节写入BL该地址。
inc EDX
这一行增加 的值EDX,前进到下一个字节。
有了所有这些信息,我们可以看到这个序列基本上将一个字节从一个地址复制到另一个地址。它很可能用于循环中,例如字符串复制或内存复制。如果有类似于test BL, BLafter 确定复制的字节是否为 NULL 的行,则很可能是字符串副本;如果有一个长度/地址检查 - 它可能是一个内存/缓冲区副本,可以处理指定数量的字节。
在 C 语言中,这可以表示为:
char t; // BL
char *src; // EAX
char *dst; // EDX
// initialize src and dst here
t = *src;
++src;
*dst = t;
++dst;
或者,正如 K&R 所说的那样:
*dst++ = *src++;