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