| # test source file for assembling to MACH-O |
| # build with : |
| # yasm -f macho machotest.asm |
| # gcc -o machotest machotest.c machotest.o |
| |
| # This file should test the following: |
| # [1] Define and export a global text-section symbol |
| # [2] Define and export a global data-section symbol |
| # [3] Define and export a global BSS-section symbol |
| # [4] Define a non-global text-section symbol |
| # [5] Define a non-global data-section symbol |
| # [6] Define a non-global BSS-section symbol |
| # [7] Define a COMMON symbol |
| # [8] Define a NASM local label |
| # [9] Reference a NASM local label |
| # [10] Import an external symbol (note: printf replaced by another call) |
| # [11] Make a PC-relative call to an external symbol |
| # [12] Reference a text-section symbol in the text section |
| # [13] Reference a data-section symbol in the text section |
| # [14] Reference a BSS-section symbol in the text section |
| # [15] Reference a text-section symbol in the data section |
| # [16] Reference a data-section symbol in the data section |
| # [17] Reference a BSS-section symbol in the data section |
| |
| .globl _lrotate # [1] |
| .globl _greet # [1] |
| .globl _asmstr # [2] |
| .globl _textptr # [2] |
| .globl _selfptr # [2] |
| .globl _integer # [3] |
| #.extern _druck # [10] |
| .comm _commvar, 4 # [7] |
| |
| .text |
| |
| # prototype: long lrotate(long x, int num); |
| _lrotate: # [1] |
| pushl %ebp |
| movl %esp, %ebp |
| movl 8(%ebp), %eax |
| movl 12(%ebp), %ecx |
| Llabel: roll %eax # [4] [8] |
| loop Llabel # [9] [12] |
| movl %ebp, %esp |
| popl %ebp |
| ret |
| |
| # prototype: void greet(void); |
| _greet: |
| movl _integer, %eax # [14] |
| incl %eax |
| movl %eax, localint # [14] |
| pushl _commvar |
| movl localptr, %eax # [13] |
| pushl (%eax) |
| pushl _integer # [1] [14] |
| pushl _printfstr # [13] |
| calll _druck # [11] |
| addl 16, %esp |
| ret |
| |
| .data |
| |
| # a string |
| _asmstr: .asciz "hello, world" # [2] |
| |
| # a string for Printf |
| _printfstr: .asciz "integer==%d, localint==%d, commvar=%d\n" |
| |
| # some pointers |
| localptr: .long localint # [5] [17] |
| _textptr: .long _greet # [15] |
| _selfptr: .long _selfptr # [16] |
| |
| # an integer |
| .lcomm _integer, 4 # [3] |
| |
| # a local integer |
| .lcomm localint, 4 # [6] |