MSVC,在c ++ 11,/ O1或/ O2之前
喜欢 memcpy(p,“ 111112244551”,n);
但是“ 111112244551”是立即值,不在“ rdata”部分。
汇编代码: eax指向堆内存区域,而不是堆栈内存
mov [eax+10h], 30303030h
mov [eax+14h], 31323334h
mov [eax+18h], 35353535h
mov [eax+1ch], 3334h
如何编写c / c ++代码?请
不要:
p [0] = xx; p [1] = xx; p [n] = xx ...
-
-
其他(来自IDA):
mov dword ptr [eax+10h], 41424344h
mov dword ptr [eax+14h], 45464748h
mov word ptr [eax+18h], 65h
我想要c / c ++代码。
答案 0 :(得分:4)
如何编写等于此机器代码的c / c ++代码?
通常不能。
C ++ 11(或C11)的semantics由各自的标准(对于C ++ 11,n3337,对于C11,n1570)定义而不是x86-64机器代码(或汇编程序)的代码。您可以要求其可观察的行为与您的汇编代码之一相似的C ++(或C)代码(但这是一个不同的问题)。
请注意compiler optimizations,sequence points,undefined behavior,decompilers的可能问题(它们解决了intractable或undecidable的问题,可证明等同于halting,code obfuscation和as-if rule的问题。另请参阅有关static source code analysis,malware analysis和Rice's theorem的信息。
您可能要问的(但这是一个非常不同的问题)是如何使某些特定的编译器(当然,版本和优化细节非常重要)生成特定的代码。通常没有答案(当然asm
指令除外,它们的解释和语义不是由标准定义,而是由您的特定编译器或C或C ++实现定义)。
请注意,编程语言是一种规范,而不是软件。
(所以您很困惑,严格来说,您的问题没有任何意义,所以不清楚)。
请注意,您的汇编代码可能是使用您认为已经使用过的编译器生成的。例如,后处理器可以在链接器之前“转换”汇编程序代码(并仍然保留原始的C或C ++语义)。