Keresés

Új hozzászólás Aktív témák

  • vanek

    tag

    válasz Jester01 #355 üzenetére

    Köszönök minden segítséget, volt rá időm és összedobtam egy kódot..

    Mivel sajnos még nem nagyon tiszta a regiszterek használata, így szeretném azt kérni, hogy lehetne ellenőrizni..

    ;Kosntans

    LF equ 10
    CR equ 13
    Space equ 32





    KOD SEGMENT PARA PUBLIC 'CODE'


    ASSUME CS:KOD, DS:DATA, SS:VEREM, ES:DATA


    ANAGRAMMA PROC FAR

    mov ax, DATA
    mov ds, ax
    mov es, ax

    ; főprogram

    mov ax, offset szoveg
    mov si, ax
    call kiir
    mov si, offset szo1
    call olvasbill
    mov si, offset szo2
    call olvasbill
    mov bx, offset szo1
    call rendez
    mov bx, offset szo2
    call rendez
    call hasonlit
    ; főprogram vége

    mov ah, 4ch
    mov al,00h
    int 21h





    ;--------------------------------------------------------

    olvasbill proc
    push si ;si mentése
    olv:
    mov ah, 1h ;bios eljárás sorszáma
    int 21h ;bios interrupt
    cmp al, SPACE ;Space kódja
    je olvasvege
    cmp al, CR
    je olvasvege
    mov [si], al ;betű tárolása a memóriában
    inc si ;a következő betű egyel magasabb mem. címre kerüljön
    jmp olv ;vissza az olvasás elejére

    olvasvege:
    mov byte ptr [si], SPACE ;a string veget space-val lezárjuk
    int 10h
    pop si
    ret
    olvasbill endp


    ;--------------------------------------------------------

    min proc

    mov dl, [bx] ;dl-ben az elso betű
    mov si, bx ;si mutasson az elejére
    c1: mov al, [si] ;akt betú betöltése
    cmp al, SPACE ;space, vagyis szó vége
    je vege1 ;ha igen: vége
    cmp al, dl ;akt. betű és az eddigi legkisebb
    jae c2 ;ha az akt. nagyobb ugorjunk
    mov dl, al ;jegyezzük meg mert kisebb
    xchg al, [bx] ;csere
    mov [si], al ;csere
    c2: inc si ;köv betű
    jmp c1 ;
    vege1: ret ;visszatérés
    min endp


    rendez proc
    c3: mov al, [bx] ;akt betű betölt
    cmp al, SPACE ;szó vége?
    je vege2 ;ha igen: vége
    call min ;tegyük az elejére a legkisebbet
    inc bx ;köv betű
    jmp c3
    vege2: ret ;eljárás vége
    rendez endp

    ;-----------------------------------------------------------

    hasonlit proc
    mov si, offset szo1
    mov di, offset szo2
    ;PUSH DS
    ;POP ES
    cld
    mov cx, 40 ;string hossza
    repe cmpsb ;összehasonlít
    je igen
    jne nem
    nem:

    mov si, offset szovegnemjo ; Nem Anagramma
    call kiir
    ret ; Visszatérés az op. rendszerhez
    igen:

    mov si, offset szovegjo ; Anagramma
    call kiir
    ret ; Visszatérés az op. rendszerhez

    hasonlit endp

    ;--------------------------------------------------------

    betukiir proc ;al ben a kiirandó betű
    mov ah, 14 ;BIOS rutin paramétere
    int 10h ;10h megszakítás hívása
    ret ;visszatérés
    betukiir endp

    ;--------------------------------------------------------

    kiir proc
    push si
    kov: mov al, [si] ;következő betű
    cmp al, 0 ;0 jelzi a str végét
    je strvege ;ha elértünk a végére ugrunk
    call betukiir ;egy betű kiirása
    inc si ;mutató a következő betűre
    jmp kov ;ugrás
    strvege:
    pop si
    ret ;eljárás vége
    kiir endp


    KOD ENDS

    ;========================================================

    DATA SEGMENT PARA PUBLIC 'DATA'


    szoveg db "Kerem a ket szot szokozzel elvalasztva: ",0
    szovegjo db "A ket szo anagramma!",0
    szovegnemjo db " A ket szo nem anagramma!",0

    szo1 db 40 dup (0)
    szo2 db 40 dup (0)






    DATA ENDS

    ;========================================================

    VEREM SEGMENT PARA STACK
    dw 1024 dup (0)
    VEREM ENDS




    END ANAGRAMMA

    igazából a hibákra vagyok kíváncsi.. működni jól működik, szóval azzal nincs gond.

    Előre is köszönöm!

  • vanek

    tag

    Üdv!

    Azzal kezdenék, hogy totális kezdő vagyok...de nagyon próbálkozom! :D

    két szót szeretnék beolvasni egy sorból és a végüket pedig szóköz jelzi..

    kod segment para public 'code'
    assume cs:kod, ds:adat, ss:verem, es:nothing

    main proc far
    push ds
    xor ax, ax
    push ax
    mov ax, adat
    mov ds, ax

    ;főprogram

    mov dx, offset text1
    mov ah, 09h
    int 21h

    mov di, offset szo1
    call beolvas

    mov di, offset szo2
    call beolvas

    ;=====karakter beolvasása======

    olvas proc

    xor ah, ah
    int 16h
    ret

    olvas endp

    ;=====beolvasás================

    beolvas proc

    be:
    call olvas
    cmp al, 10
    je over
    cmp al, 13
    je over
    cmp al, 32
    je over
    stosb
    jmp be

    over: ret


    beolvas endp


    vege: retf

    main endp

    kod ends
    ;-------------------------------

    adat segment para public 'adat'

    text1 db 'kerem a ket szot szokozzel elvalasztva : $'
    szo1 db 40 dup (0)
    szo2 db 40 dup (0)

    adat ends

    ;-------------------------------

    verem segment para stack


    db 1024 dup (0)


    verem ends


    end main

    Az eredmény az, hogy kiírja, TEXT1 -et, majd kifagy..vagy ha nem, akkor akármit nyomok megint kiírja, TEXT1-et..:\

    előre is köszi! :)

Új hozzászólás Aktív témák