歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 從匯編的角度分析C語言

從匯編的角度分析C語言

日期:2017/3/1 10:30:14   编辑:Linux編程

C語言代碼:

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

匯編代碼:

[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. void main()
  4. {
  5. char array1[] = { "123456" };
  6. char array2[] = { "123456" };
  7. char *pointer1 = "123456";
  8. char *pointer2 = "123456";
  9. }
匯編代碼:

[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