Pokaż wyniki 1 do 7 z 7

Temat: Program w assemblerze błąd w kodzie

  1. #1
    Zarejestrowany
    Jan 2013
    Postów
    3

    Domyślnie Program w assemblerze błąd w kodzie

    Witam mam program który powinien mrugać diodą na klawiaturze tyle razy ile użytkownik sobie
    zażyczy jednak program nie działa i nie mam pojęcia gdzie jest błąd byłbym wdzięczny za pomoc

    Kod:
    .model small
    .stack 100h
    .386    ;aby mozna bylo stosowac przesuniecia o kilka pozycji
    
    .data
    info db "Zabawa z diodami klawiatury (obserwuj diody CapsLock i NumLock)",0ah,0dh,'$'
    info1 db "Wybierz liczbe powtorzen w petli od 1 do 9",0ah,0dh,'$'
    info3 db "Podaj liczbe z zakresu od 1 do 9",0ah,0dh,'$'
    info4 db "Czy sprawdzac 'CapsLock' t/n (male litery) ?",0ah,0dh,'$'
    liczba dw ?
    czas db ?
    cap db ?
    	
    .code
    glowna proc
    mov ax,@data
    mov ds,ax
    
    mov ah,0
    mov al,3
    int 10h
    
    mov ah,9
    mov dx,offset info
    int 21h
    mov ah,9
    mov dx,offset info1
    int 21h
    
    poczatek:
    mov ah,8
    int 21h
    cmp al,'1'
    je liczba1
    cmp al,'2'
    je liczba2
    cmp al,'3'
    je liczba3
    cmp al,'4'
    je liczba4
    cmp al,'5'
    je liczba5
    cmp al,'6'
    je liczba6
    cmp al,'7'
    je liczba7
    cmp al,'8'
    je liczba8
    cmp al,'9'
    je liczba9
    	
    mov ah,0
    mov al,3
    int 10h
    	
    mov ah,9
    mov dx,offset info3
    int 21h
    jmp poczatek
    
    liczba1:
    mov liczba,1
    jmp koniec
    liczba2:
    mov liczba,2
    jmp koniec
    liczba3:
    mov liczba,3
    jmp koniec
    liczba4:
    mov liczba,4
    jmp koniec
    liczba5:
    mov liczba,5
    jmp koniec
    liczba6:
    mov liczba,6
    jmp koniec
    liczba7:
    mov liczba,7
    jmp koniec
    liczba8:
    mov liczba,8
    jmp koniec
    liczba9:
    mov liczba,9
    koniec:
    
    zzz:
    mov ah,9
    mov dx,offset info4
    int 21h
    mov ah,8
    int 21h         
    cmp al,'t'
    je qqq
    cmp al,'n'
    je aaa4
    jmp zzz
    	
    qqq:
    mov cap,1
    jmp xxx
    aaa4:
    mov cap,0
    xxx:
    
    mov cx,liczba
    petla:
    pusha
    call delay
    mov ah,0Bh
    int 21h         
    popa
    
    call swiec2    
     
    cmp cap,1
    je sss
    jmp www
    sss:
    
    mov ah,0Bh
    int 21h
    call swiec3     
    
    www:
    loop petla
    
    mov ax,4c00h
    int 21h
    glowna endp
    
    swiec1 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],00010000b
    pop ds
    int 15h
    ret
    swiec1 endp
    
    swiec2 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],00100000b
    pop ds
    int 15h
    ret
    swiec2 endp
    
    swiec3 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],01000000b
    pop ds
    int 15h
    ret
    swiec3 endp
    
    delay proc
    mov ah,2
    int 1Ah         
    shl dh,4
    shr dh,4        
    add dh,2        
    cmp dh,9        
    ja kkkk
    jmp mmmm
    kkkk:
    sub dh,10
    mmmm:
    mov czas,dh     
    petla2:
    mov ah,2
    int 1Ah         
    shl dh,4
    shr dh,4
    cmp dh,czas
    je jestOK
    jmp petla2
    jestOK:
    ret
    delay endp
    end glowna

  2. #2
    Zarejestrowany
    Jul 2008
    Skąd
    /dev/random
    Postów
    556

    Domyślnie

    A pod jakim systemem to odpalasz ? Uzywanie 21h i 10h pod nowszymi windows jest raczej problematyczne... Jak chcesz sie bawic na takim poziomie to najlepiej DOS 6.22 i jazda... Do tego prawde mowiac to nie wiem jak 10h bedzie zachowywac sie z nowymi kartami, niby to powinno byc kompatybilne ale jakos nie testowalem...
    --
    ToM's Super Fix IT "No Fucking Problem"

  3. #3
    Zarejestrowany
    Jan 2009
    Postów
    836

    Domyślnie

    Zgadzam się z TOMem.

    Dodatkowo nie podoba mi się zapis:
    mov liczba,9
    koniec:

    zzz:
    mov ah,9

    LABELe koniec i zzz można scalić jako 1 - ale to akurat pierdoła.


    Na chwile obecną radziłbym Ci napisać problem od początku uwzględniając tylko jedną możliwość - wciśnięcie 1 i 1x mignięcie diody. Do tak działającego programu dobudowujesz resztę. Na chwile obecną to tylko debugger zostaje albo jakiś assemblerowy psychopata widzący błędy lepiej niż kompilator : )

  4. #4
    Zarejestrowany
    Jan 2013
    Postów
    3

    Domyślnie

    gdyby ktoś był w stanie i miał chęci pomóc za drobną opłatą proszę o kontakt
    Ostatnio edytowane przez Mad_Dud : 01-26-2013 - 16:11

  5. #5
    Zarejestrowany
    Jan 2009
    Postów
    836

    Domyślnie

    Będziesz czekał i się nie doczekasz. Nie znasz powiedzenia panującego wśród programistów, że łatwiej napisać program od nowa niż poprawiać cudze błędy ?

    Zrób program dla jednego przypadku. "1" z klawiatury i 1x włączenie diody.

    Jak nie będzie działał znaczy, że OS blokuje przerwania i musiałbyś użyć assemblera stricte pod Windows a nie takiego jak pisało się 15 lat temu (Twój kod)

    Jak będzie działał to dobudujesz działającą resztę - chyba, że cel postu jest inny.

  6. #6
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Lightbulb

    Przykładowy kod na Windowsa mrugający Caps Lockiem, pisany pod fasmem
    Kod:
    format PE console 4.0
    use32
    entry _start
    include 'MACRO/IMPORT32.INC'
    
    section '.code' code executable
    _start:
            push txt
            call [printf]
            push esp
            push fmt
            call [scanf]
            add esp,8
    mrug_loop:
            call _mrug
            push 400
            call [Sleep]
            call _mrug
            push 400
            call [Sleep]
            sub dword [esp],1
            jnz mrug_loop
            pop eax
            xor eax,eax
            ret
    
    _mrug:
            push 28
            push mrug
            push 2
            call [SendInput]
            ret
    
    section '.rodata' data readable
    txt db "Ile mrugniec? ",0
    fmt db " %d",0,0
    mrug dd \
         1, 14h, 0, 0, 0, 0, 0, \
         1, 14h, 2, 0, 0, 0, 0
    
    section '.import' data import readable writeable
    library \
            kernel32,'kernel32.dll',\
            msvcrt,'msvcrt.dll',\
            user32,'user32.dll'
    import kernel32,\
            Sleep,'Sleep'
    import msvcrt,\
            printf,'printf',\
            scanf,'scanf'
    import user32,\
            SendInput,'SendInput'
    
    section '.reloc' fixups data readable discardable
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  7. #7
    Zarejestrowany
    Jan 2013
    Postów
    3

    Domyślnie

    pogrzebałem trochę i teraz program niby działa ale mrygna na przemian CapsLockiem i NumLockiem a powinien tylko CapsLockiem

    Kod:
    .model small
    .stack 100h
    .386    ;aby mozna bylo stosowac przesuniecia o kilka pozycji
    
    .data
    info db "Zabawa z diodami klawiatury (obserwuj diody CapsLock i NumLock)",0ah,0dh,'$'
    info1 db "Wybierz liczbe powtorzen w petli od 1 do 9",0ah,0dh,'$'
    info3 db "Podaj liczbe z zakresu od 1 do 9",0ah,0dh,'$'
    info4 db "Czy sprawdzac 'CapsLock' t/n (male litery) ?",0ah,0dh,'$'
    liczba dw ?
    czas db ?
    cap db ?
    	
    .code
    glowna proc
    mov ax,@data
    mov ds,ax
    
    mov ah,0
    mov al,3
    int 10h
    
    mov ah,9
    mov dx,offset info
    int 21h
    mov ah,9
    mov dx,offset info1
    int 21h
    
    poczatek:
    mov ah,8
    int 21h
    cmp al,'1'
    je liczba1
    cmp al,'2'
    je liczba2
    cmp al,'3'
    je liczba3
    cmp al,'4'
    je liczba4
    cmp al,'5'
    je liczba5
    cmp al,'6'
    je liczba6
    cmp al,'7'
    je liczba7
    cmp al,'8'
    je liczba8
    cmp al,'9'
    je liczba9
    	
    mov ah,0
    mov al,3
    int 10h
    	
    mov ah,9
    mov dx,offset info3
    int 21h
    jmp poczatek
    
    liczba1:
    mov liczba,1
    jmp koniec
    liczba2:
    mov liczba,2
    jmp koniec
    liczba3:
    mov liczba,3
    jmp koniec
    liczba4:
    mov liczba,4
    jmp koniec
    liczba5:
    mov liczba,5
    jmp koniec
    liczba6:
    mov liczba,6
    jmp koniec
    liczba7:
    mov liczba,7
    jmp koniec
    liczba8:
    mov liczba,8
    jmp koniec
    liczba9:
    mov liczba,9
    koniec:
    
    zzz:
    mov ah,9
    mov dx,offset info4
    int 21h
    mov ah,8
    int 21h         
    cmp al,'t'
    je qqq
    cmp al,'n'
    je aaa4
    jmp zzz
    	
    qqq:
    mov cap,1
    jmp xxx
    aaa4:
    mov cap,0
    xxx:
    
    mov cx,liczba
    petla:
    pusha
    call delay
    mov ah,0Bh
    int 21h         
    popa
    
    call swiec2    
     
    cmp cap,1
    je sss
    jmp www
    sss:
    
    mov ah,0Bh
    int 21h
    call swiec3     
    
    www:
    loop petla
    
    mov ax,4c00h
    int 21h
    glowna endp
    
    swiec1 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],00010000b
    pop ds
    int 15h
    ret
    swiec1 endp
    
    swiec2 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],00100000b
    pop ds
    int 15h
    ret
    swiec2 endp
    
    swiec3 proc     
    push ds
    mov ax,40h
    mov ds,ax
    mov bx,17h
    xor byte ptr [bx],01000000b
    pop ds
    int 15h
    ret
    swiec3 endp
    
    delay proc
    mov ah,2
    int 1Ah         
    shl dh,4
    shr dh,4        
    add dh,2        
    cmp dh,9        
    ja kkkk
    jmp mmmm
    kkkk:
    sub dh,10
    mmmm:
    mov czas,dh     
    petla2:
    mov ah,2
    int 1Ah         
    shl dh,4
    shr dh,4
    cmp dh,czas
    je jestOK
    jmp petla2
    jestOK:
    ret
    delay endp
    end glowna

Tagi

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj