mov eax,0x100000
mov ds,eax
mov es,eax
das geht nicht. du versuchst da ds und es mit einem 32bit wert (soll wohl ein offset sein) zu laden. sie werden danach den wert 0 haben, weil sie 16bit register sind. (die oberen 16 bit sollten abgeschnitten werden) mich wundert dass du keine exception bekommst. du musst sie mit einem gültigen 32bit datenselektor mit basis 0x00000000 und limit 0xFFFFF (4GB) laden.
check_ram_loop:
mov al,0x80
stosb
xor al,al
lodsb
cmp al,0x80
je check_ram_loop
diese schleife testet in 1 byte schritten! das ist ein bisschen langsam und sinnlos. besser wären schritte von 1 MByte. vor allem weil du das mit einer division sowieso nochmal in MByte umrechnest. außerdem überschreibst du den gesamten arbeitsspeicher. du könntest wichtige datenstrukturen kaputt machen/beeinflussen! du solltest zumindest die einzelnen speicherstellen sichern, dann testen und dann wieder die "sicherung" zurückschreiben.
außerdem überschreibst du dein eigenes programm, denn du fängst bei 0 an. den startwert solltest du in edi und esi laden, nicht in die segment register. (aber eigentlich hättest du vorher eine exception bekommen müssen, weil du einen nullselektor geladen hast. vielleicht ist das ein bug in bochs, der denkt "0x100000 ist ungleich 0, also alles ok" oder so ...)
porkchicken