User Tools

Site Tools


isu:cv09

[ISU] 9. Volání funkcí jazyka C

cv9_A.asm ukázka

cv9_A.asm
; 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

cv9_B.asm ukázka

cv9_B.asm
; 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

cv9_1.asm

cv9_1.asm
; 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

cv9_1.asm jedno z mnoha řešení

cv9_1.asm jedno z mnoha řešení

cv9_1.asm
; musíš sám, jde to i bez řetězových instrukcí


cv9_C.asm ukázka

cv9_C.asm
; 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

cv9_2.asm

cv9_2.asm
; 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

cv9_2.asm jedno z mnoha řešení

cv9_2.asm jedno z mnoha řešení

cv9_2.asm
; 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
; char* ObratRetez(char* string, int N);
ObratRetez:
    enter 0,0
    push ecx   ; záloha ecx z mainu
    push eax
    mov ecx, [ebp + 8]  ; vyčtení arg N
    mov esi, [ebp + 12] ; vyčtení arg *string
 
.doZasobniku:
    xor eax, eax
    mov al, [esi + ecx-1]
    push eax
    loop .doZasobniku
 
    mov ecx, [ebp + 8]
.zeZesobniku:
    pop eax
    mov [esi + ecx-1], al
    loop .zeZesobniku
 
    pop eax  ; obnova původních hodnot mainu
    pop ecx
    leave
    ret 8  ; uklizení argumentů ze zásobníku (2*4)
 
main:
    xor eax, eax
    mov ecx, 200  ; jen pro kontrolu zachování hodnoty
    mov edi, string
    call ReadString_Silent ; Načte řetezec, N je v ECX
 
    ; konvence pascal
    push string
    push eax    ; N
    call ObratRetez
 
    ; Vypsání převráceného řetězce
    mov esi, string
    call WriteString
    ret


cv9_3.asm

cv9_3.asm
; Vyzkoušej libovolnou funkci: strlen, strcmp, strstr, qsort, malloc, free

isu/cv09.txt · Last modified: 2024/04/04 23:32 by sakin