sp Register



  • Hallo, lehrne gerade assembler.
    Aus einem russischen buch " Assembler is easy", kann ich das hier:

    .....
    start:
                   mov sp, label
                   mov ax, 9090h
                   push ax
                   int 20h
    label:
                   mov dx, offset msg
                   mov ah, 09h
                   int 21h
                   int 20h
    .....
    

    nicht verstehen.
    in sp wird Adresse von label geschoben, dann auf stack wird nop befehl 2 mal geschoben, und der Autor schreibt das das stack jetzt in programm sich befinden. aaa....????.
    Wiso wird das msg trotzdem gezeigt?
    Wie ???
    kann mir das jemand erklären???



  • asm nooby schrieb:

    .....
    start:
                   mov sp, label
                   mov ax, 9090h
                   push ax
                   int 20h
    label:
                   mov dx, offset msg
                   mov ah, 09h
                   int 21h
                   int 20h
    .....
    

    Wiso wird das msg trotzdem gezeigt?

    Mit 'mov sp,label' zeigt der Stack auf 'label' und "wandert" rückwärts, der nächste Schreibzugriff auf den Stack ('push ax') überschreibt also das 'int 20h'. Das 'int 20h' ist weg und stattdessen steht da: 'nop nop'. Nach dem 'push ax' sieht das Programm so aus:

    .....
    start:
                   mov sp, label
                   mov ax, 9090h
                   push ax
                   nop
                   nop
    label:
                   mov dx, offset msg
                   mov ah, 09h
                   int 21h
                   int 20h
    .....
    

    Das Programm wird also an dieser Stelle nicht mehr beendet, sondern wandert weiter.

    viele grüße
    ralph



  • das heist wenn ich zwei mal
    push ax
    mache so wird auch push ax mit nop überschrieben ?



  • asm nooby schrieb:

    das heist wenn ich zwei mal
    push ax
    mache so wird auch push ax mit nop überschrieben ?

    Es werden dann sogar beide 'push ax' überschrieben, da 'push ax' nur ein Byte im Speicher belegt, während 'push ax' zwei Bytes überschreibt. Den Computer selbst berührt das nicht weiter: das zweite 'push ax' hat er bereits aus dem Speicher geholt, bevor er es überschreibt.

    viele grüße
    ralph



  • aha, jetzt checke ich es....
    ich glaube das so was mut c/c++ nicht möglich zu realisieren.

    Danke für hilfe.!!!


Anmelden zum Antworten