|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 18.01.2007, 23:27 Titel: RTC / int 1ah |
|
|
Habe etwas Neues in asm versucht; es sollte die Zeit anzeigen aber gibt den grössten Zeichensalat (unter Windows XP). Was ist daran falsch?
Danke
Code: |
.model small
.data
Zeit db "Es ist $"
Zeichen db ": $"
Stunde db ?
Minute db ?
Sekunde db ?
.stack 256
.code
start: mov ax, @data
mov ds, ax
mov ah, 2
int 1AH
mov Stunde, ch
mov Minute, cl
mov Sekunde, dh
lea dx, Zeit
mov ah, 9
int 21h
lea dx, Stunde
mov ah, 9
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
lea dx, Minute
mov ah, 9
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
lea dx, Sekunde
mov ah, 9
int 21h
mov ah, 4ch
int 21h
end start
|
_________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 19.01.2007, 00:53 Titel: |
|
|
Mal abgesehen davon, daß die Interrupts unter FreeBASIC 'selten bis gar nicht' funktionieren..
..verrate mir bitte mal, wie FB unter XP die Dos-Interrupts verarbeiten soll?
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 19.01.2007, 09:36 Titel: |
|
|
Ich schätze, er hat einen DOS-Compiler genommen?
Hab deinen Code grad nur überflogen, aber dein Problem wird sein, dass du nicht beachtest, dass die Zeitdaten BCD codiert sind. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 19.01.2007, 12:29 Titel: |
|
|
Ja es ist MASM. DIe DIrektiven funktionieren unter FB ja in der Art schon nicht.
Ich habe mich noch nach Routinen umgeschaut für BCD, es gibt Befehle um die zu korrigieren nach einer Berechnung etc. muss ich die manuell in einen String umwandeln? Ein Beispiel fand ich nicht wirklich doch in einer Erklärung stand dass im CX z.B. für 11.28 die Zahl 1128 steht und irgendwie dass sich diese einfach anzeigen liesse (mag ja nicht stimmen), darum dachte ich es geht so _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 19.01.2007, 13:10 Titel: |
|
|
und das hier stürzt ab
Code: |
.386
.model small
.data
Zeit db "Es ist $"
Zeichen db ": $"
ascii db " $"
.stack 256
.code
start: mov ax, @data
mov ds, ax
mov ah, 2
int 1AH
mov ah, ch
call Bcd_to_Ascii
Bcd_to_Ascii:
push ax
shr ax,4
shr al,4
add ah,48
add al,48
mov ascii,ah
mov ascii+1,al
pop ax
ret
lea dx, Zeit
mov ah, 9
int 21h
lea dx, ascii
mov ah, 9
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov ah, cl
call Bcd_to_Ascii
lea dx, ascii
mov ah, 9
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov dh, ah
call Bcd_to_Ascii
lea dx, ascii
mov ah, 9
int 21h
mov ah, 4ch
int 21h
end start
|
_________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 19.01.2007, 23:27 Titel: |
|
|
Dies ist meine Version (TASM):
Code: |
.286p
.model small
.data
Zeit db "Es ist $"
Zeichen db ": $"
cxsave dw 0
dxsave dw 0
.stack 256
.code
start:
mov ax, @data
mov ds, ax
mov ah, 2
int 1AH
mov cxsave,cx
mov dxsave,dx
lea dx, Zeit
mov ah, 9
int 21h
mov dx,cxsave
mov al,dh
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov dx,cxsave
mov al,dl
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov dx,dxsave
mov al,dh
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
mov ah, 4ch
int 21h
bcd_to_ascii proc near
;convert bcd in al into decimal in dx
mov dl,al
mov dh,0
shl dx,4
shr dl,4
add dl,48
add dh,48
ret
bcd_to_ascii endp
end start
|
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 21.01.2007, 00:42 Titel: |
|
|
Beim Assemblieren erhalte ich die Meldung:
Code: |
(78) : error A2070: invalid instruction operands
(79) : error A2070: invalid instruction operands
|
bei den Zeilen
_________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 21.01.2007, 11:32 Titel: |
|
|
Ich weiß nicht was an
shl dx,4
shr dl,4
falsch sein soll.
Ich habe das Programm mit MASM 5.0 compiliert, es läuft klaglos.
masm timetest
link timetest |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.01.2007, 01:39 Titel: |
|
|
Hmm kann das sein dass dieser Assembler diese Befehle nicht kennt? Der war vor kurzem bei einem Buch dabei, eine MASM-Version aber die 32bit-Register funktionieren auch nicht, dürfte eine alte Version sein. Werde gelegentlich mal einen anderen herunterladen (mit MASM32 kann man ja keine DOS-Programme erstellen oder nur nicht damit linken?). _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 24.01.2007, 00:03 Titel: |
|
|
Ja diese Version hat die ja auch und liess sich assemblieren. Einfach stürzte sie ab. Komisch!! Werde es aber trotzdem mal mit einem anderen MASM versuchen, dürfte schon eine andere Version sein. Aber wieso meldet der bei diesen Zeilen Fehler _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 24.01.2007, 00:31 Titel: |
|
|
Der Absturz kam vor allem daher, daß Du mit
Bcd_to_Ascii:
push ax
shr ax,4
shr al,4
add ah,48
add al,48
mov ascii,ah
mov ascii+1,al
pop ax
ret
eine gosub programmiert hast, die es in Assembler so nicht gibt. Wo soll denn ret hinspringen außer in den Abgrund? Außerdem rennt das Programm unbeabsichtigt in diese "gosub" hinein, da diese mitten im code steht.
Die wüsten Zeichen auf dem Bildschirm kommen wohl daher, daß Du das $ Zeichen in der ascii Variablen überschrieben hast und der AH9/21h kein Ende findet. Ascii ist von Dir nur als ein Zeichen plus $ definiert und Du willst zwei Zahlen hineinschreiben. |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 26.01.2007, 15:29 Titel: |
|
|
Super, es hat geklappt! Jetzt muss ich noch eine Warteschleife einbauen und das Programm wiederholen lassen, dass die Zeit "läuft" und es mit irgend einer Taste beendet werden kann _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
Georgp24
Anmeldungsdatum: 30.06.2006 Beiträge: 81 Wohnort: Ahlen
|
Verfasst am: 27.01.2007, 12:55 Titel: |
|
|
Wenn Du diese Funktion einbaust, wartet DOS auf eine Tastatureingabe. Die Zeit läuft dabei weiter.
Du kannst dann die neue Zeit anzeigen und diese Funktion wieder aufrufen.
Das eingebene Zeichen ist in AL. Wenn Du dies auf ESC prüfst, kannst Du das Programm beenden. z.B.
cmp al,27
je do_exit
Code: |
Pressany proc near
push dx
mov dx,offset pressanykey ;message in pressanykey
push ax
mov ax,0900h ;output message
int 21h
mov ax,0800h ;wait for key
int 21h
pop ax
pop dx
ret
Pressany endp
|
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 29.01.2007, 15:47 Titel: |
|
|
Vielen Dank, nun habe ich dieses erfolgreich erstellt:
Code: |
.286p
.model small
.data
Zeit db "Es ist $"
Zeichen db ": $"
cxsave dw 0
dxsave dw 0
Info db "Esc druecken um zu beenden, i druecken um Uhr zu testen, zum beenden esc druecken$"
OK db "Uhr funktioniert, BIOS-Batterie scheint OK $"
NOK db "Uhr / BIOS-Batterie scheint nicht ordnungsgemaess zu funktionieren $"
.stack 256
.code
start:
mov ax, @data
mov ds, ax
lea dx, info
mov ah, 9h
int 21h
mov ah, 02h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h
mov ah, 02h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h
M1: mov ah, 2
int 1AH
mov cxsave,cx
mov dxsave,dx
lea dx, Zeit
mov ah, 9
int 21h
mov dx,cxsave
mov al,dh
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov dx,cxsave
mov al,dl
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
lea dx, Zeichen
mov ah, 9
int 21h
mov dx,dxsave
mov al,dh
call bcd_to_ascii
push dx
mov dl,dh
mov ah, 2
int 21h
pop dx
mov ah, 2
int 21h
mov ah, 1
int 16h
cmp al, 27
je M20
cmp al, 105
je M100
mov bx, 500
M2: mov cx, 0FFFFH
M3: dec cx
jnz M3
dec bl
jnz M2
mov ah, 02h
mov dl, 0dh
int 21h
jmp M1
M20: mov ah, 4ch
int 21h
bcd_to_ascii proc near
;convert bcd in al into decimal in dx
mov dl,al
mov dh,0
shl dx,4
shr dl,4
add dl,48
add dh,48
ret
bcd_to_ascii endp
M100: mov ah, 02h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h
mov ah, 02h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h
mov ah, 2
int 1AH
jc fehler
jmp gut
fehler: lea dx, NOK
mov ah, 9
int 21h
gut: lea dx, OK
mov ah, 9
int 21h
mov ah, 7
int 21h
cmp al, 27
je M20
mov bx, 2000
Ma: mov cx, 0FFFFH
Mb: dec cx
jnz Mb
dec bl
jnz Ma
jmp M100
end start
|
_________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|