[asm] short jump to function converted to near

Pagina: 1
Acties:
  • 162 views sinds 30-01-2008
  • Reageer

  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:31
ik ben nu dus ook assembly aan het leren, maar krijg nu de volgende warning:
code:
1
2
3
g:\c++\priem\priem.cpp(87) : warning C4414: 'end' : short jump to function converted to near
g:\c++\priem\priem.cpp(94) : warning C4414: 'end' : short jump to function converted to near
g:\c++\priem\priem.cpp(102) : warning C4102: 'end' : unreferenced label

(ja het is een simpel priemtest-programma :P)

Als ik het programma uitvoer krijg ik ook een fatale fout :?

Dit is m'n code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
UINT priem_asm(UINT testgetal)
{
    UINT r;
    _asm
    {
        mov eax, [testgetal]    //testgetal weer in eax zetten
        mov ecx, 2      //ecx (deelgetal) is twee
        mov edx, 0      //edx resetten
        div ecx         //delen door ecx (twee)
        cmp edx, 0      //is de rest nul?
        je end          //zo ja return 2
        mov ecx, 3      //ecx is het getal om door te delen (beginnend met 3)
    looping:            //label voor de loop
        mov eax, [testgetal]    //testgetal weer in eax zetten
        mov edx, 0      //edx resetten
        div ecx         //delen door ecx
        cmp edx, 0      //is ie nul?
        je end          //dan deelbaar door ecx
        cmp ecx, eax    //is ecx al hoog genoeg?
        add ecx, 2      //met twee verhogen
        jl looping      //zo niet, dan nog een keer
        mov ecx, 0      //door niks te delen? dan return value null
end:
        mov [r], ecx
    }
    return r;
}

Wat zit hier fout :?

  • tomato
  • Registratie: November 1999
  • Niet online
Ik heb totaal geen verstand van ASM, dus daar kan ik niet zoveel over zeggen. Is 'end' niet reserved? In ieder geval worden de jumps naar je labels niet op prijs gesteld...

Je algoritme is niet echt efficient voor wat ik er hier van begrijp (en dat is wel waar je naar toe wilt als je het in ASM gaat doen neem ik aan).
Je gaat je testgetal door ieder oneven getal kleiner dan je testgetal delen. Je hoeft dit natuurlijk maar te doen tot en met de wortel van je testgetal (iedere deler groter dan die wortel heeft een deler kleiner dan die wortel nodig).
Er zijn nog heel wat truckjes, maar deze is in ieder geval voor jouw programmaatje al makkelijk te gebruiken.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:31
Op donderdag 13 september 2001 17:20 schreef tomato het volgende:
Ik heb totaal geen verstand van ASM, dus daar kan ik niet zoveel over zeggen. Is 'end' niet reserved? In ieder geval worden de jumps naar je labels niet op prijs gesteld...

Je algoritme is niet echt efficient voor wat ik er hier van begrijp (en dat is wel waar je naar toe wilt als je het in ASM gaat doen neem ik aan).
Je gaat je testgetal door ieder oneven getal kleiner dan je testgetal delen. Je hoeft dit natuurlijk maar te doen tot en met de wortel van je testgetal (iedere deler groter dan die wortel heeft een deler kleiner dan die wortel nodig).
Er zijn nog heel wat truckjes, maar deze is in ieder geval voor jouw programmaatje al makkelijk te gebruiken.
zover was ik nog niet :) maar ik zal dat ff proberen

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Hij ziet dat je jump niet goed is en zet 'em om naar een ander soort jump. Verder moet het geen probleem zijn.

En inderdaad End is een reserverd word, ik weet niet of het problemen geeft als je het neerzet als label. Maar aan het eind van je file moet END <label> staan. <label> is dan de plaats waar de executie van je code moet beginnen.

Voor zover ik weet is die short jump groter dan de near jump, hij kan converten omdat de bestemming van de jump heel dichtbij de jump zelf zit en dus een kleinere opcode schrijven.

Het zou kunnen dat dit gelul is, maar in MC680x0 ASM kun je dat iig doen, in x86 waarschijnlijk ook wel.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Marcj
  • Registratie: November 2000
  • Laatst online: 11:31
bedankt jongens, hij is nu iets veranderd (end -> eind :P) en ik heb de wortel ingevoegd, maar weet iemand hoe dit efficienter kan :?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
UINT priem_asm(UINT testgetal)
{
    UINT r;
    UINT q = (int)sqrt(testgetal);
    _asm
    {
        mov eax, [testgetal]    //testgetal weer in eax zetten
        mov ebx, [q]
        mov ecx, 2      //ecx (deelgetal) is twee
        mov edx, 0      //edx resetten
        div ecx         //delen door ecx (twee)
        cmp edx, 0      //is de rest nul?
        je eind         //zo ja return 2
        mov ecx, 1      //ecx is het getal om door te delen (beginnend met 3)
    looping:            //label voor de loop
        add ecx, 2      //met twee verhogen
        mov eax, [testgetal]    //testgetal weer in eax zetten
        mov edx, 0      //edx resetten
        div ecx         //delen door ecx
        cmp edx, 0      //is ie nul?
        je eind         //dan deelbaar door ecx
        cmp ecx, ebx    //is ecx al hoog genoeg?
        jng looping     //zo niet, dan nog een keer
        mov ecx, 0      //door niks te delen? dan return value null
eind:
        mov [r], ecx
    }
    return r;
}

in asm duurde 10.000x 19.999.999 testen 1052 ms en in C++ 1191 ms, dus de optimalisatie is een beetje gelukt ;)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op donderdag 13 september 2001 18:45 schreef Marcj het volgende:
bedankt jongens, hij is nu iets veranderd (end -> eind :P) en ik heb de wortel ingevoegd, maar weet iemand hoe dit efficienter kan :?
Ja, de Sieve is het beste algoritme wat ik ken, van 1 of andere griek waarvan ik de naam niet kan schrijven.

Zoek op Sieve en je vind wel wat handigs.

[edit]Mooie beschrijving

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • tomato
  • Registratie: November 1999
  • Niet online
Op donderdag 13 september 2001 18:47 schreef Gerco het volgende:
Ja, de Sieve is het beste algoritme wat ik ken, van 1 of andere griek waarvan ik de naam niet kan schrijven.

Zoek op Sieve en je vind wel wat handigs.

[edit]Mooie beschrijving
Zeef van Eratosthenes. Deze methode is eigenlijk geschikter om alle priemgetallen tot een bepaald getal te vinden, maar van de ideeen die erachter zitten kun je ook wel gebruik maken in deze situatie (onder andere het zoeken tot de wortel).
Pagina: 1