| ; test source file for assembling to MACH-O |
| ; build with : |
| ; yasm -f macho -m amd64 machotest64.asm |
| ; gcc -m64 -o machotest64 machotest64.c machotest64.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 |
| ; [18] Perform a 64 Bit relocation in the text section |
| |
| [BITS 64] |
| [GLOBAL _lrotate] ; [1] |
| [GLOBAL _greet] ; [1] |
| [GLOBAL _asmstr] ; [2] |
| [GLOBAL _textptr] ; [2] |
| [GLOBAL _selfptr] ; [2] |
| [GLOBAL _integer] ; [3] |
| [EXTERN _druck] ; [10] |
| [COMMON _commvar 4] ; [7] |
| [GLOBAL _getstr] ; |
| [GLOBAL _readgreet] ; |
| |
| [SECTION .text] |
| |
| ; prototype: long lrotate(long x, int num); |
| _lrotate: ; [1] |
| push rcx |
| mov rax,rdi |
| mov rcx,rsi |
| .label rol rax,1 ; [4] [8] |
| loop .label ; [9] [12] |
| pop rcx |
| ret |
| |
| _getstr: |
| mov rax,qword _asmstr |
| ret |
| |
| _readgreet: |
| mov rax,[qword localint] ; [18] |
| ret |
| |
| _retrievelabel: |
| mov rax,[qword localptr] |
| ret |
| |
| ; prototype: void greet(void); |
| ; calls "void druck(a,b,c,d); |
| _greet mov rax,[_integer wrt rip] ; [14] |
| inc rax |
| mov [localint wrt rip],rax ; [14] |
| push rdi |
| push rsi |
| push rdx |
| push rcx |
| mov rdi,qword _printfstr |
| mov rsi,[_integer wrt rip] |
| mov rdx,[localptr wrt rip] |
| mov rdx,[rdx] |
| mov rcx,[_commvar wrt rip] |
| call _druck |
| pop rcx |
| pop rdx |
| pop rsi |
| pop rdi |
| ret |
| |
| ; some internal calls |
| call _greet |
| call _retrievelabel |
| |
| [SECTION .data] |
| |
| ; a string for Printf |
| _printfstr db "integer==%d, localint==%d, commvar=%d" |
| db 10, 0 |
| |
| ; some pointers |
| localptr dq localint ; [5] [17] |
| _textptr dq _greet ; [15] |
| _selfptr dq _selfptr ; [16] |
| |
| ;[section .data2 align=16] |
| |
| ; a string |
| _asmstr db 'hello, world', 0 ; [2] |
| |
| |
| |
| [SECTION .bss] |
| |
| ; an integer |
| _integer resq 1 ; [3] |
| |
| ; a local integer |
| localint resq 1 ; [6] |