2010-12-30 6 views
2

Ich habe ein kleines Assembly-Snippet (Gas, 32 Bit) geschrieben, das ein Befehlszeilenargument akzeptiert, seine Zeichen zählt und die Zeichenfolge ausgibt, wenn sie eine bestimmte Länge hat (nur zum Debuggen) Zwecke). Ich bin relativ neu in der Assembly, also bin ich mir ziemlich sicher, dass ich hier etwas vermisse, weil ich ein anderes Verhalten erhalte, wenn ich die Saite in eax im Vergleich zu beispielsweise ecx, edx oder esi speichere.Unterschiedliches Verhalten von eax im Vergleich zu anderen Registern

Hier ist das Schnipsel. Wenn Sie esi durch eax ersetzen, wird die Schleife nur zweimal eingegeben, egal wie lang die Zeichenfolge ist, daher ist der Zähler (ebx) immer 1. Mit esi oder anderen Registern scheint alles in Ordnung zu sein.

.section .text 
.globl _start 
_start: 
    movl %esp, %ebp 
    movl 0(%ebp), %eax # get argc 
    cmpl $2, %eax  # ensure argc == 2 
    jne  _exit   
    movl 8(%ebp), %eax # get argv[1] 
    movl $0, %ebx  # set counter to 0 
_begin_loop: 
    movb (%eax), %al  # load a character into %al 
    cmpb $0, %al   # see if \0 is reached 
    je  _end_loop  # exit loop if at end of string 
    incl %ebc   # increment counter 
    incl %eax   # advance string 
    jmp  _begin_loop 
_end_loop: 
    cmpl $6, %ebx  # print the string if it's six characters long 
    jne  _exit 
    movl $4, %eax  # prepare for output 
    movl $1, %ebx 
    movl 8(%ebp), %ecx) 
    movl $6, %edx 
    int  0x80 
_exit: 
    movl $1, %eax 
    movl $0, %ebx 
    int  0x80 

Kann mir jemand einen Tip geben, was ich falsch mache/Missverständnis?

Greets

Antwort

7

al Das Register ist wirklich die untersten 8 Bits des Registers eax. Also, die Anweisung movb (%eax), %al zerstört die niedrigsten 8 Bits von eax, das ist Ihr Zeiger.

Als allgemeinen Ratschlag, lernen Sie, einen Debugger zu verwenden, um durch Ihren Code zu gehen und festzustellen, wo der Computer etwas anders als erwartet tut.

BEARBEITEN: es gibt einige triviale Syntaxfehler im geposteten Code (wie ebc anstelle von ebx), aber ich nehme einige Kopierfehler an, da Sie sagen, andernfalls funktioniert es.

+0

Ich habe keine Stimmen für den Tag, aber das sollte +1 sein. –

+0

Volle Bestätigung. Danke für die Erklärung, natürlich ist das die richtige Antwort. – jena

Verwandte Themen