Assembler Loop Problem

engelmarkus

Erfahrenes Mitglied
Guten Abend zusammen!
Ich habe hier ein sehr merkwürdiges Problem, ich weiß nicht, woher das kommt.
In meinem Code habe ich eine kleine Schleife, mit "loop" gibts eine Access Violation, mit einer "selbstgeschriebenen" Schleife, die meiner Meinung nach exakt dasselbe tut, funktioniert es.

Code:
section .data
  titel db 'Hallo du!', 13, 10, 0
  titelL equ $ - titel-1

section .code
  global main
  main:
    push byte 1            ; Verschiebung
    push word titelL-2  ; Länge
    push dword titel   ; Text
    call CaesarVerschluesselung
    ....
  ret

CaesarVerschluesselung:
  push ebp
  mov ebp, esp

  mov esi, [ebp+8]  ; Text
  mov edi, esi

  mov cx, [ebp+12] ; Länge

  mov dl, [ebp+14] ; Verschiebung
  xor dh, dh

  @schleife:
   lodsb

   add ax, dx

   stosb

;   dec cx
;   cmp cx, 0
;  jnz @schleife
loop @schleife

 mov esp, ebp
 pop ebp
ret 7

So wie er im Moment oben ist, funktioniert der Code nicht. Wenn man stattdessen das "loop" auskommentiert und dafür das mit cmp und jnz dazunimmt, geht es.
 
Zuletzt bearbeitet:
WElchen Kompiler benuzt du? Kann sein, dass deiner Noch die älteren Assembler befehle hat und das loop für ihn neu ist.
 
Ich benutze den nasm Version 2.06rc2 unter Windows Vista.
Was heißt, dass er noch die älteren Assembler-Befehle hat? Gibts von loop verschieden Versionen oder so? :)
 
Hm.. tut mir leid, mit deinem Kompiler kenn ich mich nicht aus. Nun es ist so, das man heute deutlich mehr Asm Operationen hat als früher. Bin mir nicht sicher welche, Aber ich mein heute kann man den Processor auch multiplizieren lassen, wass man früher nur durch schleifen lösen konnte;)

Es kann auch sein, dass deine ALU (oder was genau den Asm code umrechnet) älter ist, und deswegen den loop befehl nicht kennt. Als tip, versuch mal das gleiche auf einem anderen Rechner zu starten (der auch evtl etwas neuer ist);)

Mich würd das auch interessieren;)
 
Ich hab den Fehler gefunden.
Ich programmiere ja unter Windows, das heißt, ich hab 32-bit breite Register. Und "loop" dekrementiert dann auch ecx, nicht wie ich angenommen hatte, cx. :-(

Code:
Function CaesarVerschluesselung
  mov esi, [ebp+8]
  mov edi, esi
  
  movzx ecx, word [ebp+12]
  movzx dx, byte [ebp+14]
  
 .schleife:
  lodsb
  
  add ax, dx
  
  stosb
 loop .schleife
EndFunction 7

So funktioniert es dann doch mit loop.
 
Hm.. tut mir leid, mit deinem Kompiler kenn ich mich nicht aus.
Das ist kein Kompiler, eher ein Assembler.

Nun es ist so, das man heute deutlich mehr Asm Operationen hat als früher.
Das kommt ganz auf die verwendete Architektur an. Es gibt auch RISC-Prozessoren.

Bin mir nicht sicher welche, Aber ich mein heute kann man den Processor auch multiplizieren lassen, wass man früher nur durch schleifen lösen konnte;)
Das ist aber schon verdammt lange her dann. Multiplizieren konnte sogar der 8086/8088 schon.

Es kann auch sein, dass deine ALU (oder was genau den Asm code umrechnet) älter ist, und deswegen den loop befehl nicht kennt. Als tip, versuch mal das gleiche auf einem anderen Rechner zu starten (der auch evtl etwas neuer ist);)
Der Assembler-Quellcode wird vom Assembler in Maschinencode umgesetzt, nicht von der ALU. Auch LOOP konnte der 8086/8088 schon, es ist also unwahrscheinlich dass irgendeine heutige x86-Desktop-CPU mit diesem Opcode nichts anfangen kann...

Nichts für ungut, aber Halbwissen ist immer etwas gefährlich ;)

Grüße, Matthias
 
Nichts für ungut, aber Halbwissen ist immer etwas gefährlich
Ich kenn jmdn, der würde jezt sagen: Unwisser Geheimnisse:D
:-( Nun gut^^ Habe versucht das was von meinem Schulwissen über Assembler noch übrig war mit reinfliesen zu lassen. Ich schätze die Sache mit dem Multiplizieren, hatte ich nun etwas durcheinander gebracht:D Wir hatten damals mit kleineren Robotern gearbeitet, und deren CPU's konnten nix^^
 
Zurück