; ukázka lokální proměnné %include "rw32.inc" section .text fce: push eax ; záloha registru push ebp ; zálohuj staré dno mov ebp, esp ; vytvoř nové dno sub esp, 12 ; rezervuj 3 lokální proměnné mov [ebp - 12], dword 5 ; vložení do lokální proměnné mov [ebp - 4*2], dword 10 mov eax, [ebp - 8] ; vyčtení add eax, [ebp - 12] mov esp, ebp ; smazání proměnných pop ebp ; obnova starého dna pop eax ; obnova registru ret main: mov eax, 123 call fce ret
; ukázka řetězových instrukcí %include "rw32.inc" section .data string1 db "Ahoj" string2 db "xxxx" src db "Hello world!",0 dst db "xxxxx xxxxxx",0 section .text main: ; MOVS mov esi, string1 mov edi, string2 movsb ; Výsledek ve string2: "Axxx" movsb ; Výsledek ve string2: "Ahxx" movsb ; Výsledek ve string2: "Ahox" mov ecx, 4 mov esi, string2 call WriteStringNewLine ; STOS a LODS mov edi, string2 mov al, 'B' stosb ; výsledek string2: "Bxxx" stosb ; výsledek string2: "BBxx" stosb ; výsledek string2: "BBBx" mov ecx, 4 mov esi, string2 call WriteStringNewLine mov esi, string1 lodsb ; v AL symbol "A" call WriteCharNewLine ; REP mov esi, src ; ESI = zdroj mov edi, dst ; EDI = cíl mov ecx, 5 ; ECX = počet cld ; DF = 0 (doprava) ; zkopiruj 8b, ECX--, opakuj dokud ECX != 0 rep movsb ; Vypiš mov esi, dst call WriteStringASCIIZ ret
; Vytvoř funkci, která od uživatele načte jeden znak, ; najde jeho poslední výskyt v řetězci "string" ; a nahradí v poli pomlčkou. Vypiš upravený řetezec. ; H ==> -ello world! ; o ==> Hello w-rld! %include "rw32.inc" section .data string db "Hello world!",0 len db 12 section .text fce: ret main: ret
; Volání externí funkce printf() z Céčka %include "rw32.inc" CEXTERN printf section .data sFormat db "Printed by printf() string = %s, A = %d, B = %d, C = %d", 0 x dd -56 sSomeString db "some string",0 section .text main: enter 0,0 mov eax,100 ; printf(sFormat, "some string", 5, x, 100); push eax ; 100 push dword [x] push 5 push sSomeString ; -> "some string",0 push sFormat call printf add esp, 5*4 leave ret
; Napište funkci "ObratRetez", která dostane jako argumenty ; ukazatel na pole znaků (řetezec) a počet znaků N. ; char* ObratRetez(char* string, int N); ; Konvence volání: pascal ; Využívej lokální proměnné (zásobník), registry musí mít po ukončení funkce původní hodnoty. ; Výsledkem funkce bude převrácené pořadí znaků v proměnné string. ; ; ReadString: ; * potřeba nastavit EDI (kam uložit načtené znaky) ; * počet načtených symbolů v EAX %include "rw32.inc" section .bss string resd 50 section .text ObratRetez: ; ret main: xor eax, eax mov edi, string call ReadString_Silent ; Načte řetezec ; zde něco call ObratRetez ; Vypsání převráceného řetězce mov esi, string call WriteString ret
; Vyzkoušej libovolnou funkci: strlen, strcmp, strstr, qsort, malloc, free