abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 02:22 | IT novinky

    Nezisková organizace Internet Security Research Group (ISRG) vydala Výroční zprávu za rok 2024 (pdf). Organizace stojí za certifikační autoritou Let's Encrypt, projektem Prossimo, jehož cílem je používání paměťově bezpečného kódu v kritické internetové infrastruktuře a službou Divvi Up řešící telemetrii respektující soukromí uživatelů.

    Ladislav Hagara | Komentářů: 0
    včera 15:55 | Zajímavý software

    Vývojáři PeerTube, tj. svobodné alternativy k videoplatformám velkých technologických společností, představili mobilní aplikaci PeerTube (Google Play, App Store). Zdrojové kódy jsou k dispozici na Framagitu.

    Ladislav Hagara | Komentářů: 1
    včera 13:55 | IT novinky

    Google představil Gemini 2.0, tj. novou verzi svého modelu umělé inteligence (YouTube).

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | Nová verze

    Vývojáři KDE oznámili vydání balíku aplikací KDE Gear 24.12. Přehled novinek i s náhledy a videi v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    včera 03:44 | Zajímavý článek

    Prosincové číslo časopisu MagPi od nakladatelství Raspberry Pi zdarma ke čtení: MagPi 148 (pdf).

    Ladislav Hagara | Komentářů: 1
    včera 01:55 | Nová verze

    Byla vydána nová verze 3.27 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.6 souvisejícího programovacího jazyka Dart (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    11.12. 21:22 | Nová verze

    Byla vydána (𝕏) listopadová aktualizace aneb nová verze 1.96 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.96 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    11.12. 16:55 | Nová verze

    OpenMandriva ROME, tj. průběžně aktualizovaná (rolling) edice linuxové distribuce OpenMandriva, byla vydána ve verzi 24.12.

    Ladislav Hagara | Komentářů: 2
    11.12. 02:11 | Nová verze

    U příležitosti oslav sedmi let prací na debianím balíčku vyšlo GPXSee 13.33. Nová verze přináší rychlejší vykreslování vektorových map a vylepšení/doladění nového stylu pro OpenAndroMaps/Mapsforge mapy. Kdo by rád OSM mapy v "prémiovém" barevném schématu a nechce čekat až nová verze dorazí do jeho distribuce, nalezne zdrojové kódy na GitHubu.

    Martin Tůma | Komentářů: 57
    10.12. 23:44 | IT novinky

    Tým Google Quantum AI představil kvantový čip Willow se 105 qubity.

    Ladislav Hagara | Komentářů: 2
    Rozcestník

    Dotaz: asm: vypis pole

    29.3.2009 19:37 asm
    asm: vypis pole
    Přečteno: 596×
    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.