2016-06-27 12 views
3

Wenn ich versuche, einen Wert aus dem BX-Register in ein Array-Element zu verschieben, ändert sich der Wert vollständig.
Nehmen wir zum Beispiel sagen, dass meine Array {0,4,4}, die SI Register gleich 1 ist, und colorNum = 3 (colorNum und die Anordnung sind sowohl in Wortgröße). {769,0,4}
Ich weiß einfach nicht, was schief gelaufen ist, wie es hätte sein sollen:Wert ändert sich mit mov von einem Register zu einem Array

mov bx, [colorNum] 
mov [arr + si], bx 

Im Anschluss daran ich im Debugger, der das Array jetzt sehen konnte {0, 3,4}

Was sollte ich ändern, um den richtigen Wert in das Array zu verschieben?

+2

Wenn jedes Element ein WORD ist, muss "si" 2 sein, um das zweite Element zu speichern. Sind Sie sicher, dass das ursprüngliche Array nicht "{1, 4, 4}" war? das würde die '{769,0,4}' –

+0

erklären Was ist, wenn 'si' korrekt ist und es bereits' 2 * index' ist? Es ist unmöglich zu sehen, ob dies der Fall ist. –

Antwort

2

Der Ausdruck arr + si entspricht (char*)arr+1.

Nehmen wir an, dass die Größe der word 2: mit mov [arr + si], bx, Sie sind ein word Wert in der zweiten Hälfte der ersten Zelle des Arrays und der ersten Hälfte der zweiten Zelle des Arrays zu schreiben.

Sie müssen also arr + si durch einen Ausdruck ersetzen, der (char*)arr+1*sizeof(word) entspricht.

+0

beantwortet, danke! –

+0

@AlonGroberman: Gern geschehen. –

+2

'arr + si * 2' ist kein gültiger 16-Bit-Adressierungsmodus. Da die Frage das * assembly * -Tag hat, wäre es nett, einen korrekten Assembly-Code anzugeben :) –