Seite 1 von 1

Assembler - Unerklärlicher Schwerer Rechenfehler

Verfasst: 03.09.2011 12:00
von FosJonas
Guten Tag,

Habe mal wieder ein Problem mit Assembler in Purebasic:

Folgender Code:

Code: Alles auswählen

Global Tabelle.i = AllocateMemory(3600)
For X = 0 To 3600
  PokeB(Tabelle+X,X)
Next

!Push rax
!Push r12
!Push AX
!mov AL,r12b
!Push AX
!mov AL,r11b
!Push AX

!mov rax,[v_Tabelle]
;!mov r12b,[rax+r12]
!Or AX,AX
!mov AL,r11b
;!div r12b
!mov r12b,AL

!Pop AX
!mov r11b,AL
!Pop AX
!mov r12b,AL
!Pop AX
!Pop r12
!Pop rax
Funktioniert zwar, aber sobald ich die auskommentierten 2 Zeilen hinzunehme (bzw. nur eine davon) gibt es einen Schweren Rechenfehler bei der For Schleife.
Nur ist das für mich völlig unerklärlich, ich Sichere ja alle Variablen, und selbst wen ich das nicht täte wäre die For Schleife ja vor dem Einfluss des Assembler codes und müsste doch damit gar keinen Zusammenhang haben?

Bin hierbei ziemlich ratlos was den Fehler erzeugt, hoffe das jemand von euch weiter weis.

Danke im Vorraus für eure Hilfe.

Re: Assembler - Unerklärlicher Schwerer Rechenfehler

Verfasst: 03.09.2011 12:32
von Thorium
Was ist das denn für ne komische Pushorgie da? Die Register brauchst du nicht sichern. Ausserdem werden immer 8 Byte unter x64 auf den Stack gepusht, push ax sollte nicht verwendet werden. Überhaubt solltest du davon absehen 16bit Registerzugriffe zu verwenden, da diese viel langsamer als 8, 32 oder 64 bit Zugriffe sind. 16 Bit wird nicht mehr benötigt und wird daher nicht mehr optimiert von den CPU-Herstellern.

Und der Fehler scheint mir ziemlich offensichtlich:

Code: Alles auswählen

;!mov r12b,[rax+r12]
Ich sehe dich nirgendwo r12 mit einem Offset füllen.

Re: Assembler - Unerklärlicher Schwerer Rechenfehler

Verfasst: 03.09.2011 13:18
von FosJonas
Danke für die Schnelle Hilfe,

Soweit ich weiß muss man Register doch sichern wen man vorher und nachher Purebasic befehle nutzt, das war in diesem verkürzten code zwar nicht der Fall aber im richtigen Code schon.

Dachte wen ein Register sofern nicht anders angeben immer 0 ist, da lag ich wohl falsch habe ich korregiert.

Gut ich werde statt 16 bit die 32bit Register nutzen, die machen in der tat weniger Probleme als die 16bit.

Damit wären meine Probleme wohl gelöst, danke für die Hilfe.