• 6475阅读
  • 5回复

【原创】JAVA与C++在汇编层次上的代码 [复制链接]

上一主题 下一主题
离线fanyu
 
只看楼主 倒序阅读 楼主  发表于: 2005-09-22
以下是来自C++的。
     .file      "b.cpp"
     .def      ___main;      .scl      2;      .type      32;      .endef
     .text
     .align 2
.globl _main
     .def      _main;      .scl      2;      .type      32;      .endef
_main:
     pushl      %ebp
     movl      %esp, %ebp
     subl      $8, %esp
     andl      $-16, %esp
     movl      $0, %eax
     addl      $15, %eax
     addl      $15, %eax
     shrl      $4, %eax
     sall      $4, %eax
     movl      %eax, -4(%ebp)
     movl      -4(%ebp), %eax
     call      __alloca
     call      ___main
     movl      $0, %eax
     leave
     ret
以下代码来自Java的
     .file      "c.class"
     .stabs      "E:/C++/MingW/temp/",100,0,0,Ltext0
     .stabs      "c.class",100,0,0,Ltext0
     .text
Ltext0:
     .stabs      "gcc2_compiled.",60,0,0,0
     .stabs      "java.lang.Class:T(0,1)=s120!1,020,(0,2)=xsjava.lang.Object:;next:/0(0,3)=*(0,1),32,32;name:/0(0,4)=*(0,5)=s4hash:(0,6)=@s16;r(0,6);0;65535;,0,16;length:(0,6),16,16;;,64,32;accflags:/0(0,6),96,16;superclass:/0(0,3),128,32;constants:/0(0,7)=s12size:(0,8)=r(0,8);0000000000000;0037777777777;,0,32;tags:(0,9)=*(0,10)=(0,10),32,32;data:(0,9),64,32;;,160,96;methods:/0(0,11)=*(0,12)=s20name:(0,4),0,32;signature:(0,4),32,32;accflags:(0,6),64,16;index:(0,6),80,16;ncode:(0,9),96,32;throws:(0,9),128,32;;,256,32;method_count:/0(0,13)=@s16;r(0,13);-32768;32767;,288,16;vtable_method_count:/0(0,13),304,16;fields:/0(0,14)=*(0,15)=s16name:(0,4),0,32;type:(0,3),32,32;accflags:(0,6),64,16;bsize:(0,6),80,16;info:(0,16)=u4boffset:(0,17)=r(0,17);-2147483648;2147483647;,0,32;addr:(0,9),0,32;;,96,32;;,320,32;size_in_bytes:/0(0,17),352,32;field_count:/0(0,13),384,16;static_field_count:/0(0,13),400,16;vtable:/0(0,18)=*(0,19)=s12class:(0,3),0,32;methods:(0,20)=ar(0,21)=r(0,21);0000000000000;0037777777777;;0;1;(0,9),32,64;;,416,32;otable:/0(0,22)=*(0,23)=ar(0,21);0;1;(0,17),448,32;otable_syms:/0(0,24)=*(0,25)=ar(0,21);0;1;(0,26)=s12clname:(0,4),0,32;name:(0,4),32,32;signature:(0,4),64,32;;,480,32;atable:/0(0,27)=*(0,20),512,32;atable_syms:/0(0,24),544,32;catch_classes:/0(0,9),576,32;interfaces:/0(0,28)=*(0,3),608,32;loader:/0(0,9),640,32;interface_count:/0(0,13),672,16;state:/0(0,29)=@s8;r(0,29);-128;127;,688,8;thread:/0(0,9),704,32;depth:/0(0,13),736,16;ancestors:/0(0,9),768,32;idt:/0(0,9),800,32;arrayclass:/0(0,9),832,32;protectionDomain:/0(0,9),864,32;hack_signers:/0(0,9),896,32;chain:/0(0,9),928,32;;",128,0,0,0
     .stabs      "java.lang.Class:Tt(0,1)",128,0,0,0
     .stabs      "java.lang.Object:Tt(0,2)=s4vtable:/0(0,18),0,32;;",128,0,0,0
     .stabs      "double:t(0,30)=r(0,17);8;0;",128,0,0,0
     .stabs      "float:t(0,31)=r(0,17);4;0;",128,0,0,0
     .stabs      "promoted_boolean:t(0,32)=@s32;-16;",128,0,0,0
     .stabs      "promoted_char:t(0,33)=@s32;-20;",128,0,0,0
     .stabs      "promoted_short:t(0,34)=r(0,34);-2147483648;2147483647;",128,0,0,0
     .stabs      "promoted_byte:t(0,35)=r(0,35);-2147483648;2147483647;",128,0,0,0
     .stabs      "boolean:t(0,36)=@s8;-16;",128,0,0,0
     .stabs      "char:t(0,37)=@s16;-20;",128,0,0,0
     .stabs      "void:t(0,10)",128,0,0,0
     .stabs      "unsigned long:t(0,38)=@s64;r(0,38);0000000000000;01777777777777777777777;",128,0,0,0
     .stabs      "unsigned int:t(0,8)",128,0,0,0
     .stabs      "unsigned short:t(0,6)",128,0,0,0
     .stabs      "unsigned byte:t(0,39)=@s8;r(0,39);0;255;",128,0,0,0
     .stabs      "long:t(0,40)=@s64;r(0,40);01000000000000000000000;0777777777777777777777;",128,0,0,0
     .stabs      "int:t(0,17)",128,0,0,0
     .stabs      "short:t(0,13)",128,0,0,0
     .stabs      "byte:t(0,29)",128,0,0,0
     .align 2
     .stabs      "c.java",130,0,0,0
     .stabs      "_ZN1c4mainEP6JArrayIPN4java4lang6StringEE:F(0,10)",36,0,0,__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
.globl __ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .def      __ZN1c4mainEP6JArrayIPN4java4lang6StringEE;      .scl      2;      .type      32;      .endef
__ZN1c4mainEP6JArrayIPN4java4lang6StringEE:
.stabn 68,0,0,LM1-__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
LM1:
LFB2:
     pushl      %ebp
LCFI0:
     movl      %esp, %ebp
LCFI1:
     subl      $8, %esp
LCFI2:
     movl      $__ZN1c6class$E, (%esp)
     call      __Jv_InitClass
     leave
     ret
LFE2:
Lscope0:
     .stabs      "",36,0,0,Lscope0-__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .align 2
     .stabs      "_ZN1cC1Ev:F(0,10)",36,0,0,__ZN1cC1Ev
.globl __ZN1cC1Ev
     .def      __ZN1cC1Ev;      .scl      2;      .type      32;      .endef
__ZN1cC1Ev:
.stabn 68,0,0,LM2-__ZN1cC1Ev
LM2:
LFB3:
     pushl      %ebp
LCFI3:
     movl      %esp, %ebp
LCFI4:
     subl      $8, %esp
LCFI5:
     movl      8(%ebp), %eax
     movl      %eax, (%esp)
     call      __ZN4java4lang6ObjectC1Ev
     leave
     ret
LFE3:
Lscope1:
     .stabs      "",36,0,0,Lscope1-__ZN1cC1Ev
     .section .rdata,"dr"
     .align 2
__Utf1:
     .word      1465
     .word      4
     .ascii "main"
     .space 1
     .align 2
__Utf2:
     .word      59434
     .word      22
     .ascii "([Ljava.lang.String;)V"
     .space 1
     .align 2
__Utf3:
     .word      626
     .word      6
     .ascii "<init>"
     .space 1
     .align 2
__Utf4:
     .word      39797
     .word      3
     .ascii "()V"
     .space 1
     .data
     .align 32
__MT_c:
     .long      __Utf1
     .long      __Utf2
     .word      16393
     .word      -1
     .long      __ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .long      0
     .long      __Utf3
     .long      __Utf4
     .word      16384
     .word      -1
     .long      __ZN1cC1Ev
     .long      0
.globl __ZTVN1cE
     .align 32
__ZTVN1cE:
     .long      0
     .long      0
     .long      __ZN1c6class$E
     .long      4
     .long      __ZN4java4lang6Object8finalizeEv
     .long      __ZN4java4lang6Object8hashCodeEv
     .long      __ZN4java4lang6Object6equalsEPS1_
     .long      __ZN4java4lang6Object8toStringEv
     .long      __ZN4java4lang6Object5cloneEv
     .align 4
__catch_classes_c:
     .long      0
     .long      0
     .long      0
     .long      0
     .space 8
     .section .rdata,"dr"
     .align 2
__Utf5:
     .word      99
     .word      1
     .ascii "c"
     .space 1
.globl __ZN1c6class$E
     .data
     .align 32
__ZN1c6class$E:
     .long      __ZTVN4java4lang5ClassE+8
     .long      0
     .long      __Utf5
     .word      32
     .space 2
     .long      __ZN4java4lang6Object6class$E
     .long      0
     .long      0
     .long      0
     .long      __MT_c
     .word      2
     .word      5
     .long      0
     .long      4
     .word      0
     .word      0
     .long      __ZTVN1cE+8
     .long      0
     .long      0
     .long      0
     .long      0
     .long      __catch_classes_c
     .long      0
     .long      0
     .word      0
     .byte      0
     .space 1
     .long      0
     .word      0
     .space 2
     .long      0
     .long      0
     .long      0
     .long      0
     .long      0
     .long      0
     .stabs      "c:Tt(1,1)=s4!1,020,(0,2);main::(1,2)=f(0,10):_ZN1c4mainEP6JArrayIPN4java4lang6StringEE;2A?;<init>::(1,3)=#(1,1),(0,10),(1,4)=*(1,1),(0,10);:_ZN1cC1Ev;2A.;;",128,0,0,0
     .stabn      162,0,0,0
     .def      __Jv_RegisterClass;      .scl      2;      .type      32;      .endef
     .text
     .align 2
     .stabs      "_GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE:f(0,10)",36,0,0,__GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .def      __GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE;      .scl      3;      .type      32;      .endef
__GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE:
.stabn 68,0,0,LM3-__GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
LM3:
LFB4:
     pushl      %ebp
LCFI6:
     movl      %esp, %ebp
LCFI7:
     subl      $24, %esp
LCFI8:
     movl      $__ZN1c6class$E, (%esp)
     call      __Jv_RegisterClass
     leave
     ret
LFE4:
Lscope2:
     .stabs      "",36,0,0,Lscope2-__GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .section      .ctors,"w"
     .align 4
     .long      __GLOBAL__I__ZN1c4mainEP6JArrayIPN4java4lang6StringEE
     .text
     .stabs "",100,0,0,Letext
Letext:
     .def      __ZN4java4lang6Object5cloneEv;      .scl      3;      .type      32;      .endef
     .def      __ZN4java4lang6Object8toStringEv;      .scl      3;      .type      32;      .endef
     .def      __ZN4java4lang6Object6equalsEPS1_;      .scl      3;      .type      32;      .endef
     .def      __ZN4java4lang6Object8hashCodeEv;      .scl      3;      .type      32;      .endef
     .def      __ZN4java4lang6Object8finalizeEv;      .scl      3;      .type      32;      .endef
     .def      __ZN4java4lang6ObjectC1Ev;      .scl      3;      .type      32;      .endef
     .def      __Jv_InitClass;      .scl      3;      .type      32;      .endef

以上结果是由GCC产生的,仅供参考。
离线XChinux

只看该作者 1楼 发表于: 2005-09-22
楼主帖一下源代码,C++和JAVA的源代码。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fanyu
只看该作者 2楼 发表于: 2005-09-22
好的,这就给出。
class c
{
public static void main(String[] arguments){
}      
}
以上是Java的,以下是C++的,也可以说是C的,但是用g++来生成的,可以按C++来处理。

int main()
{

}
离线XChinux

只看该作者 3楼 发表于: 2005-09-22
多得太多了。。。怪不得速度慢
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线fanyu
只看该作者 4楼 发表于: 2005-09-22
这是用g++生成的c代码(我没有找到C的编译器,就先用它了)
原程序还是它
int main()
{

}


     .file      "d.c"
     .def      ___main;      .scl      2;      .type      32;      .endef
     .text
.globl _main
     .def      _main;      .scl      2;      .type      32;      .endef
_main:
     pushl      %ebp
     movl      %esp, %ebp
     subl      $8, %esp
     andl      $-16, %esp
     movl      $0, %eax
     addl      $15, %eax
     addl      $15, %eax
     shrl      $4, %eax
     sall      $4, %eax
     movl      %eax, -4(%ebp)
     movl      -4(%ebp), %eax
     call      __alloca
     call      ___main
     leave
     ret
和上面的相比,你会发现以下的不同。
     .file      "b.cpp"
     .align 2
     movl      $0, %eax
这三行的不同,第一行是由于文件名不同,属正常。
后边行代码在C中是没有的,可见C的执行效率还是快于C++的。
离线XChinux

只看该作者 5楼 发表于: 2005-09-22
C和C++在函数的参数处理上不同,造成此区分
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个