同样的C代码为什么在64位的机器上汇编出来的汇编程序的行数比在32位机器上汇编出来的程序的行数要多?

[复制链接]
查看11 | 回复1 | 2010-6-15 09:56:33 | 显示全部楼层 |阅读模式
同样的C代码为什么在64位的机器上汇编出来的汇编程序的行数比在32位机器上汇编出来的程序的行数要多?要运行的指令多了速度还能更快?多出来的代码是在干什么?

tmp3.c:

#include

int add(int a,int b);

int

main()

{

int ret = add(2,3);

return 0;

}
int

add(int a,int b)

{

int i = 4;

return a+b+i;

}

32位机器上汇编出来的程序源码:

tmp3_32.s(共33行):

.file
"tmp3.c"

.text

.globl main

.type
main, @function

main:

pushl
%ebp

movl
%esp, %ebp

andl
$-16, %esp

subl
$32, %esp

movl
$3, 4(%esp)

movl
$2, (%esp)

call
add

movl
%eax, 28(%esp)

movl
$0, %eax

leave

ret

.size
main, .-main

.globl add

.type
add, @function

add:

pushl
%ebp

movl
%esp, %ebp

subl
$16, %esp

movl
$4, -4(%ebp)

movl
12(%ebp), %eax

movl
8(%ebp), %edx

leal
(%edx,%eax), %eax

addl
-4(%ebp), %eax

leave

ret

.size
add, .-add

.ident
"GCC: 4.4.3"

.section
.note.GNU-stack,"",@progbits
64位机器上汇编出来的程序源码:

tmp3_64.s(共47行):

.file
"tmp3.c"

.text

.globl main

.type
main, @function

main:

.LFB0:

.cfi_startproc

pushq
%rbp

.cfi_def_cfa_offset 16

movq
%rsp, %rbp

.cfi_offset 6, -16

.cfi_def_cfa_register 6

subq
$16, %rsp

movl
$3, %esi

movl
$2, %edi

call
add

movl
%eax, -4(%rbp)

movl
$0, %eax

leave

ret

.cfi_endproc

.LFE0:
晕死,又超过字数限制了,不能全部贴上来。。。

回复

使用道具 举报

千问 | 2010-6-15 09:56:33 | 显示全部楼层
64 位架构主要的缺点是,相对于 32 位架构,占用相同的数据会消秏更多的内存空间(由于肿胀的指针,以及其它型态和对齐补白等可能)。这会增加进程对内存的需求,且可能会影响高效能处理器高速缓存的使用。维持一部分的 32 位模型是一个处理方法,且大致合理有效。实际上,高效能导向的 z/OS 操作系统便采取这个方法,要求程序代码存放在 32 位地址空间的任一数字,数据对象则可(选择性)存放在 64 位区域。 目前主要的商业软件是建立在 32 位代码,而非 64 位代码,所以不能取得在 64 位处理器上较大的 64 位地址空间,或较宽的 64 位寄存器和数据路径的优点。然而,免费或自由软件操作系统的使用者已经可以使用专有的 64 位运算环境。并非所
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行