Files
RedBear-OS/local/recipes/kde/kf6-syntaxhighlighting/source/autotests/input/highlight.asm-nasm
T

524 lines
13 KiB
Plaintext

; Example file for nasm.xml kate syntax file
; compile with `nasm example.asm -f elf -o example.o`
; and link with 'gcc example.o -o example`
; Public domain
; kate: hl Intel x86 (NASM);
section .data
hello dd 'Hello World', 0x0A, 0h
printf_param dd '%s', 0q
section .text
extern printf
global main
main:
push ebp
mov ebp, esp
push hello
push printf_param
call printf
mov eax, 0b
leave
ret
NULL EQU 0 ; Constants
STD_OUTPUT_HANDLE EQU -11
extern GetStdHandle ; Import external symbols
global Start ; Export symbols. The entry point
section .data ; Initialized data segment
Message db "Console Message 64", 0Dh, 0Ah
MessageLength EQU $-Message ; Address of this line ($) - address of Message
section .bss ; Uninitialized data segment
alignb 8
Written resq 1
section .text ; Code segment
Start:
sub RSP, 8 ; Align the stack to a multiple of 16 bytes
mov ECX, STD_OUTPUT_HANDLE
call GetStdHandle
mov qword [REL StandardHandle], RAX
sub RSP, 32 + 8 + 8 ; Shadow space + 5th parameter + align stack
; to a multiple of 16 bytes
mov RCX, qword [REL StandardHandle] ; 1st parameter
lea RDX, [REL Message] ; 2nd parameter
mov R8, MessageLength ; 3rd parameter
mov qword [RSP + 4 * 8], NULL ; 5th parameter
; Message Box, 64 bit. V1.02
.DisplayMessageBox:
xor ECX, ECX ; 1st parameter
lea RDX, [REL MessageBoxText] ; 2nd parameter
lea R8, [REL MessageBoxCaption] ; 3rd parameter
mov R9D, MB_YESNO | MB_DEFBUTTON2 ; 4th parameter. 2 constants ORed together
call MessageBoxA
cmp RAX, IDNO ; Check the return value for "No"
je .DisplayMessageBox
extern _GetStdHandle@4 ; Import external symbols
Start:
call _WriteFile@20
section .data ; Initialized data segment
Static1Colour dd 0F0F0F0h,
Edit2 resq 1
%define Screen.Width RBP - 160 ; 4 bytes
%define ClientArea RBP - 152 ; RECT structure. 16 bytes
mov dword [wc.cbSize], 80 ; [RBP - 136]
mov dword [wc.style], CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW ; [RBP - 132]
mov qword [wc.lpfnWndProc], RAX ; [RBP - 128]
mov qword [wc.hIcon], RAX ; [RBP - 104]
mov dword [RSP + 4 * 8], EAX ; X position, now centred
cmp qword [uMsg], WM_CLOSE ; [RBP + 24]
je WMCLOSE
call DestroyWindow ; Send a WM_DESTROY message
jmp Return.WM_Processed
mov EDX, 0604060h
call SetBkColor
mov EDX, 0005000h
db 0x55 ; just the byte 0x55
db 0x55,0x56,0x57 ; three bytes in succession
db 'a',0x55 ; character constants are OK
db 'hello',13,10,'$' ; so are string constants
dw 0x1234 ; 0x34 0x12
dw 'a' ; 0x61 0x00 (it's just a number)
dw 'ab' ; 0x61 0x62 (character constant)
dw 'abc' ; 0x61 0x62 0x63 0x00 (string)
dd 0x12345678 ; 0x78 0x56 0x34 0x12
dd 1.234567e20 ; floating-point constant
dq 0x123456789abcdef0 ; eight byte constant
dq 1.234567e20 ; double-precision float
dt 1.234567e20 ; extended-precision float
db 33
db (44) ; Integer expression
; db (44,55) ; Invalid - error
db %(44,55)
db %('XX','YY')
db ('AA') ; Integer expression - outputs single byte
db %('BB') ; List, containing a string
db ?
db 6 dup (33)
db 6 dup (33, 34)
db 6 dup (33, 34), 35
db 7 dup (99)
db 7 dup dword (?, word ?, ?)
dw byte (?,44)
dw 3 dup (0xcc, 4 dup byte ('PQR'), ?), 0xabcd
dd 16 dup (0xaaaa, ?, 0xbbbbbb)
dd 64 dup (?)
db `\u263a` ; UTF-8 smiley face
db `\xe2\x98\xba` ; UTF-8 smiley face
db 0E2h, 098h, 0BAh ; UTF-8 smiley face
buffer: resb 64 ; reserve 64 bytes
wordvar: resw 1 ; reserve a word
buffer: db 64 dup (?) ; reserve 64 bytes
wordvar: dw ? ; reserve a word
incbin "file.dat" ; include the whole file
incbin "file.dat",1024 ; skip the first 1024 bytes
incbin "file.dat",1024,512 ; skip the first 1024, and
; actually include at most 512
message db 'hello, world'
msglen equ $-message
buffer: db 'hello, world'
times 64-$+buffer db ' '
bndstx [rbx*1+rax+0x3], bnd0 ; GAS - '*1' indecates an index reg
VDIVPS zmm4, zmm5, dword [rbx]{1to16} ; single-precision float
VDIVPS zmm4, zmm5, zword [rbx] ; packed 512 bit memory
mov ax,200 ; decimal
mov ax,0200 ; still decimal
mov ax,0200d ; explicitly decimal
mov ax,0d200 ; also decimal
mov ax,0c8h ; hex
mov ax,$0c8 ; hex again: the 0 is required
mov ax,0xc8 ; hex yet again
mov ax,0hc8 ; still hex
mov ax,310q ; octal
mov ax,310o ; octal again
mov ax,0o310 ; octal yet again
mov ax,0q310 ; octal yet again
mov ax,11001000b ; binary
mov ax,1100_1000b ; same binary constant
mov ax,1100_1000y ; same binary constant once more
mov ax,0b1100_1000 ; same binary constant yet again
mov ax,0y1100_1000 ; same binary constant yet again
%define u(x) __?utf16?__(x)
%define w(x) __?utf32?__(x)
dw u('C:\WINDOWS'), 0 ; Pathname in UTF-16
dd w(`A + B = \u206a`), 0 ; String in UTF-32
db -0.2 ; "Quarter precision"
dw -0.5 ; IEEE 754r/SSE5 half precision
dd 1.2 ; an easy one
dd 1.222_222_222 ; underscores are permitted
dd 0x1p+2 ; 1.0x2^2 = 4.0
dq 0x1p+32 ; 1.0x2^32 = 4 294 967 296.0
dq 1.e10 ; 10 000 000 000.0
dq 1.e+10 ; synonymous with 1.e10
dq 1.e-10 ; 0.000 000 000 1
dt 3.141592653589793238462 ; pi
do 1.e+4000 ; IEEE 754r quad precision
mov rax,__?float64?__(3.141592653589793238462)
mov rax,0x400921fb54442d18
%define Inf __?Infinity?__
%define NaN __?QNaN?__
dq +1.5, -Inf, NaN ; Double-precision constants
dt 12_345_678_901_245_678p
dt -12_345_678_901_245_678p
dt +0p33
dt 33p
dq b * (a // b) + (a %% b)
call (seg procedure):procedure
call weird_seg:(procedure wrt weird_seg)
push dword 33
push strict dword 33
times (label-$) db 0
label: db 'Where am I?'
times (label-$+1) db 0
label: db 'NOW where am I?'
label1 ; some code
.loop
; some more code
jne .loop
ret
label1: ; a non-local label
.local: ; this is really label1.local
..@foo: ; this is a special symbol
label2: ; another non-local label
.local: ; this is really label2.local
jmp ..@foo ; this will jump three lines up
%define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \
THIS_VALUE
%define ctrl 0x1F &
%define param(a,b) ((a)+(a)*(b))
mov byte [param(2,ebx)], ctrl 'D'
mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
%define a(x) 1+b(x)
%define b(x) 2*x
mov ax,a(8)
%define foo (a,b) ; no arguments, (a,b) is the expansion
%define bar(a,b) ; two arguments, empty expansion
%define ereg(foo,) e %+ foo
mov eax,ereg(dx,cx)
%define xyzzy(=expr,&val) expr, str
%define plugh(x) xyzzy(x,x)
db plugh(3+5), `\0` ; Expands to: db 8, "3+5", `\0`
mov ax,Foo%[__?BITS?__] ; The Foo value
%xdefine Bar Quux ; Expands due to %xdefine
%define Bar %[Quux] ; Expands due to %[...]
%define BDASTART 400h ; Start of BIOS data area
struc tBIOSDA ; its structure
.COM1addr RESW 1
.COM2addr RESW 1
; ..and so on
endstruc
mov ax,BDASTART + tBIOSDA.COM1addr
mov bx,BDASTART + tBIOSDA.COM2addr
; Macro to access BIOS variables by their names (from tBDA):
%idefine Foo mov %?,%??
%idefine keyword $%?
%idefine pause $%? ; Hide the PAUSE instruction
%define foo bar
%undef foo
mov eax, foo
%assign i i+1
%defstr test TEST
%define test 'TEST'
%defstr PATH %!PATH ; The operating system PATH variable
%deftok test 'TEST'
%define test TEST
%define greedy(a,b,c+) a + 66 %, b * 3 %, c
db greedy(1,2) ; db 1 + 66, 2 * 3
db greedy(1,2,3) ; db 1 + 66, 2 * 3, 3
db greedy(1,2,3,4) ; db 1 + 66, 2 * 3, 3, 4
db greedy(1,2,3,4,5) ; db 1 + 66, 2 * 3, 3, 4, 5
%macro silly 2
%2: db %1
%endmacro
silly 'a', letter_a ; letter_a: db 'a'
silly 'ab', string_ab ; string_ab: db 'ab'
silly {13,10}, crlf ; crlf: db 13,10
%pragma preproc sane_empty_expansion
%macro mpar 1-*
db %{3:5}
db %{-1:-3}
%endmacro
mpar 1,2,3,4,5,6
%macro die 0-1 "Painful program death has occurred."
writefile 2,%1
mov ax,0x4c01
int 0x21
%endmacro
%macro multipush 1-*
%rep %0
push %1
%rotate 1
%endrep
j%-1 %%skip
ret
%%skip:
%endmacro
%macro foo 1.nolist
%endmacro
%macro pushparam 1
%ifidni %1,ip
call %%label
%%label:
%else
push %1
%endif
%endmacro
%assign i 0
%rep 64
inc word [table+2*i]
%assign i i+1
%endrep
fibonacci:
%assign i 0
%assign j 1
%rep 100
%if j > 65535
%exitrep
%endif
dw j
%assign k j+i
%assign i j
%assign j k
%endrep
fib_number equ ($-fibonacci)/2
%include "macros.mac"
%ifndef MACROS_MAC
%define MACROS_MAC
; now define some macros
%endif
%pathsearch MyFoo "foo.bin"
%imacro incbin 1-2+ 0
%pathsearch dep %1
%depend dep
incbin dep,%2
%endmacro
%use altreg
%use 'altreg'
%push foobar
%macro repeat 0
%push repeat
%$begin:
%endmacro
%macro until 1
j%-1 %$begin
%pop
%endmacro
%define %$localmac 3
%macro else 0
%ifctx if
%repl else
jmp %$ifend
%$ifnot:
%else
%error "expected `if' before `else'"
%endif
%endmacro
%macro endif 0
%ifctx if
%$ifnot:
%pop
%elifctx else
%$ifend:
%pop
%else
%error "expected `if' or `else' before `endif'"
%endif
%endmacro
some_function:
%push mycontext ; save the current context
%stacksize small ; tell NASM to use bp
%assign %$localsize 0 ; see text for explanation
%local old_ax:word, old_dx:word
enter %$localsize,0 ; see text for explanation
mov [old_ax],ax ; swap ax & bx
mov cx,[old_dx]
leave ; restore old bp
ret ;
%pop ; restore original context
%ifdef F1
; do some setup
%elifdef F2
; do some different setup
%else
%error "Neither F1 nor F2 was defined."
%endif
%ifdef F1
; do some setup
%elifdef F2
; do some different setup
%else
%warning "Neither F1 nor F2 was defined, assuming F1."
%define F1
%endif%if foo > 64
%assign foo_over foo-64
%error foo is foo_over bytes too large
%endif
db __?NASM_VER?__
struc mytype
mt_long: resd 1
.str: resb 32
endstruc
%use altreg
%macro writefile 2+
[section .data]
%%str: db %2
%%endstr:
__?SECT?__
mov dx,%%str
mov cx,%%endstr-%%str
mov bx,%1
mov ah,0x40
int 0x21
%endmacro
DEFAULT BND
call foo ; BND will be prefixed
nobnd call foo ; BND will NOT be prefixed
global _main
_main:
global hashlookup:function, hashtable:data
common intvar 4
static foo
foo:
; codes
%pragma macho lprefix L_
; The most common conventions
%pragma output gprefix _
%pragma output lprefix L_
; ELF uses a different convention
%pragma elf gprefix ; empty
%pragma elf lprefix .L
section .pdata rdata align=4
dd main wrt ..imagebase
dd main_end wrt ..imagebase
dd xmain wrt ..imagebase
section .xdata rdata align=8
xmain: db 9,0,0,0
dd handler wrt ..imagebase
section .drectve info
db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '