aoutso.asm
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. ; test source file for assembling to NetBSD/FreeBSD a.out shared library
  2. ; build with:
  3. ;    nasm -f aoutb aoutso.asm
  4. ;    ld -Bshareable -o aoutso.so aoutso.o
  5. ; test with:
  6. ;    cc -o aoutso aouttest.c aoutso.so
  7. ;    ./aoutso
  8. ; This file should test the following:
  9. ; [1] Define and export a global text-section symbol
  10. ; [2] Define and export a global data-section symbol
  11. ; [3] Define and export a global BSS-section symbol
  12. ; [4] Define a non-global text-section symbol
  13. ; [5] Define a non-global data-section symbol
  14. ; [6] Define a non-global BSS-section symbol
  15. ; [7] Define a COMMON symbol
  16. ; [8] Define a NASM local label
  17. ; [9] Reference a NASM local label
  18. ; [10] Import an external symbol
  19. ; [11] Make a PC-relative call to an external symbol
  20. ; [12] Reference a text-section symbol in the text section
  21. ; [13] Reference a data-section symbol in the text section
  22. ; [14] Reference a BSS-section symbol in the text section
  23. ; [15] Reference a text-section symbol in the data section
  24. ; [16] Reference a data-section symbol in the data section
  25. ; [17] Reference a BSS-section symbol in the data section
  26.   BITS 32
  27.   EXTERN __GLOBAL_OFFSET_TABLE_
  28.   GLOBAL _lrotate:function ; [1]
  29.   GLOBAL _greet:function ; [1]
  30.   GLOBAL _asmstr:data _asmstr.end-_asmstr ; [2]
  31.   GLOBAL _textptr:data 4 ; [2]
  32.   GLOBAL _selfptr:data 4 ; [2]
  33.   GLOBAL _integer:data 4 ; [3]
  34.   EXTERN _printf ; [10]
  35.   COMMON _commvar 4 ; [7]
  36.   SECTION .text
  37. ; prototype: long lrotate(long x, int num);
  38. _lrotate: ; [1]
  39.   push ebp
  40.   mov ebp,esp
  41.   mov eax,[ebp+8]
  42.   mov ecx,[ebp+12]
  43. .label   rol eax,1 ; [4] [8]
  44.   loop .label ; [9] [12]
  45.   mov esp,ebp
  46.   pop ebp
  47.   ret
  48. ; prototype: void greet(void);
  49. _greet   push ebx ; we'll use EBX for GOT, so save it
  50.   call .getgot
  51. .getgot:  pop ebx
  52.   add ebx,__GLOBAL_OFFSET_TABLE_ + $$ - .getgot wrt ..gotpc
  53.   mov eax,[ebx+_integer wrt ..got] ; [14]
  54.   mov eax,[eax]
  55.   inc eax
  56.   mov [ebx+localint wrt ..gotoff],eax ; [14]
  57.   mov eax,[ebx+_commvar wrt ..got]
  58.   push dword [eax]
  59.   mov eax,[ebx+localptr wrt ..gotoff] ; [13]
  60.   push dword [eax]
  61.   mov eax,[ebx+_integer wrt ..got] ; [1] [14]
  62.   push dword [eax]
  63.   lea eax,[ebx+_printfstr wrt ..gotoff]
  64.   push eax ; [13]
  65.   call _printf wrt ..plt ; [11]
  66.   add esp,16
  67.   pop ebx
  68.   ret
  69.   SECTION .data
  70. ; a string
  71. _asmstr   db 'hello, world', 0 ; [2]
  72. .end
  73. ; a string for Printf
  74. _printfstr db "integer==%d, localint==%d, commvar=%d"
  75.   db 10, 0
  76. ; some pointers
  77. localptr  dd localint ; [5] [17]
  78. _textptr  dd _greet wrt ..sym ; [15]
  79. _selfptr  dd _selfptr wrt ..sym ; [16]
  80.   SECTION .bss
  81. ; an integer
  82. _integer  resd 1 ; [3]
  83. ; a local integer
  84. localint  resd 1 ; [6]