组成原理的一个小疑问
我电脑cpu是Intel(R) Core(TM)2 Quad 64位的,意思应该就是数据总线是64根吧?64位意思是cpu可以同时处理一个64bit的数。
我的问题是:按理说在c中cpu可以将一个long long类型(64bit)的数以原操作的方式存入内存。应该是这样吧?但是我的实验的结果是,存一个64bit的数,cpu还是分了两步,第一步是先存高32位,第二步再存低32位,为什么会是这种结果?按道理说cpu一次就可以完成这个功能的呀?
希望哪位大神能详细的解释一下,谢谢
[解决办法]
http://blog.csdn.net/max_min_go/article/details/9149585
看看
[解决办法]
先看看芯片手册:Intel(R) Core(TM)2 Quad 64
确认一下地址总线/数据总线的宽度,接着看看寄存器宽度。
再接着看看你的编译器的实现,编译器参数是否支持64位等,
最后最直接的结构看反汇编,看看编译后的结果是用64位的指令操作码还是32位的指令操作码。
[解决办法]
64位CPU应该指寄存器是64位的,而总线宽度则不一定是64位
[解决办法]
有再次优化的可能性,但这个,准确来说我觉得称不上是优化,其实就是内部机制怎么处理这条指令而已吧。汇编这层差不多已经可以理解成机器指令的助记符了,一般观察程序内部行为也就观察到这一层了吧?难道lz的“存一个64bit的数,cpu还是分了两步,第一步是先存高32位,第二步再存低32位”是在其它某种更底层的途径观察得到的结论?
否则如果是来自汇编层观察的结果,那么我说这一层的结果只是编译器的劳动成果又有何问题?
是否64位程序这个我也不知道有没有明确的概念,不过不能因为有个类似64的编译选项就简单的认为编译器做了各种针对64位机的优化吧,还是要翻手册看看该版本的该编译指令到底做了什么。
[解决办法]
long long ==>rax , 64 位寄存器
edx:eax 2*32 位寄存器
r0, ~ r7, r8 ~r16
rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,
你只要查看汇编或者调试的时候,看下反汇编,就知道是32位,还是64位代码了
[解决办法]
很明显的问题,跟编译器和操作系统有关!
在64位系统上安装64位编译器就可以直接读写8BYTES的数据了。。。
我的编译器和os都是64位的
64位LINUX 编译器64位
int main()
{
long long var1=1;
long long var2=2;
var1=var2;
return 0;
}
mov QWORD PTR [rbp-0x10],0x1
mov QWORD PTR [rbp-0x8],0x2
mov rax,QWORD PTR [rbp-0x8]
mov QWORD PTR [rbp-0x10],rax