Hiho!
Ich habe da eine Frage bzgl. eines kleinen programms, an dem ich gerade hocke.
Es geht um asm programmierung unter unix für die x86 architektur.
Und zwar soll ein programm geschrieben werden, welches sich per syscall den aktuellen unix timestamp holt.
Der timestamp ist, jedenfalls momentan noch ^^, eine 10 stellige Zahl, die die vergangene Zeit in Sekunden seit dem 1. Jan 1970 00:00Uhr angibt.
Aufgabenstellung ist es nun, hieraus (nur) die aktuelle uhrzeit zu ermitteln.
Ich habe mir auch bereits überlegt, wie das von statten gehen muss.
Und zwar müsste es so laufen, dass ich mir den timestamp schnappe und ersteinmal durch 86400 (3600*24) teile, um die vergangenen Tage zu ermitteln.
Ab hier kann ich dann mit den nachkommastellen weiterarbeiten, um direkt die Stunden, Minuten und Sekunden der aktuellen Uhrzeit zu ermitteln.
Also nehme ich den nachkommateil *24 für die Stunden. Den Nachkommateil dieses Ergebnisses *60 für die Minuten, und dann den Nachkommateil dieses Ergebnisses wiederum *60 für die Sekunden.
Mein Prog sieht immo noch wie folgt aus:
Bitte nicht direkt in ohnmacht fallen ich hab mit asm leider nicht sehr viel erfahrung bisher.
Meine Probleme sind nun folgende:
wie man sieht, habe ich die stack operationen ersteinmal rausgenommen und versucht die vorkommazahlen (welche ich für die stunden, minuten und sekunden brauche, ersteinmal direkt auszugeben über einen ausgabebuffer.
Allerdings bekomme ich auf der console momentan nur ">>" ausgegeben. Ich weiß zwar, dass der code immo noch relativ schäbbich ist, allerdings finde ich nicht direkt den fehler.
Liegt es an meiner division? An der Abspeicherung der Werte oder an was völlig anderem?
Ausgabe soll später mal etwa so aussehen: 22:00:00
Vielen Dank schon einmal im voraus
MfG,
Calizo
edit: mir fällt gerade auf, kann es sein, dass das ergebnis des sysrufs in binärform vorliegt? War bisher ziemlich naiv von einer Dezimaldarstellung ausgegangen.
Wenns so wäre, und es ne Binärzahle ist, verkompliziert es die Sache leider glaube ich :/
Desweiteren habe ich glaub ich nen fehler in meiner Ausgabe entdeckt, kann es sein, dass ich den Wert, den ich ausgeben möchte, nicht bekomme, weil er von mir direkt bei der Ausgabe überschrieben wird?
Ich habe da eine Frage bzgl. eines kleinen programms, an dem ich gerade hocke.
Es geht um asm programmierung unter unix für die x86 architektur.
Und zwar soll ein programm geschrieben werden, welches sich per syscall den aktuellen unix timestamp holt.
Der timestamp ist, jedenfalls momentan noch ^^, eine 10 stellige Zahl, die die vergangene Zeit in Sekunden seit dem 1. Jan 1970 00:00Uhr angibt.
Aufgabenstellung ist es nun, hieraus (nur) die aktuelle uhrzeit zu ermitteln.
Ich habe mir auch bereits überlegt, wie das von statten gehen muss.
Und zwar müsste es so laufen, dass ich mir den timestamp schnappe und ersteinmal durch 86400 (3600*24) teile, um die vergangenen Tage zu ermitteln.
Ab hier kann ich dann mit den nachkommastellen weiterarbeiten, um direkt die Stunden, Minuten und Sekunden der aktuellen Uhrzeit zu ermitteln.
Also nehme ich den nachkommateil *24 für die Stunden. Den Nachkommateil dieses Ergebnisses *60 für die Minuten, und dann den Nachkommateil dieses Ergebnisses wiederum *60 für die Sekunden.
Mein Prog sieht immo noch wie folgt aus:
;;;sys calls
%define SYS_CLOCK 0x0c
%define SYS_WRITE 4
%define SYS_READ 3
%define SYS_EXIT 1
;;;file ids
%define STDIN 0
%define STDOUT 1
section .data
opa: dd 86400
opb: dd 24
opc: dd 60
section .bss
outbuf: resb 32
section .text
global _start
_ausgabe:
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, outbuf
mov edx, 1
int 80h
ret
_start:
timestamp:
mov eax, SYS_CLOCK
mov ebx, 0
dontcare:
mov ebx, [opa]
div ebx
stunden:
mov ebx, [opb]
mov eax, edx
mul ebx
;push ax
mov [outbuf], ax
call _ausgabe
minuten:
mov ebx, [opc]
mov eax, edx
mul ebx
;push ax
mov [outbuf], ax
call _ausgabe
sekunden:
mov ebx, [opc]
mov eax, edx
mul ebx
;push ax
mov [outbuf], ax
call _ausgabe
end:
mov eax, SYS_EXIT
mov ebx, 0
int 80h
Bitte nicht direkt in ohnmacht fallen ich hab mit asm leider nicht sehr viel erfahrung bisher.
Meine Probleme sind nun folgende:
wie man sieht, habe ich die stack operationen ersteinmal rausgenommen und versucht die vorkommazahlen (welche ich für die stunden, minuten und sekunden brauche, ersteinmal direkt auszugeben über einen ausgabebuffer.
Allerdings bekomme ich auf der console momentan nur ">>" ausgegeben. Ich weiß zwar, dass der code immo noch relativ schäbbich ist, allerdings finde ich nicht direkt den fehler.
Liegt es an meiner division? An der Abspeicherung der Werte oder an was völlig anderem?
Ausgabe soll später mal etwa so aussehen: 22:00:00
Vielen Dank schon einmal im voraus
MfG,
Calizo
edit: mir fällt gerade auf, kann es sein, dass das ergebnis des sysrufs in binärform vorliegt? War bisher ziemlich naiv von einer Dezimaldarstellung ausgegangen.
Wenns so wäre, und es ne Binärzahle ist, verkompliziert es die Sache leider glaube ich :/
Desweiteren habe ich glaub ich nen fehler in meiner Ausgabe entdeckt, kann es sein, dass ich den Wert, den ich ausgeben möchte, nicht bekomme, weil er von mir direkt bei der Ausgabe überschrieben wird?
Zuletzt bearbeitet: