Ich lese ein Zeichen für ein Zeichen aus einer Eingabezeichenfolge, vertausche die Halbbytes des Zeichens und kopiere in die Ausgabezeichenfolge. Also brauche ich eine Bedingung, um die Schleife zu beenden: Meine Endbedingung ist, dass wenn ich ein NULL-Zeichen erhalte (in rdi gespeichert), das bedeutet, dass ich das Ende der Eingabezeichenfolge erreicht habe und die Schleife verlasse. Folgendes ist meine Implementierung, aber ich erhalte einen Segmentierungsfehler in dieser Zeile "cmpq 0x00, %rdi".
Hinweis: r12 ist der Eingabestring, r11 ist der Index des Strings, rdi ist der erste Eingabeparameter für die Funktion "swap", wenn rdi ein NULL-Zeichen ist, was bedeutet, dass es kein Zeichen mehr im Eingabestring gibt und ich die Schleife verlasse und rufe nicht swap an.
loop:
movq (%r12, %r11, 1) %rdi
cmpq 0x00, %rdi --> this is causing segmentation fault, why?
je exit
call swap
...
jmp loop
exit:
leave
ret
Kann mir jemand sagen, warum cmpq 0x00, %rdi
ein Segmentierungsfehler verursacht wird? Wie überprüfe ich, ob ein Zeichen NULL ist? Ich dachte, 0x00 bedeutet Nullzeichen?
In der AT&T-Syntax bezieht sich eine schmucklose Zahl auf eine Adresse . Sie vergleichen %rdi
mit dem von address geholten Wert 0x0
, dh Sie dereferenzieren einen Nullzeiger.
Wenn Sie eine Sofortnachricht wünschen, verwenden Sie $
: cmpq $0x0, %rdi
.
Allerdings , wenn Sie für eine Null suchen Zeichen (dh Null - Byte), wird der Code nicht sinnvoll , weil Sie Laden und Vergleichen einen 8-Byte qword ( %rdi
ist ein 64-Bit - Register). Wenn Sie ein einzelnes Byte wünschen, verwenden Sie ein 8-Bit-Register. Wenn Sie möchten %rdi
, sind seine niedrigen 8 Bit das Register %dil
, aber vielleicht möchten Sie %al
stattdessen etwas wie . So:
movb (%r12, %r11, 1), %al
cmpb $0x00, %al
je exit
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen