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í
×
    včera 17:22 | Komunita

    Singularity (YouTube) je nejnovější otevřený film od Blender Studia. Jedná se o jejich první 4K HDR film.

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

    Vyšla hra Život Není Krásný: Poslední Exekuce (Steam, ProtonDB). Kreslená point & click adventura ze staré školy plná černého humoru a nekorektního násilí. Vžijte se do role zpustlého exekutora Vladimíra Brehowského a projděte s ním jeho poslední pracovní den. Hra volně navazuje na sérii Život Není Krásný.

    Ladislav Hagara | Komentářů: 1
    včera 14:00 | Zajímavý projekt

    Společnost Red Hat představila Fedora Hummingbird, tj. linuxovou distribuci s nativním kontejnerovým designem určenou pro vývojáře využívající AI agenty.

    Pinhead | Komentářů: 4
    včera 02:22 | Zajímavý software

    Hru The Legend of Zelda: Twilight Princess od společnosti Nintendo si lze nově díky projektu Dusklight (původně Dusk) a reverznímu inženýrství zahrát i na počítačích a mobilních zařízeních. Vyžadována je kopie původní hry (textury, modely, hudba, zvukové efekty, …). Ukázka na YouTube. Projekt byl zahájen v srpnu 2020.

    Ladislav Hagara | Komentářů: 0
    včera 01:11 | Nová verze

    Byla vydána nová major verze 29.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Detailní přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 0
    13.5. 21:22 | Bezpečnostní upozornění

    Po zranitelnostech Copy Fail a Dirty Frag přichází zranitelnost Fragnesia. Další lokální eskalace práv na Linuxu. Zatím v upstreamu neopravena. Přiřazeno ji bylo CVE-2026-46300.

    Ladislav Hagara | Komentářů: 1
    13.5. 14:00 | Komunita

    Sovereign Tech Agency (Wikipedie) prostřednictvím svého fondu Sovereign Tech Fund podpoří KDE částkou 1 285 200 eur.

    Ladislav Hagara | Komentářů: 7
    13.5. 12:55 | IT novinky

    Google na včerejší akci The Android Show | I/O Edition 2026 (YouTube) představil celou řadu novinek: Gemini Intelligence, notebooky Googlebook, novou generaci Android Auto, …

    Ladislav Hagara | Komentářů: 0
    13.5. 12:33 | IT novinky

    Evropská komise by do léta mohla předložit návrh normy omezující používání sociálních sítí dětmi v zájmu jejich bezpečí na internetu. Prohlásila to včera předsedkyně EK Ursula von der Leyenová, podle níž řada zemí Evropské unie volá po zavedení věkové hranice pro sociální sítě. EU částečně řeší bezpečnost dětí v digitálním prostředí v již platném nařízení o digitálních službách (DSA), podle německé političky to však není dostatečné a

    … více »
    Ladislav Hagara | Komentářů: 48
    13.5. 04:11 | Nová verze

    Multiplatformní open source aplikace scrcpy (Wikipedie) pro zrcadlení připojeného zařízení se systémem Android na desktopu a umožňující ovládání tohoto zařízení z desktopu, byla vydána v nové verzi 4.0.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (13%)
     (8%)
     (2%)
     (14%)
     (31%)
     (4%)
     (6%)
     (3%)
     (16%)
     (25%)
    Celkem 1611 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: asm: vypis pole

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