Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[MS-DOS] Błąd ''near jump or call to different cs''



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
ania24018
Gość





PostWysłany: Sob Mar 15, 2014 1:41 pm  OP    Temat postu: [MS-DOS] Błąd ''near jump or call to different cs'' Odpowiedz z cytatem Pisownia

Tak jak podałam w temacie przy kompilacji pojawia mi się taki właśnie błąd i nie wiem dlaczego.
Czy to może być wina kompilatora? Używam DosBoxa'a 0.74.
A tak wygląda kod:
Kod:
dane   segment

jeden   db      '   #   $', '  ##   $', ' # #   $', '   #   $', '   #   $', '   #   $', ' ##### $'
zero    db      '  ###  $', ' #   # $', '#     #$', '#     #$', '#     #$', ' #   # $', '  ###  $'
newline db      10, 13, '$'
err     db      'Podano bledna cyfre!$'
dane   ends

; glowny program
glowny  segment

start:
                mov    ax,seg top1
                mov ss,ax
                mov sp,offset top1 ; inicjowanie stosu
                
                mov ax, seg zero
                mov ds, ax
                mov ah,8 ; wczytanie cyfry z klawiarury
                int 21h
                
                cmp al,'0' ; porownujemy podana cyfre z '0'
                jb      blad ; jesli al<'0' - mamy blad
                
                cmp al,'9' ; porownujemy podana cyfre z '9'
                jbe zamienCyfre ; podana cyfra jest z przedzialu '0'-'9'
                
                cmp al,'A' ; porownujemy z 'A'
                jb blad ; jesli cyfra jest z przedzialu '0'-'A' - mamy blad
                
                cmp al,'F' ; porownujemy z 'F'
                jbe zamienDuzaLitere ; podana cyfra jest z przedzialu 'A'-'F'
                
                cmp al, 'a' ; porownujemy z 'a' (dopuszczam wpisanie malych liter)
                jb blad ; znak z przedzialu 'G'-'`' - mamy blad
                
                cmp al, 'f' ; porownujemy z 'f'
                jbe zamienMalaLitere ; podana cyfra jest z przedzialu 'a'-'f'
                ja blad ; jesli jest >f - mamy blad
                jmp next
                
blad:
                mov ax,seg err
                mov ds,ax
                mov dx,offset err
                call prints
                jmp koncz
; konwersje polegaja na operowaniu kodami ASCII danych liter,
;poprzez odejmowanie 'granicznych' wartosci (i dodawanie 10 w przypadku liter)
;uzyskujemy wartosc rowna dziesietnemu odpowiednikowi
zamienCyfre:
                sub al,'0'
                jmp next
zamienDuzaLitere:
                sub al,'A'
                add al,10
                jmp next
zamienMalaLitere:
                sub al,'a'
                add al,10
                jmp next
next:  
                mov cx,7 ; licznik petli zewnetrznej, wypisuje 7 linii bannera
                mov bx,0 ; zaczynamy od 1 wiersza, wiec na poczatku bx (przesuwajacy wypisywanie do kolejnej linii)=0
                push cx
                mov cl,4
                shl al,cl ; przesuniecie koncowych bitow z al w lewo
                pop cx

        wypiszBanner: ; petla zewnetrzna
                push cx ; odsylamy licznik petli zewnetrznej na stos
                push ax ; zachowujemy wartosc ax
                mov cx,4 ; licznik petli wewnetrznej przeliczajacej bity
        wypiszWiersz:   ; petla wewnetrzna  
                shl al,1 ; przesuniecie cyfry z al w lewo o jeden bit
                ;        sprawdzamy, czy flaga ma wartosc 0 czy 1
                jnc wypiszZero ; jesli cf=0, wypisujemy wiersz z bannera zero
                ;w przeciwnym wypadku mamy 1
                mov si,offset jeden
                mov dx,0
                add dx,si
                add dx,bx
                call prints
                jmp dalej
                
        wypiszZero:
                mov si,offset zero
                mov dx,0
                add dx,si
                add dx,bx
                call prints
                
        dalej:

        loop wypiszWiersz
        mov dx, offset newline
        call    prints ; wypisujemy przejscie do nowej linii
        add bx,8 ; dodajemy do bx 8, czyli wskazujemy na poczatek nowego wiersza w bannerach
        pop ax ; pobieramy ax(al) ze stosu w celu ponownego 'przetworzenia'
        pop cx  ; pobieramy licznik petli zewnetrznej
        
        loop wypiszBanner
                
koncz:
                mov ax,04c00h ; zakonczenie programu
                int 21h
                
; wypisywanie stringa na ekran
prints:
        push ax
        mov ah, 9
        int 21h
        pop ax
        ret

glowny  ends

stos1   segment STACK
                dw      200 dup(?)
top1    dw      ?
stos1   ends

end start
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.16336 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |