Program w assemblerze błąd w kodzie

grzegorzffht

Użytkownik
Dołączył
Styczeń 25, 2013
Posty
5
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
 

codex

Użytkownik
Dołączył
Październik 30, 2012
Posty
25
Na początek proponuję poprawić kod pomiędzy etykietami początek i koniec w ten sposób:

Kod:
poczatek:
                mov ah,8
                int 21h
                cmp     al, '1'
                jb      @f
                cmp     al, '9'
                ja      @f
                jmp     liczba
@@:
                mov ax, 03
                int 10h
        
                mov ah,9
                mov dx,offset info3
                int 21h
                jmp poczatek

liczba:
                xor      ah, ah
                xor      al, '0'
                mov      liczba, ax

koniec:

korzystając z faktu, że:
WARTOSC_CYFRY = KOD_ASCII_CYFRY - 30H
Gdzie 30H to kod ascii cyfry zero.


Poza tym zamiast używać etykiet typu xxxxx: czy tam nnnnnn: które nic nie mówią lepiej jest używać napisu który informuje co się dzieje w danym fragmencie kodu - w asemblerze to bardzo ważne, żeby jak się da poprawiać czytelność kodu - łatwiej go później analizować w razie wystąpienia problemów. Jedynymi możliwościami poprawy czytelności w asemblerze są:
- formatowanie kodu.
- komentarze.
- nazewnictwo etykiet.
Nie pozbawiaj się jednej z 3 możliwości :)

- co do reszty nie pomogę nie pamiętam zbytnio przerwań DOS.


Na jakim systemie operacyjnym pracujesz?
No Dawidzie przecież to wynika z kodu:
Kod:
mov    ah, 09
mov    dx, pjakisnapis
int       21h
 
Ostatnia edycja:

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
No Dawidzie przecież to wynika z kodu:
Kod:
mov    ah, 09
mov    dx, pjakisnapis
int       21h
Z kodu wynika, że kod jest dla MS-DOS. Nie znam umiejętności i wiedzy autora, może on chce ten kod uruchomić na Windows 7 i dlatego nie dziala?
 

codex

Użytkownik
Dołączył
Październik 30, 2012
Posty
25
W takim razie nie jest to problem systemu operacyjnego ponieważ na windowsach poniżej windows 7 64bit kod dla systemu DOSu jest uruchamiany w trybie wirtualnym.
Musisz szukać błędu w kodzie.
ogarnij również ten materiał:
http://rudy.mif.pg.gda.pl/~bogdro/dos/diod_tut.htm

Po namyśle ... jeżeli chodzi o operacje na portach to nie jestem tak do końca pewien czy ten tryb wirtualny w 100% zastępuje oryginalne 16- bitowe środowisko. Nie mam nic poniżej windows 7 w domu więc skompiluj u siebie na tym windows 98 poniższy kod żeby to ustalić w 100%:

Kod:
format binary
org 100h


        call    czy_mozna_pisac
        mov     al,0edh
        out     60h, al
        xor     al, al
        out     60h, al
        call    czy_mozna_pisac
        mov     al,0edh
        out     60h, al
        mov     al, 02
        out     60h, al
        call    czy_mozna_pisac
        mov     al, 0edh
        out     60h, al
        mov     al, 1
        out     60h, al
        call    czy_mozna_pisac
        mov     al, 0edh
        out     60h, al
        mov     al, 06
        out     60h, al

        xor     ax, ax
        int     16h
        mov     ax, 4c00h
        int     21h



czy_mozna_pisac:
        push            eax
        @@:
        in              al, 64h
        and             al, 2
        jnz             @b
        pop             eax
        ret
 
Ostatnia edycja:

grzegorzffht

Użytkownik
Dołączył
Styczeń 25, 2013
Posty
5
odwzorowanie jest w porządku działa tak jak powinno tylko że w programie jest jakiś błąd który sprawia że program nie działa tak jak działać powinien a powinien mrugać chociaż capsolckiem tyle razy ile użytkownik wprowadzi
 

grzegorzffht

Użytkownik
Dołączył
Styczeń 25, 2013
Posty
5
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
 
Do góry Bottom