Warning, /frameworks/syntax-highlighting/autotests/input/highlight.asm-nasm is written in an unsupported language. File is not indexed.
0001 ; Example file for nasm.xml kate syntax file
0002 ; compile with `nasm example.asm -f elf -o example.o`
0003 ; and link with 'gcc example.o -o example`
0004 ; Public domain
0005 ; kate: hl Intel x86 (NASM);
0006
0007 section .data
0008
0009 hello dd 'Hello World', 0x0A, 0h
0010 printf_param dd '%s', 0q
0011
0012 section .text
0013
0014 extern printf
0015
0016 global main
0017 main:
0018 push ebp
0019 mov ebp, esp
0020
0021 push hello
0022 push printf_param
0023 call printf
0024
0025 mov eax, 0b
0026 leave
0027 ret
0028
0029
0030 NULL EQU 0 ; Constants
0031 STD_OUTPUT_HANDLE EQU -11
0032
0033 extern GetStdHandle ; Import external symbols
0034
0035 global Start ; Export symbols. The entry point
0036
0037 section .data ; Initialized data segment
0038 Message db "Console Message 64", 0Dh, 0Ah
0039 MessageLength EQU $-Message ; Address of this line ($) - address of Message
0040
0041 section .bss ; Uninitialized data segment
0042 alignb 8
0043 Written resq 1
0044
0045 section .text ; Code segment
0046 Start:
0047 sub RSP, 8 ; Align the stack to a multiple of 16 bytes
0048
0049 mov ECX, STD_OUTPUT_HANDLE
0050 call GetStdHandle
0051 mov qword [REL StandardHandle], RAX
0052
0053 sub RSP, 32 + 8 + 8 ; Shadow space + 5th parameter + align stack
0054 ; to a multiple of 16 bytes
0055 mov RCX, qword [REL StandardHandle] ; 1st parameter
0056 lea RDX, [REL Message] ; 2nd parameter
0057 mov R8, MessageLength ; 3rd parameter
0058 mov qword [RSP + 4 * 8], NULL ; 5th parameter
0059 ; Message Box, 64 bit. V1.02
0060 .DisplayMessageBox:
0061 xor ECX, ECX ; 1st parameter
0062 lea RDX, [REL MessageBoxText] ; 2nd parameter
0063 lea R8, [REL MessageBoxCaption] ; 3rd parameter
0064 mov R9D, MB_YESNO | MB_DEFBUTTON2 ; 4th parameter. 2 constants ORed together
0065 call MessageBoxA
0066
0067 cmp RAX, IDNO ; Check the return value for "No"
0068 je .DisplayMessageBox
0069
0070 extern _GetStdHandle@4 ; Import external symbols
0071 Start:
0072 call _WriteFile@20
0073
0074 section .data ; Initialized data segment
0075 Static1Colour dd 0F0F0F0h,
0076 Edit2 resq 1
0077
0078 %define Screen.Width RBP - 160 ; 4 bytes
0079 %define ClientArea RBP - 152 ; RECT structure. 16 bytes
0080
0081 mov dword [wc.cbSize], 80 ; [RBP - 136]
0082 mov dword [wc.style], CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW ; [RBP - 132]
0083 mov qword [wc.lpfnWndProc], RAX ; [RBP - 128]
0084 mov qword [wc.hIcon], RAX ; [RBP - 104]
0085 mov dword [RSP + 4 * 8], EAX ; X position, now centred
0086
0087 cmp qword [uMsg], WM_CLOSE ; [RBP + 24]
0088 je WMCLOSE
0089 call DestroyWindow ; Send a WM_DESTROY message
0090 jmp Return.WM_Processed
0091 mov EDX, 0604060h
0092 call SetBkColor
0093 mov EDX, 0005000h
0094
0095 db 0x55 ; just the byte 0x55
0096 db 0x55,0x56,0x57 ; three bytes in succession
0097 db 'a',0x55 ; character constants are OK
0098 db 'hello',13,10,'$' ; so are string constants
0099 dw 0x1234 ; 0x34 0x12
0100 dw 'a' ; 0x61 0x00 (it's just a number)
0101 dw 'ab' ; 0x61 0x62 (character constant)
0102 dw 'abc' ; 0x61 0x62 0x63 0x00 (string)
0103 dd 0x12345678 ; 0x78 0x56 0x34 0x12
0104 dd 1.234567e20 ; floating-point constant
0105 dq 0x123456789abcdef0 ; eight byte constant
0106 dq 1.234567e20 ; double-precision float
0107 dt 1.234567e20 ; extended-precision float
0108
0109 db 33
0110 db (44) ; Integer expression
0111 ; db (44,55) ; Invalid - error
0112 db %(44,55)
0113 db %('XX','YY')
0114 db ('AA') ; Integer expression - outputs single byte
0115 db %('BB') ; List, containing a string
0116 db ?
0117 db 6 dup (33)
0118 db 6 dup (33, 34)
0119 db 6 dup (33, 34), 35
0120 db 7 dup (99)
0121 db 7 dup dword (?, word ?, ?)
0122 dw byte (?,44)
0123 dw 3 dup (0xcc, 4 dup byte ('PQR'), ?), 0xabcd
0124 dd 16 dup (0xaaaa, ?, 0xbbbbbb)
0125 dd 64 dup (?)
0126 db `\u263a` ; UTF-8 smiley face
0127 db `\xe2\x98\xba` ; UTF-8 smiley face
0128 db 0E2h, 098h, 0BAh ; UTF-8 smiley face
0129 buffer: resb 64 ; reserve 64 bytes
0130 wordvar: resw 1 ; reserve a word
0131 buffer: db 64 dup (?) ; reserve 64 bytes
0132 wordvar: dw ? ; reserve a word
0133
0134 incbin "file.dat" ; include the whole file
0135 incbin "file.dat",1024 ; skip the first 1024 bytes
0136 incbin "file.dat",1024,512 ; skip the first 1024, and
0137 ; actually include at most 512
0138
0139 message db 'hello, world'
0140 msglen equ $-message
0141
0142 buffer: db 'hello, world'
0143 times 64-$+buffer db ' '
0144
0145 bndstx [rbx*1+rax+0x3], bnd0 ; GAS - '*1' indecates an index reg
0146 VDIVPS zmm4, zmm5, dword [rbx]{1to16} ; single-precision float
0147 VDIVPS zmm4, zmm5, zword [rbx] ; packed 512 bit memory
0148
0149 mov ax,200 ; decimal
0150 mov ax,0200 ; still decimal
0151 mov ax,0200d ; explicitly decimal
0152 mov ax,0d200 ; also decimal
0153 mov ax,0c8h ; hex
0154 mov ax,$0c8 ; hex again: the 0 is required
0155 mov ax,0xc8 ; hex yet again
0156 mov ax,0hc8 ; still hex
0157 mov ax,310q ; octal
0158 mov ax,310o ; octal again
0159 mov ax,0o310 ; octal yet again
0160 mov ax,0q310 ; octal yet again
0161 mov ax,11001000b ; binary
0162 mov ax,1100_1000b ; same binary constant
0163 mov ax,1100_1000y ; same binary constant once more
0164 mov ax,0b1100_1000 ; same binary constant yet again
0165 mov ax,0y1100_1000 ; same binary constant yet again
0166
0167 %define u(x) __?utf16?__(x)
0168 %define w(x) __?utf32?__(x)
0169
0170 dw u('C:\WINDOWS'), 0 ; Pathname in UTF-16
0171 dd w(`A + B = \u206a`), 0 ; String in UTF-32
0172
0173 db -0.2 ; "Quarter precision"
0174 dw -0.5 ; IEEE 754r/SSE5 half precision
0175 dd 1.2 ; an easy one
0176 dd 1.222_222_222 ; underscores are permitted
0177 dd 0x1p+2 ; 1.0x2^2 = 4.0
0178 dq 0x1p+32 ; 1.0x2^32 = 4 294 967 296.0
0179 dq 1.e10 ; 10 000 000 000.0
0180 dq 1.e+10 ; synonymous with 1.e10
0181 dq 1.e-10 ; 0.000 000 000 1
0182 dt 3.141592653589793238462 ; pi
0183 do 1.e+4000 ; IEEE 754r quad precision
0184
0185 mov rax,__?float64?__(3.141592653589793238462)
0186 mov rax,0x400921fb54442d18
0187
0188 %define Inf __?Infinity?__
0189 %define NaN __?QNaN?__
0190
0191 dq +1.5, -Inf, NaN ; Double-precision constants
0192 dt 12_345_678_901_245_678p
0193 dt -12_345_678_901_245_678p
0194 dt +0p33
0195 dt 33p
0196
0197 dq b * (a // b) + (a %% b)
0198
0199 call (seg procedure):procedure
0200 call weird_seg:(procedure wrt weird_seg)
0201
0202 push dword 33
0203 push strict dword 33
0204
0205 times (label-$) db 0
0206
0207 label: db 'Where am I?'
0208 times (label-$+1) db 0
0209 label: db 'NOW where am I?'
0210
0211 label1 ; some code
0212
0213 .loop
0214 ; some more code
0215
0216 jne .loop
0217 ret
0218
0219 label1: ; a non-local label
0220 .local: ; this is really label1.local
0221 ..@foo: ; this is a special symbol
0222 label2: ; another non-local label
0223 .local: ; this is really label2.local
0224
0225 jmp ..@foo ; this will jump three lines up
0226
0227
0228 %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \
0229 THIS_VALUE
0230
0231 %define ctrl 0x1F &
0232 %define param(a,b) ((a)+(a)*(b))
0233
0234 mov byte [param(2,ebx)], ctrl 'D'
0235 mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
0236
0237 %define a(x) 1+b(x)
0238 %define b(x) 2*x
0239
0240 mov ax,a(8)
0241
0242 %define foo (a,b) ; no arguments, (a,b) is the expansion
0243 %define bar(a,b) ; two arguments, empty expansion
0244
0245 %define ereg(foo,) e %+ foo
0246 mov eax,ereg(dx,cx)
0247
0248 %define xyzzy(=expr,&val) expr, str
0249 %define plugh(x) xyzzy(x,x)
0250 db plugh(3+5), `\0` ; Expands to: db 8, "3+5", `\0`
0251
0252 mov ax,Foo%[__?BITS?__] ; The Foo value
0253 %xdefine Bar Quux ; Expands due to %xdefine
0254 %define Bar %[Quux] ; Expands due to %[...]
0255
0256
0257
0258 %define BDASTART 400h ; Start of BIOS data area
0259
0260 struc tBIOSDA ; its structure
0261 .COM1addr RESW 1
0262 .COM2addr RESW 1
0263 ; ..and so on
0264 endstruc
0265
0266 mov ax,BDASTART + tBIOSDA.COM1addr
0267 mov bx,BDASTART + tBIOSDA.COM2addr
0268 ; Macro to access BIOS variables by their names (from tBDA):
0269
0270 %idefine Foo mov %?,%??
0271
0272 %idefine keyword $%?
0273
0274 %idefine pause $%? ; Hide the PAUSE instruction
0275 %define foo bar
0276 %undef foo
0277
0278 mov eax, foo
0279 %assign i i+1
0280 %defstr test TEST
0281 %define test 'TEST'
0282 %defstr PATH %!PATH ; The operating system PATH variable
0283
0284 %deftok test 'TEST'
0285
0286 %define test TEST
0287
0288 %define greedy(a,b,c+) a + 66 %, b * 3 %, c
0289
0290 db greedy(1,2) ; db 1 + 66, 2 * 3
0291 db greedy(1,2,3) ; db 1 + 66, 2 * 3, 3
0292 db greedy(1,2,3,4) ; db 1 + 66, 2 * 3, 3, 4
0293 db greedy(1,2,3,4,5) ; db 1 + 66, 2 * 3, 3, 4, 5
0294
0295 %macro silly 2
0296 %2: db %1
0297 %endmacro
0298
0299 silly 'a', letter_a ; letter_a: db 'a'
0300 silly 'ab', string_ab ; string_ab: db 'ab'
0301 silly {13,10}, crlf ; crlf: db 13,10
0302 %pragma preproc sane_empty_expansion
0303
0304 %macro mpar 1-*
0305 db %{3:5}
0306 db %{-1:-3}
0307 %endmacro
0308
0309 mpar 1,2,3,4,5,6
0310
0311 %macro die 0-1 "Painful program death has occurred."
0312
0313 writefile 2,%1
0314 mov ax,0x4c01
0315 int 0x21
0316
0317 %endmacro
0318
0319 %macro multipush 1-*
0320
0321 %rep %0
0322 push %1
0323 %rotate 1
0324 %endrep
0325
0326 j%-1 %%skip
0327 ret
0328 %%skip:
0329
0330 %endmacro
0331
0332
0333 %macro foo 1.nolist
0334
0335 %endmacro
0336
0337 %macro pushparam 1
0338
0339 %ifidni %1,ip
0340 call %%label
0341 %%label:
0342 %else
0343 push %1
0344 %endif
0345
0346 %endmacro
0347
0348 %assign i 0
0349 %rep 64
0350 inc word [table+2*i]
0351 %assign i i+1
0352 %endrep
0353
0354
0355 fibonacci:
0356 %assign i 0
0357 %assign j 1
0358 %rep 100
0359 %if j > 65535
0360 %exitrep
0361 %endif
0362 dw j
0363 %assign k j+i
0364 %assign i j
0365 %assign j k
0366 %endrep
0367
0368 fib_number equ ($-fibonacci)/2
0369
0370
0371 %include "macros.mac"
0372
0373
0374 %ifndef MACROS_MAC
0375 %define MACROS_MAC
0376 ; now define some macros
0377 %endif
0378
0379 %pathsearch MyFoo "foo.bin"
0380
0381 %imacro incbin 1-2+ 0
0382 %pathsearch dep %1
0383 %depend dep
0384 incbin dep,%2
0385 %endmacro
0386 %use altreg
0387 %use 'altreg'
0388
0389 %push foobar
0390
0391 %macro repeat 0
0392
0393 %push repeat
0394 %$begin:
0395
0396 %endmacro
0397
0398 %macro until 1
0399
0400 j%-1 %$begin
0401 %pop
0402
0403 %endmacro
0404
0405 %define %$localmac 3
0406
0407 %macro else 0
0408
0409 %ifctx if
0410 %repl else
0411 jmp %$ifend
0412 %$ifnot:
0413 %else
0414 %error "expected `if' before `else'"
0415 %endif
0416
0417 %endmacro
0418
0419 %macro endif 0
0420
0421 %ifctx if
0422 %$ifnot:
0423 %pop
0424 %elifctx else
0425 %$ifend:
0426 %pop
0427 %else
0428 %error "expected `if' or `else' before `endif'"
0429 %endif
0430
0431 %endmacro
0432
0433 some_function:
0434 %push mycontext ; save the current context
0435 %stacksize small ; tell NASM to use bp
0436 %assign %$localsize 0 ; see text for explanation
0437 %local old_ax:word, old_dx:word
0438
0439 enter %$localsize,0 ; see text for explanation
0440 mov [old_ax],ax ; swap ax & bx
0441 mov cx,[old_dx]
0442 leave ; restore old bp
0443 ret ;
0444
0445 %pop ; restore original context
0446
0447
0448 %ifdef F1
0449 ; do some setup
0450 %elifdef F2
0451 ; do some different setup
0452 %else
0453 %error "Neither F1 nor F2 was defined."
0454 %endif
0455 %ifdef F1
0456 ; do some setup
0457 %elifdef F2
0458 ; do some different setup
0459 %else
0460 %warning "Neither F1 nor F2 was defined, assuming F1."
0461 %define F1
0462 %endif%if foo > 64
0463 %assign foo_over foo-64
0464 %error foo is foo_over bytes too large
0465 %endif
0466
0467 db __?NASM_VER?__
0468
0469 struc mytype
0470 mt_long: resd 1
0471 .str: resb 32
0472 endstruc
0473
0474 %use altreg
0475
0476
0477 %macro writefile 2+
0478
0479 [section .data]
0480
0481 %%str: db %2
0482 %%endstr:
0483
0484 __?SECT?__
0485
0486 mov dx,%%str
0487 mov cx,%%endstr-%%str
0488 mov bx,%1
0489 mov ah,0x40
0490 int 0x21
0491
0492 %endmacro
0493
0494 DEFAULT BND
0495 call foo ; BND will be prefixed
0496 nobnd call foo ; BND will NOT be prefixed
0497
0498 global _main
0499 _main:
0500 global hashlookup:function, hashtable:data
0501
0502 common intvar 4
0503 static foo
0504 foo:
0505 ; codes
0506
0507 %pragma macho lprefix L_
0508 ; The most common conventions
0509 %pragma output gprefix _
0510 %pragma output lprefix L_
0511 ; ELF uses a different convention
0512 %pragma elf gprefix ; empty
0513 %pragma elf lprefix .L
0514
0515 section .pdata rdata align=4
0516 dd main wrt ..imagebase
0517 dd main_end wrt ..imagebase
0518 dd xmain wrt ..imagebase
0519 section .xdata rdata align=8
0520 xmain: db 9,0,0,0
0521 dd handler wrt ..imagebase
0522 section .drectve info
0523 db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '