Verständnisfrage Klausuraufgabe



  • Hallo,
    ich habe hier eine Klausuraufgabe vor mir liegen und weiß nicht so richtig, ob es es verstanden habe.

    Hier erst einmal der Link zur Aufgabe:
    http://s14.directupload.net/file/d/3179/yupq8rxx_png.htm

    Verstehe ich es richtig, dass zu beginn in [EDI] (also in [4200DFFFh]) der Wert 11h steht?



  • Patrick1990 schrieb:

    Hallo,
    ich habe hier eine Klausuraufgabe vor mir liegen und weiß nicht so richtig, ob es es verstanden habe.

    Hier erst einmal der Link zur Aufgabe:
    http://s14.directupload.net/file/d/3179/yupq8rxx_png.htm

    Verstehe ich es richtig, dass zu beginn in [EDI] (also in [4200DFFFh]) der Wert 11h steht?

    Ja richtig, genauso ist es dort abgebildet und EDI soll ja diese Adresse enthalten.

    Dirk



  • Ok danke und diese Ändert sich ja bei jedem Durchlauf der Schleife...
    Wenn ich so grob drüber gucke denke ich das sich der Wert danach (den ich eintragen muss) immer nur um 1 erhöht wird also 12H,13H,...

    Ist das korrekt oder habe ich hier einen Denkfehler?



  • Patrick1990 schrieb:

    Ok danke und diese Ändert sich ja bei jedem Durchlauf der Schleife...
    Wenn ich so grob drüber gucke denke ich das sich der Wert danach (den ich eintragen muss) immer nur um 1 erhöht wird also 12H,13H,...

    Ist das korrekt oder habe ich hier einen Denkfehler?

    Das ist falsch. Schaue noch einmal ganz genau hin. Es gibt nur einen einzigen Schreibbefehl der die Byte-Werte von 4 aufeinander folgende Adressen verändern kann mit einem einzigen DWORD-Schreibbefehl, der sich auch erst hinter der Schleife befindet.
    Innerhalb der Schleife wird nur dem AL-Register und dem AH-Register in jedem Durchlauf ein Wert aus dem Speicher dem AL-Register hinzu addiert und dem AH-Register abgzogen, wobei die Adresse von wo die Werte geholt werden jeweils um eine Adresse erhöht wird mit jedem Durchlauf.

    Ich habe für mich die Schleife mit den dortigen Befehlen mal auseinander gerollt und für jeden Durchlauf die Befehle untereinnander ausgeschrieben, womit die Schleife aufgelöst und ersetzt wird. (Das JNZ kommt ganz weg.)
    Als Kommentar habe ich hinter die Befehle die jeweiligen Ergebnisse geschrieben die sich aus dem Befehl ergeben.
    So konnte ich die Aufgabe Befehl für Befehl lösen.

    Ich meine das du das nun auch schon beherschen können solltest und deswegen möchte ich von dir zunächst erkennen, das du es wirklich schon verstanden hast, noch bevor ich dir meine Lösung poste. Weil der Sinn dieser Aufgaben besteht ja darin es selber zu lernen und nicht darin ein Ergebniss zu erschummeln.
    Du kannst aber gerne weitere Fragen zum Verständniss stellen, für den Fall es doch noch Unklarheiten gibt.

    Ich kann mich auch noch etwas daran erinnern als ich einen auskunftfreudigen Menschen kennengelernt habe den ich mit solchen Fragen quasi überschüttet habe. Erst nach den zahlreichen und sehr aufschlussreichen Antworten formte sich langsam eine grobe Vorstellung davon wie ich mir die Arbeisweise von CPUs vorstellen kann.

    Zu dieser Zeit habe ich aber nur mit Basic-Befehlen auf einem TI994A-Homecomputer experimentiert und es immer noch gar nicht in Betracht gezogen selber die Assemblersprache zu lernen. Aber mein Wissensdurst darüber war nun schon einmal geweckt worden.

    Auch heute noch bin ich für diese Hilfe sehr dankbar und nur mit diesem Wissen war es mir überhaupt erst möglich danach die technischen Dokumente mit den zahlreichen Fachbegriffen zu verstehen, nachdem ich diese Dokumente immer und immer wieder versucht habe zu lesen, was mir am Anfang auch nicht so leicht fiel und schon etwas an Überwindung der inneren Faulheit nötig machte, so etwas aus eigenen Antrieb und ohne weitere Hilfe es zu lernen. Zu meiner Schulzeit war an meiner Schule das Mitbringen von einem Taschenrechner noch verboten gewesen und Computer gab es noch keine an den Schulen.

    Dirk



  • Hallo Dirk,
    ich danke dir für deine Antowort, habe mich nun mal hingesetzt nachdem ich noch einmal alles genauestens gelesen habe.

    Meine Ergebnisse:
    ----------------------------------
    
    Registerinhalte:
    
     AH: 00h
     AL: FFh
    EDX: 4200DF20h
     SI: 0
    EDI: 4200E004h
    
    Speicherinhalte:
    
                  davor  |  danach 
    4200E003h  |   55h   |   42h
    4200E002h  |   44h   |   00h
    4200E001h  |   33h   |   E0h
    4200E000h  |   22h   |   04h
    4200DFFFh  |   11h   |   11h
    

    Gruß,
    Patrick



  • Jo, das habe ich auch. Das ist richtig.

    AL=FFh
    AH=00h
    EDX=4200DF20h
    SI=00h
    EDI=4200E004h
    byte(4200DFFFh)=11h
    byte(4200E000h)=04h
    byte(4200E001h)=E0h
    byte(4200E002h)=00h
    byte(4200E003h)=42h
    


  • Ich habe aber andere Ergebnisse bekommen (siehe unten).

    Dafür habe ich die Schleife ausgerollt, d.h. anstelle der Schleife habe ich die dort enthaltenen Befehle so oft wiederholt ausgeschrieben und untereineander plaziert, bis sie den in der Schleife durchlaufenden Befehle entsprechen und damit die Schleife aufgelöst und ersetzt werden konnte.

    Kurze Erkläung zu den Randnotizen:
    Hinter jedem Befehl habe ich geschrieben was passiert und was dabei herauskommt.
    Z.B. beim 4. Befehl mit "+11h" wird zu dem betreffenden Register der Wert "11h" hinzuaddiert. Danach folgt das betreffende Register mit seinem aktuellen Inhalt nach der Operation. z.B. mit "al=11h"

    EDI = 4200DFFFh
    
    mov ax,0FF00h ; al=0 ah=0FFh
    mov si,5      ; SI=5
    mov edx,edi   ; EDX=4200DFFFh
    
    add al,[edi]  ; +11h al=11h
    sub ah,[edi]  ; -11h ah=0EEh
    add edi,1     ; +1 edi=4200E000h
    sub si,1      ; -1 SI=4
    
    add al,[edi]  ; +22h al=33h
    sub ah,[edi]  ; -22h ah=0CCh
    add edi,1     ; +1 edi=4200E001h
    sub si,1      ; -1 SI=3
    
    add al,[edi]  ; +33h al=66h
    sub ah,[edi]  ; -33h ah=99h
    add edi,1     ; +1 edi=4200E002h
    sub si,1      ; -1 SI=2
    
    add al,[edi]  ; +44h al=0AAh
    sub ah,[edi]  ; -44h ah=55h
    add edi,1     ; +1 edi=4200E003h
    sub si,1      ; -1 SI=1
    
    add al,[edi]  ; +55h al=0FFh
    sub ah,[edi]  ; -55h ah=0h
    add edi,1     ; +1 edi=4200E004h
    sub si,1      ; -1 SI=0
    
    mov [edx+1],edi ; Adresse 4200E000h=4200E004h
    sub dl,dh     ; dl=20h edx=4200DF20h
    

    Danach:

    AH=0
    AL=0FFh
    EDX=4200DF20h
    SI=0
    EDI=4200E004h

    4200E003h=55h
    4200E002h=44h
    4200E001h=33h
    4200E000h=4200E004h
    4200DFFFh=11h

    Nun hoffe ich das ich selber keinen Fehler gemacht habe.

    Dirk



  • freecrac schrieb:

    [/code]
    ...
    4200E001h=33h
    4200E000h=4200E004h
    {/code]

    Wenn ab der Speicheradresse 4200E000 das DWORD 4200E004 zu finden ist, dann kann in Speicherstelle 4200E001 nicht das BYTE 33 stehen. 😃

    viele grüße
    ralph

    EDIT: Ich glaube, Dir (freecrac) kann ich ohne große Erklärungen grdbg empfehlen:

    http://ladsoft.tripod.com/grdb.htm

    Der macht das Gleiche wie DEBUG, aber mit 32-Bit-Registern.



  • Ups, ich habe doch einen Fehler gemacht und auch gefunden.

    Die folgenden Werte sind doch richtig, weil in einem Byte passt ja kein DWORD rein:

    byte(4200DFFFh)=11h
    byte(4200E000h)=04h
    byte(4200E001h)=E0h
    byte(4200E002h)=00h
    byte(4200E003h)=42h

    Dirk



  • rkhb schrieb:

    freecrac schrieb:

    [/code]
    ...
    4200E001h=33h
    4200E000h=4200E004h
    {/code]

    Wenn ab der Speicheradresse 4200E000 das DWORD 4200E004 zu finden ist, dann kann in Speicherstelle 4200E001 nicht das BYTE 33 stehen. 😃

    viele grüße
    ralph

    Ja danke für deine Hilfe, das habe ich nun auch schon festgestellt.

    Dirk


Anmelden zum Antworten