Hi,
offensichtlich ist dein Programm ein Protected Mode (vermutlich ein Windows-)Programm, weil die Adresse 0x41C0D4 > 1 MByte ist. Das nächste mal bitte miterwähnen
Im Protected Mode gilt eine andere Adressierung als im Real Mode. Du kannst nicht einfach auf die Adresse 0x41C0D4 zugreifen indem du das Segment auf 0x41 und das Offset auf 0xC0D4 setzt, weil die Segment-Register im Protected Mode eine andere Bedeutung haben als im Real Mode.
Im Protected Mode, vielleicht auch bekannt als 32 Bit Modus, wird mit 32 Bit Adressiert, sonst hätte er den Namen nicht. Auf die Adresse 0x41c0d4 greifst du so zu:
mov [0x41c0d4], 4
fertig! DS und ES und wie se nich alle heissen sind bereits korrekt gesetzt. Jede Ãnderung würde wahrscheinlich den Absturz des Programms (genauer General Protection Fault oder dt. Allgemeine Schutzverletztung) zur Folge haben.
So um die nächste Frage vorzugreifen:
Der PorkChicken erzählt Bullshit! Es funktioniert immer noch nicht!
Das liegt an dem "Protected" (= geschützt) in Protected Mode. Windows läuft im Protected Mode. Das heisst, die einzelnen Programme sind voreinander geschützt. Dein Assembler Programm kann nicht einfach so auf dein C++ Programm zu greifen. Dazu braucht es vorher entsprechende Rechte. Dass das nicht ganz einfach ist die zu beschaffen, ist dir hoffentlich klar. Google dazu nach ordentlich Tutorials/Dokus zu
VirtualAlloc und
ReadProcessMemory und was dir dabei noch so über den Weg läuft. Mit Assembler würde ich das nicht lösen, sondern auch mit C (oder C++ meinetwegen ...).