Idiv – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Idiv – Assembler – Fórum – Programujte.comIdiv – Assembler – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
BigBear0
Stálý člen
9. 5. 2009   #1
-
0
-

Ahojte, chci udelat aritmeticky prumer. Pouzivam C++ a inline assembler. Mam napsanou tuto fci:



int aritmetickyPrumer(int a, int b, int c) {
_asm {
mov eax, a
add eax, b
add eax, c
mov bl, 3
idiv bl
}
}

vysledek je dobre jen, kdyz ma vysledek vyjit kladny, ci 0. Takze spravne funguji volani:


aritmetickyPrumer(2, -2, 0);
aritmetickyPrumer(3, 7, 8);
aritmetickyPrumer(3, 7, -4);

ale spravne nefunguje:


aritmetickyPrumer(-5, -7, -9);

jak to mam opravit? A proc tomu tak je? Mockrat dekuji :-)

Nahlásit jako SPAM
IP: 88.146.146.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
Reklama
Reklama
tmi0
Věrný člen
9. 5. 2009   #2
-
0
-

ahoj,
co presne ti to vratilo? pripada mi ze do toho kodu neni moc videt - neni totiz moc jasne co vlastne vrati. kazdopadne bych tipl, ze problem bude ve velikosti promenne. zkus zavolat "aritmetickyPrumer(-3,0,0);", tipl bych ze vysledek ti vyjde 255 - coz je ale spravne :).
totiz, vysledek instrukce "idiv bl" se ulozi do registru "al", ktery je 8bitovy. a 255 v 8bitovem registru znamena -1. jenze ty tech 8 bitu vracis jako int - tedy 32 bitove cislo, ktere ma tedy jako nejvyssi bit nulu a je tim povazovano za kladne.
v C/C++ se ti tohle nestane, tam jazyk sam konvertuje dle potreby, tedy kdyz pretypujes zaporny char na int, tak to sam doplni jednickami.

reseni jsou dve:
1) existuje nejaka instrukce, ted nevim jaka, ktera roztahne cislo v al do celeho eax i se znamenkovym rozsirenim.
2) zmen navratovou hodnotu na signed char.

jinak trochu koukni na dvojkovy doplnek a velikosti registru a tak.

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
o-lox0
Super člen
10. 5. 2009   #3
-
0
-

Doplnim k tmi.
Nebránil bych se použít řešení s dělením registrem EBX. Pak je možno vracet int.

CDQ   ; // instrukce na rozšíření nutne deli se EDX:EAX / EBX

MOV EBX,3
IDIV EBX

Ten způsob co psal tmi přes sérii instrukcí CBW,CWDE

Nahlásit jako SPAM
IP: 85.71.152.–
BigBear0
Stálý člen
10. 5. 2009   #4
-
0
-

mockrat dekuji obema, urcite poslechnu vsechny rady... assembler neni muj oblibeny programovaci jazyk, ale... kdyz musis, tak musis ;-)... dekuji :-)

Nahlásit jako SPAM
IP: 88.146.146.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 252 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý