abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 11:44 | Nová verze

    Byla vydána nová verze 3.2.6 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    dnes 11:33 | Nová verze

    Bylo vydáno Ubuntu 24.04.5 LTS, tj. páté opravné vydání Ubuntu 24.04 LTS s kódovým názvem Noble Numbat. Přehled novinek a oprav na poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 04:33 | Komunita

    Švýcarsko testuje přechod z Microsoft 365 na FOSS, konkrétně balík openDesk (Wikipedie) od německé státní společnosti ZenDiS (Wikipedie), s cílem posílit digitální suverenitu.

    Ladislav Hagara | Komentářů: 8
    dnes 04:22 | Komunita

    V italském městě Pordenone probíhá LibreOffice Conference 2026. Zúčastnit se lze i online.

    Ladislav Hagara | Komentářů: 0
    včera 18:33 | Nová verze

    Svobodný (GPLv3) šachový engine Stockfish (Wikipedie) byl vydán ve verzi 19 (𝕏). Přehled novinek v příspěvku na blogu. Stockfish 19 je o 44 Elo silnější než Stockfish 18.

    Ladislav Hagara | Komentářů: 0
    včera 12:33 | Nová verze

    Byla vydána nová verze 1.13.0 dynamického programovacího jazyka Julia (Wikipedie) určeného zejména pro vědecké výpočty. Přehled novinek v příspěvku na blogu a v poznámkách k vydání. Aktualizována byla také dokumentace.

    Ladislav Hagara | Komentářů: 0
    včera 11:11 | Pozvánky

    Organizátoři konference LinuxDays zveřejnili program letošního ročníku a spustili registraci návštěvníků. LinuxDays 2026 se uskuteční 3. a 4. října v areálu ČVUT v pražských Dejvicích, na Fakultě informačních technologií. Těšit se můžete na 70 přednášek a workshopů od 66 přednášejících. Konference bude rozdělena do pěti sálů s různou kapacitou. Vstup na LinuxDays je jako obvykle zdarma, stačí včas vyplnit registrační formulář. Opět je možné si na akci zakoupit oběd, ale je třeba to udělat předem, na místě už to nebude možné.

    Petr Krčmář | Komentářů: 0
    včera 11:00 | Nová verze

    Google Chrome 153 byl prohlášen za stabilní. Nejnovější stabilní verze 153.0.8010.36 přináší řadu novinek. Podrobný přehled v poznámkách k vydání. Opraveno bylo 230 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 03:33 | Nová verze

    Open-source hra Shattered Pixel Dungeon (Wikipedie) byla vydána ve verzi 4.0.0. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    9.9. 22:22 | IT novinky Ladislav Hagara | Komentářů: 7
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (4%)
     (21%)
     (29%)
     (7%)
     (5%)
     (2%)
     (14%)
     (21%)
    Celkem 2638 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Dotaz: asm: vypis pole

    29.3.2009 19:37 asm
    asm: vypis pole
    Přečteno: 834×
    Zdravim, mam napsat funkci v asm, ktera prijme parametry pocet a adresu zacatku pole a ona vypise vsechny prvky pole:
    void vypis(int pocet, int * pole) {
       for(int i=0; i<pocet; i++) {
          printf("%i", pole[i]);
       }
    }
    
    Prepsano do asm:
    .486
    .model flat,c
    .const
    frm byte "%i", 13, 10, 0
    pole byte 1, 2, 3, 4, 5, 6, 7, 8, 9
    pocet dword 9
    .code
    extern printf:proc
    public main
    vypis:
    	push ebp
    	mov ebp, esp
    	mov eax, 0
    zacatek:
    	cmp eax, [ebp+8]
    	jae konec
    	push eax
    	push [ebp+12]
    	push offset frm
    	call printf
    	add esp, 8
    	pop eax
    	inc eax
    	jmp zacatek
    konec:
    	pop ebp
    	ret
    main:
    	push dword ptr pocet
    	push offset pole
    	call vypis
    	add esp, 8
    	ret
    end
    
    Namisto toho mi to stale cykli a vypisuje 9. Poradi mi nekdo? dekuji.

    Odpovědi

    30.3.2009 03:58 Michal Ludvig | skóre: 16
    Rozbalit Rozbalit vše Re: asm: vypis pole

    Myslím že máš trochu hokej v tom jak funguje adresování. Například:

        cmp     eax, [ebp+8]
    

    Nejen že máš blbě offset (proměnná "pocet" je na ebp+12, nikoliv +8), ale hlavně "[ebp+12]" vezme ze zásobníku adresu proměnné "pocet" nikoliv její hodnotu. Takže to musíš dereferencovat ještě jednou abys dostal co potřebuješ:

        mov     ecx, [ebp+12]
        mov     ecx, [ecx]      ; ecx = pocet

    Je dobrý si ten počet zjistit před cyklem a nechat třeba v ECX protože to je konstantní hodnota. Akorát jí budeš muset uložit před printf a pak obnovit, jinak o ni přijdeš.

    Stejně tak pro counter (lokální proměnná 'i') použij ESI místo EAX - alespoň ti printf tu hodnotu nezničí:

        mov     esi, 0          ; esi = i  (counter)
    

    Podobně i tohle je nesmysl:

        push    [ebp+12]
    

    Jednak pole je na EBP+8, za druhý [EBP+8] vezme ze zásobníku adresu začátku pole přičemž ty potřebuješ adresu toho konkrétního prvku v každém cyklu a za třetí musíš provést konverzi z bajtového pole na int než to znova plácneš na zásobník jako parametr pro printf. Když tuhle konverzi neuděláš vypíše ti to čtyři prvky pole najednou.

        xor     edx, edx
        mov     ebx, [ebp+8]    ; ebx = &pole
        mov     dl, [ebx+esi]   ; edx = pole[i]
        push    edx             ; parametry na zasobnik pro printf
    

    S těmito radami už bys měl být schopen dát ten program dohromady. Kdyby ne ozvi se ;-)

    30.3.2009 05:28 luky
    Rozbalit Rozbalit vše Re: asm: vypis pole
    Minimální úpravy by byly asi takto:

    1. Máš tam pole bytů místo intů.

    místo

    pole byte 1, 2, 3, 4, 5, 6, 7, 8, 9
    použij
    pole dword 1, 2, 3, 4, 5, 6, 7, 8, 9

    2. Parametry máš ve špatném pořadí a místo počtu předáváš adresu.

    místo

    push dword ptr pocet
    push offset pole
    použij
    push offset pole
    push pocet

    3. Vypisuješ adresu pole místo jeho jednotlivých prvků.

    místo

    push [ebp+12]
    použij třeba
    mov esi, [ebp+12]    ; adresa pole
    lea esi, [esi+eax*4] ; adresa prvku (pole + poradi * velikost)
    push [esi]           ; hodnota prvku

    Nezkoušel jsem to, ale mělo by to chodit.

    30.3.2009 05:35 luky
    Rozbalit Rozbalit vše Re: asm: vypis pole
    Hopla, už vidím případnou chybku :)
    30.3.2009 09:42 asm
    Rozbalit Rozbalit vše Re: asm: vypis pole
    ahoj, diky vsem, nakonec jsem to vyresil sam ;) odpoledne sem pastnu reseni...

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.