Home | History | Annotate | Download | only in nasm32
      1 ; test source file for assembling to MACH-O 
      2 ; build with :
      3 ;    yasm -f macho machotest.asm
      4 ;    gcc -o machotest machotest.c machotest.o
      5 
      6 ; This file should test the following:
      7 ; [1] Define and export a global text-section symbol
      8 ; [2] Define and export a global data-section symbol
      9 ; [3] Define and export a global BSS-section symbol
     10 ; [4] Define a non-global text-section symbol
     11 ; [5] Define a non-global data-section symbol
     12 ; [6] Define a non-global BSS-section symbol
     13 ; [7] Define a COMMON symbol
     14 ; [8] Define a NASM local label
     15 ; [9] Reference a NASM local label
     16 ; [10] Import an external symbol (note: printf replaced by another call)
     17 ; [11] Make a PC-relative call to an external symbol
     18 ; [12] Reference a text-section symbol in the text section
     19 ; [13] Reference a data-section symbol in the text section
     20 ; [14] Reference a BSS-section symbol in the text section
     21 ; [15] Reference a text-section symbol in the data section
     22 ; [16] Reference a data-section symbol in the data section
     23 ; [17] Reference a BSS-section symbol in the data section
     24 
     25 [BITS 32]
     26 [GLOBAL _lrotate]	; [1]
     27 [GLOBAL _greet]		; [1]
     28 [GLOBAL _asmstr]	; [2]
     29 [GLOBAL _textptr]	; [2]
     30 [GLOBAL _selfptr]	; [2]
     31 [GLOBAL _integer]	; [3]
     32 [EXTERN _druck]		; [10]
     33 [COMMON _commvar 4]	; [7]
     34 
     35 [SECTION .text]
     36 
     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 
     49 ; prototype: void greet(void);
     50 _greet
     51 	  mov eax,[_integer]	; [14]
     52 	  inc eax
     53 	  mov [localint],eax	; [14]
     54 	  push dword [_commvar]
     55 	  mov eax,[localptr]	; [13]
     56 	  push dword [eax]
     57 	  push dword [_integer]	; [1] [14]
     58 	  push dword _printfstr	; [13]
     59 	  call _druck		; [11]
     60 	  add esp,16
     61 	  ret
     62 
     63 ; some internal calls
     64 	call _greet
     65 	call _lrotate.label
     66 
     67 [SECTION .data]
     68 
     69 ; a string
     70 _asmstr	  db 'hello, world', 0	; [2]
     71 
     72 ; a string for Printf 
     73 _printfstr db "integer==%d, localint==%d, commvar=%d"
     74 	  db 10, 0
     75 
     76 ; some pointers
     77 localptr  dd localint		; [5] [17]
     78 _textptr  dd _greet		; [15]
     79 _selfptr  dd _selfptr		; [16]
     80 
     81 [SECTION .bss]
     82 
     83 ; an integer
     84 _integer  resd 1		; [3]
     85 
     86 ; a local integer
     87 localint  resd 1		; [6]
     88