Assembly Tömbkezelés Szóismétlés kereső
2018-05-05T16:43:58+02:00
2018-05-05T19:52:59+02:00
2022-08-11T02:55:30+02:00
Savanya Sándor József
Üdv mindenkinek! 

Az egyetemen Assembly programozás kurzuson egy beadandó feladatot kell csinálni, ahol az Irvine 32 könyvtárat lehet használni. A feladat, hogy egy stringről kell eldönteni, hány szóismétlés van benne. 
Az elképzelésem a következő lenne: 

Van egy BYTE tipusú stringem, ezen egy cikulussal karakterenként megyek és mentegetem az ActualWordbe, ha szóközt találok akkor törlöm az ActulaWordot de előtte be töltöm a Words tömbe. Majd mikor ez végigment egy új ciklussal kiveszek mindig egy elemet a Words tömből az ActualStringbe és végignézem, hogy a tömbben hányszor fordul elő (és -1 mert önmagát is beleszámolja így) és elvégre kész is lenne. Ám elakadtam ott, hogy az ActualStringet hog tudnám a Words adott indexén elhelyezni. Skála-Index címzássel probálkoztam, de valahogy nem igazán megy.

Jelenlegi kódom így néz ki

TITLE Hello, Assembly! (32 bites) INCLUDE Irvine32.inc .data String BYTE "kutya macska lo macska lo kutya delfin kutya sanyi lo", 0 Words WORD 80 DUP (?) ActualString WORD 0 .code ; Belépési pont main PROC mov eax, 0 mov ecx, 0 mov edx, 0 mov ebx, 0 mov esi, offset String mov edi, offset ActualString StringLoop: mov al, [esi] cmp al, 0 JE EndStringLoop cmp al, ' ' JE NextWord mov [edi + ecx], al inc esi add ecx, 1 jmp StringLoop NextWord: mov edx, edi ;call WriteString mov [offset Words + ebx*], edx ;EZ nem tudom, hogy jön ki inc esi add ebx, 1 MakeEmpty: mov [edi+ecx], eax dec ecx cmp ecx, 0 jne MakeEmpty jmp StringLoop EndStringLoop: mov edi, 0 mov edi, offset Words mov edx, edi call WriteString INVOKE ExitProcess,0 main ENDP END main

A válaszokat előre is köszönöm!
Mutasd a teljes hozzászólást!

  • Kicsit változtattam a kódon:

    TITLE Hello, Assembly! (32 bites) INCLUDE Irvine32.inc .data String BYTE "kutya macska lo macska lo kutya delfin kutya sanyi lo", 0 Words WORD 80 DUP (?) ActualString WORD 0 .code ; Belépési pont main PROC mov eax, 0 mov ecx, 0 mov edx, 0 mov ebx, 0 mov esi, offset String mov edi, offset ActualString StringLoop: mov al, [esi] cmp al, 0 JE EndStringLoop cmp al, ' ' JE NextWord mov [edi + ecx], al inc esi add ecx, 1 jmp StringLoop NextWord: mov edx, [edi] ;call WriteString mov [offset Words + 8*ebx], edx ;EZ nem tudom, hogy jön ki inc esi add ebx, 1 MakeEmpty: mov [edi+ecx], eax dec ecx cmp ecx, 0 jne MakeEmpty jmp StringLoop EndStringLoop: mov edi, 0 mov edi, offset Words mov edx, edi call WriteString INVOKE ExitProcess,0 main ENDP END main
    Mutasd a teljes hozzászólást!
  • TITLE Hello, Assembly! (32 bites) INCLUDE Irvine32.inc .data String BYTE "kutya macska lo macska lo kutya delfin kutya sanyi lo", 0 Words DWORD 80 DUP (?) ActualString DWORD 0 .code ; Belépési pont main PROC mov eax, 0 mov ecx, 0 mov edx, 0 mov ebx, 0 mov esi, offset String mov edi, offset ActualString StringLoop: mov al, [esi] cmp al, 0 JE EndStringLoop cmp al, ' ' JE NextWord mov [edi + ecx], al inc esi add ecx, 1 jmp StringLoop NextWord: mov edx, [edi] ;call WriteString mov [offset Words + ebx], edx ;EZ nem tudom, hogy jön ki inc esi add ebx, 16 MakeEmpty: mov [edi+ecx], eax dec ecx cmp ecx, 0 jne MakeEmpty jmp StringLoop EndStringLoop: mov edi, 0 mov edi, [offset Words] mov edx, edi call WriteString INVOKE ExitProcess,0 main ENDP END main
    Megpróbálkoztam ezzel, valamennyire jó is talán, de a szavak végét levágja
    Mutasd a teljes hozzászólást!
  • Konkrétan a kódodban nincs ActualWord.

    Az első magyar kommented fölösleges, a második használhatatlan. 

    Hogy az ActualString-et indexeled, abból sok jó nem jöhet ki, mert annak csak 4 bájtot foglaltál.
    Mutasd a teljes hozzászólást!
  • Nem indexelni a Words ot akarom az ActualStringbe mindigegy szót tárolok
    Mutasd a teljes hozzászólást!
  • És akkor mit csinál az edi+ecx?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd