歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

從匯編的角度分析C語言

C語言代碼:

[cpp]
  1. #include <stdlib.h>   
  2. #include <stdio.h>   
  3.   
  4. void main()  
  5. {  
  6.     char array1[] = { "123456" };  
  7.     char *pointer1 = "123456";  
  8. }  

匯編代碼:

[html]
  1. (gdb) disassemble main   
  2. Dump of assembler code for function main:  
  3.    0x08048394 <+0>:     push   %ebp  
  4.    0x08048395 <+1>:     mov    %esp,%ebp  
  5.    0x08048397 <+3>:     sub    $0x10,%esp  
  6.    0x0804839a <+6>:     movl   $0x34333231,-0xb(%ebp)  
  7.    0x080483a1 <+13>:    movw   $0x3635,-0x7(%ebp)  
  8.    0x080483a7 <+19>:    movb   $0x0,-0x5(%ebp)  
  9.    0x080483ab <+23>:    movl   $0x8048484,-0x4(%ebp)  
  10.    0x080483b2 <+30>:    leave    
  11.    0x080483b3 <+31>:    ret      
  12. End of assembler dump.  
  13. (gdb) x/7xb 0x8048484  
  14. 0x8048484 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00  
  15. (gdb)   

從<+6><+13><+19>三行可以看出,程序為array1分配了7bytes的內存空間,用來存儲“123456”+‘\0’。

而<+23>行表示將地址0x8048484賦給了pointer1,我們可以查看內存0x8048484之後內容,7bytes正好為“123456”+‘\0’,這裡pointer1只是一個指針,並沒有為其分配內存單元。
那麼下面的這段代碼就不難理解了。

[cpp]
  1. #include <stdlib.h>   
  2. #include <stdio.h>   
  3.   
  4. void main()  
  5. {  
  6.     char array1[] = { "123456" };  
  7.     char array2[] = { "123456" };  
  8.     char *pointer1 = "123456";  
  9.     char *pointer2 = "123456";  
  10. }  
匯編代碼:

[html]
  1. (gdb) disassemble main   
  2. Dump of assembler code for function main:  
  3.    0x08048394 <+0>:     push   %ebp  
  4.    0x08048395 <+1>:     mov    %esp,%ebp  
  5.    0x08048397 <+3>:     sub    $0x20,%esp  
  6.    0x0804839a <+6>:     movl   $0x34333231,-0xf(%ebp)  
  7.    0x080483a1 <+13>:    movw   $0x3635,-0xb(%ebp)  
  8.    0x080483a7 <+19>:    movb   $0x0,-0x9(%ebp)  
  9.    0x080483ab <+23>:    movl   $0x34333231,-0x16(%ebp)  
  10.    0x080483b2 <+30>:    movw   $0x3635,-0x12(%ebp)  
  11.    0x080483b8 <+36>:    movb   $0x0,-0x10(%ebp)  
  12.    0x080483bc <+40>:    movl   $0x8048494,-0x4(%ebp)  
  13.    0x080483c3 <+47>:    movl   $0x8048494,-0x8(%ebp)  
  14.    0x080483ca <+54>:    leave    
  15.    0x080483cb <+55>:    ret      
  16. End of assembler dump.  
  17. (gdb) x/7xb 0x8048494  
  18. 0x8048494 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00  
  19. (gdb)  

接著這段代碼也就順其自然了! [html]
  1. (gdb) disassemble  main   
  2. Dump of assembler code for function main:  
  3.    0x08048394 <+0>:     push   %ebp  
  4.    0x08048395 <+1>:     mov    %esp,%ebp  
  5.    0x08048397 <+3>:     sub    $0x20,%esp  
  6.    0x0804839a <+6>:     movl   $0x34333231,-0xf(%ebp)  
  7.    0x080483a1 <+13>:    movw   $0x3635,-0xb(%ebp)  
  8.    0x080483a7 <+19>:    movb   $0x0,-0x9(%ebp)  
  9.    0x080483ab <+23>:    movl   $0x34333231,-0x16(%ebp)  
  10.    0x080483b2 <+30>:    movw   $0x3635,-0x12(%ebp)  
  11.    0x080483b8 <+36>:    movb   $0x0,-0x10(%ebp)  
  12.    0x080483bc <+40>:    movl   $0x8048494,-0x4(%ebp)  
  13.    0x080483c3 <+47>:    movl   $0x804849b,-0x8(%ebp)  
  14.    0x080483ca <+54>:    leave    
  15.    0x080483cb <+55>:    ret      
  16. End of assembler dump.  
  17. (gdb) x/7xb 0x8048494  
  18. 0x8048494 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00  
  19. (gdb) x/9xb 0x804849b  
  20. 0x804849b <__dso_handle+11>:    0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38  
  21. 0x80484a3 <__dso_handle+19>:    0x00  
  22. (gdb)   
Copyright © Linux教程網 All Rights Reserved