Die Syntax kann je nach verwendetem Assembler variieren. Es gibt mehrere verschiedene Assemblersprachen für x86-Prozessoren, darunter [[NASM]] (Netwide Assembler), GAS (GNU Assembler) und MASM (Microsoft Macro Assembler). Obwohl es gewisse Gemeinsamkeiten gibt, unterscheiden sich die Syntaxe dieser Assembler in einigen Aspekten. Zum Beispiel verwenden NASM und GAS ein Intel-ähnliches Syntaxformat, bei dem Operanden üblicherweise in der Reihenfolge "Quelle, Ziel" angegeben werden. MASM hingegen verwendet eine leicht andere Syntax, bei der die Operanden normalerweise in umgekehrter Reihenfolge angegeben werden, also "Ziel, Quelle". section .data message db 'Hallo, Welt!', 0 section .text global _start Assembly ist im Grunde die erste Programmiersprache nach Bytecode (Maschinencode). [[coding:c#inline assembly|inline assembly]] Windows Emulatoren: [[https://github.com/zarat/WinHax/raw/master/EMU8086v408r.rar|EMU8086]] [[https://github.com/zarat/WinHax/raw/master/SMSx86.zip|SMSx86]] =====Windows, NASM, GCC===== ; nasm -f elf code.asm -o code.o ; gcc code.o -o code.exe global _main extern _scanf extern _strcmp extern _strcat extern _printf section .data stra db "a", 0 strb db "b", 0 fmtc db "%c", 0 fmts db "%s", 0 fmtd db "%d", 0 section .bss input resb 1000 section .text _main: push ebp mov ebp, esp _begin: ; scanf("%s", input) push input push fmts call _scanf add esp, 8 ; int i = strcmp(input, stra); printf("%d", i) push stra push input call _strcmp add esp, 8 push eax push fmtd call _printf add esp, 8 ; printf("%c", 10) push 10 push fmtc call _printf add esp, 8 ; strcat(input, strb) push strb push input call _strcat add esp, 8 ; printf("%s", input) push input push fmts call _printf add esp, 8 _end: ; clean up mov esp, ebp pop ebp ret =====Linux, NASM, GCC===== ; nasm -f elf code.asm -o code.o ; gcc code.o -o code global main extern printf extern scanf extern strcmp SECTION .data stra: db "a", 0 fmtc: db "%c", 0 fmtd: db "%d", 0 fmts: db "%s", 0 SECTION .bss input resb 100 SECTION .text main: ; setup push ebp mov ebp, esp ; printf("%s", stra) push stra push dword fmts call printf add esp, 8 ; printf("%c", 10) push 10 push dword fmtc call printf add esp, 8 ; scanf("%s", input) push input push dword fmts call scanf add esp, 8 ; strcmp(stra, input) push input push stra call strcmp add esp, 8 ; int i = strcmp(input, stra); printf("%d", i) push eax push dword fmtd call printf add esp, 8 ; cleanup mov esp, ebp pop ebp end: mov eax,0 ; return 0 ret =====Linux, NASM, LD===== Linux mit SysCalls ; Compiling ; nasm -f elf32 code.asm -o code.o ; ld -m elf_i386 code.o -o code global _start section .bss buffer resb 10 ; 10 byte buffer bufferlen equ $ - buffer section .data prompt db "prompt> " ; , 0x0a promptlen equ $ - prompt section .text _start: loop1: mov eax, 4 ; sys_write mov ebx, 1 ; stdout mov ecx, prompt ; prompt mov edx, promptlen ; length predefined int 0x80 mov eax, 3 ; sys_read mov ebx, 0 ; stdin mov ecx, buffer ; buffer mov edx, bufferlen ; length 10 bytes int 80h cmp eax, 0 jle lpend1 ; if read <= 0 mov eax, 4 ; sys_write mov ebx, 1 ; stdout mov ecx, buffer ; buffer mov edx, bufferlen ; length int 80h jmp loop1 lpend1: mov eax, 1 ; sys_exit mov ebx, 0 ; status int 80h =====Windows, NASM, LD===== Windos mit "system call instructions" ; Compiling ; nasm -f win32 code.asm -o code.o ; ld code.o -lkernel32 -o code.exe global _start extern _GetStdHandle@4 extern _WriteConsoleA@20 extern _ExitProcess@4 section .data str: db 'hello, world', 0xA, 0x0 strLen: equ $ - str section .bss numCharsWritten: resd 1 section .text _start: push dword -11 ; Arg1: request handle for standard output call _GetStdHandle@4 ; Result: in eax push dword 0 ; Arg5: Unused so just use zero push numCharsWritten ; Arg4: push pointer to numCharsWritten push dword strLen ; Arg3: push length of output string push str ; Arg2: push pointer to output string push eax ; Arg1: push handle returned from _GetStdHandle call _WriteConsoleA@20 push dword 0 ; Arg1: push exit code call _ExitProcess@4 =====Links===== https://www.swansontec.com/sregisters.html