Geschwindigkeit lässt zu wünschen übrig



  • Also ich arbeite mich seit einigen Tagen, um genau zu sein 3, in Assembler ein. Ich komme aus dem C++ Lager und habe dort auch schon viele Erfahrungen sammeln können. Nun habe ich nach längerem Studium eines Tutorials versucht mein erstes Programm zu schreiben.

    TITLE Input Test
    IDEAL
    MODEL SMALL
    STACK 1024
    
    DATASEG
    		cHeadline_01 db '============================================',0Dh,0Ah,'$',00h
    		cHeadline_02 db 'Input Test 1.0 (c) 2007 by Kevin Jakob',0Dh,0Ah,'$',00h
    		cMsg_01 db 'Bitte geben Sie ihren Namen ein : $',00h
    		cInput db 10 dup (010h,00h)
    CODESEG
    start:
    		STARTUPCODE
    			push OFFSET cHeadline_01
    			call WriteText	
    			add sp,4
    			push OFFSET cHeadline_02		
    			call WriteText
    			add sp,4
    			push OFFSET cHeadline_01
    			call WriteText
    			add sp,4
    			push OFFSET cMsg_01
    			call WriteText
    			add sp,4
    			push OFFSET cInput
    			call ReadText
    		EXITCODE
    
    		PROC WriteText
    			push bp
    			mov bp,sp
    			mov ah,09h
    			mov dx,[bp+4]
    			int 21h
    			pop bp
    			ret
    		ENDP
    
    		PROC ReadText
    			push bp
    			mov bp,sp
    			mov ah,0Ah
    			mov dx,[bp+4]
    			int 21h
    			pop bp
    			ret
    		ENDP
    
    END start
    

    Das Programm erfüllt auch seinen Zweck, es gibt 3 Zeilen aus, bevor es eine Zeile einliest und sich beendet.

    Das Problem, welches mich stört ist jedoch, dass bei der Eingabe alles verzögert reagiert. Dieses Phämomen dritt z.B. bei einem Standard C++ Programm nicht auf.

    Ich hatte gedacht, es könnte vielleicht an der 16 Bit Emulation von Windows XP liegen, da ich ja mit tasm.exe und tlink.exe solche 16 Bit Programme Assembliere . Kann mir jemand das bestätigen, bzw. mir sagen, woran es vielleicht liegen könnte?



  • Kann eigentlich nur an der NTVDM liegen, aber eine andere Sache:
    Ist zwar schoen (zumindest optisch im Code vielleicht), dass du versuchst, C-Aufrufe zu verwenden, aber wenn ich nicht gar fuerchterlich daneben liege, sind deine Funktionsparameter jeweils nur 2 Byte lang. Somit rollst du ein bissel den Stack auf... 😉



  • Ah also liege ich mit meiner Vermutung richtig, gut. Aber wie meinst du das mit den Parametern? Ich habe doch hinter diesen Prozeduren keine Parameter. Steh grad auf dem Schlauch.

    Kann ich denn etwas gegen diese "Emulierschwäche" der NTVDM tun?



  • Kevinus schrieb:

    Ah also liege ich mit meiner Vermutung richtig, gut. Aber wie meinst du das mit den Parametern? Ich habe doch hinter diesen Prozeduren keine Parameter. Steh grad auf dem Schlauch.

    push OFFSET cHeadline_01   ; <- Funktionsparameter
                call WriteText   
                add sp,4                   ; <- aufraeumen - hier Fehler, sollte IMHO 2 statt 4 heissen
    

    Kevinus schrieb:

    Kann ich denn etwas gegen diese "Emulierschwäche" der NTVDM tun?

    Schnelleren Rechner kaufen? Das Programm unter einem echten DOS laufen lassen? ...



  • Ich schätze ein schnellerer Rechner wird da auch nicht helfen. Ein X2 4200+ sollte schon ausreichen dafür. Aber unter echtem Dos laufen, daran habe ich auch schon gedacht.

    Zu deiner Anmerkung, dazu habe ich eine Frage:
    In der Write Prozedur und auch in der Read Prozedur greife ich ja auf die gepushten Werte mit [bp+4] zu, wenn ich jetzt hier auch [bp+2] schreibe, dann erfolgt eine falsche Ausgabe. Wieso, wenn es sich, wie ich vermute, bei Adressen ja eigentlich um Word, also 16 Bit=2 Byte , Werte handelt, wieso funktioniert dann die zweite Möglichkeit nicht. Ich pushe ja eigentlich nur den OFFSET des Strings und dann noch bp. Oder hat vielleicht auch die Prozedur eine Word Adresse auf dem Stack, wenn sie aufgerufen wird?



  • Kevinus schrieb:

    Oder hat vielleicht auch die Prozedur eine Word Adresse auf dem Stack, wenn sie aufgerufen wird?

    Nagel auf'n Kopp. 😉
    Anzumerken ist, dass die Funktion ihre Ruecksprunkadresse mit ret auch selbst wieder vom Stack raeumt. Dein 2Byte-Parameter bleibt dann noch ueber.

    Der Stapel sieht in der Funktion dann letztlich so aus:
    ----
    Offset ...
    ---- +4
    Ruecksprungadresse
    ---- +2
    bp
    ---- sp



  • Gut soweit alles kapiert, dass mit dem Stack stimmte auch, läuft nun alles einwandfrei.

    Habe das Programm auf FreeDos getestet(innerhalb von Virtual PC 2007) dort lief das Programm so rasend wie man es erwartet hat. Desweiteren kann ich dort tasm.exe und tlink.exe direkt ausführen, wodurch ich auf den Umweg mit Windows XP nun komplett verzichten kann. Sehr schön 😃 😃 . Thx für deine Denkanstöße!


Anmelden zum Antworten