Portál AbcLinuxu, 25. dubna 2024 19:22


Dotaz: assembler: stale cykli

8.3.2009 22:58 asm
assembler: stale cykli
Přečteno: 412×
Odpovědět | Admin
Ahoj, resim jednoduchou vec v asm. Chci v cyklu volat printf a tisknout 5x retezec. Problem je, ze to stale cykli a nemuzu prijit na to, proc. Poradite?
int i = 5;
char * msg = "Ahoj";

_asm {
      mov ecx, i
   zacatek:
      push msg
      call dword ptr printf
      add esp, 4
      loop zacatek
}
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.3.2009 23:49 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: assembler: stale cykli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Register ecx je jeden z tech, ktere maji funkce k volnemu pouziti, pokud chcete uchovat jeho hodnotu, musite si ji nekam (na zasobnik) pred zavolanim ulozit a po navratu z fce vybrat.
9.3.2009 14:53 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: assembler: stale cykli
Já bych to napsal nějak takto:
int i = 5;
char * msg = "Ahoj";

_asm {
      mov ebx, i
      jz konec
   zacatek:
      push msg
      call dword ptr printf
      add esp, 4
      dec ebx
      jnz zacatek
   konec:
}
Instrukce loop už se moc nepoužívá, dvojice dec a jnz proběhne rychlej a navíc máte tu možnost si zvolit registr pro cyklus.
9.3.2009 14:55 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: assembler: stale cykli
Ten příspěvek měl být jinde ;-)
Luboš Doležel (Doli) avatar 8.3.2009 23:49 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: assembler: stale cykli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nepřepisuje vám printf hodnotu registru ecx?
9.3.2009 00:19 asm
Rozbalit Rozbalit vše Re: assembler: stale cykli
Odpovědět | | Sbalit | Link | Blokovat | Admin
Diky Vam obema, mate pravdu. Uz to funguje:
int i = 5;
char * msg = "Ahoj";

_asm {
      mov ecx, i
   zacatek:
      mov ebx, ecx
      push msg
      call dword ptr printf
      add esp, 4
      mov ecx, ebx
      loop zacatek
}
Luboš Doležel (Doli) avatar 9.3.2009 00:30 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: assembler: stale cykli
Hmm a co když by printf() měnilo hodnotu ebx? Pushněte si to na zásobník...
9.3.2009 14:49 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: assembler: stale cykli
Nemůže, podle ABI může konvence cdecl a všechny konvence pro 32 bit měnit pouze eax, ecx a edx. Ostatní registry musí být zachovány.

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.