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
Ich habe keine Stimmen für den Tag, aber das sollte +1 sein. –
Volle Bestätigung. Danke für die Erklärung, natürlich ist das die richtige Antwort. – jena