Wie fügt man ein unmittelbares Byte zu einem langen Register mit AT & T-Syntax auf X86 hinzu?
-
29-10-2019 - |
Frage
Soweit ich weiß, sollte es beim Lesen der Intel-Handbücher möglich sein, eine Anweisung wie add $0x7f, %ebx
zu schreiben, und sie sollte als 83 /0 ib
für insgesamt drei Bytes codiert sein.
Wenn ich dies jedoch tue (unabhängig davon, ob ich add
, addb
oder addl
verwende), wird der unmittelbare Wert immer auf einen 32-Bit-Wert "hochgestuft" und als 81 /0 id
codiert und es werden sechs Bytes belegt.Das gleiche Problem besteht mit adc
, sub
usw. Beachten Sie, dass ich die AT & T-Syntax mit GNU as
verwende.
Ich habe über einen Tag nach einer Lösung gesucht und sie nicht gefunden.Kann jemand bitte beraten?
Lösung
Überraschenderweise habe ich kein solches Problem.
Ich habe diesen Assembly-Code angenommen, der von gcc
(DJGPP) erstellt wurde:
generasacodicetagpre.
und erstellt es mit as
und das ist das, was ich in a.out sehe:
generasacodicetagpre.
und das C-Programm war: generasacodicetagpre.
Bist du sicher, dass dein unmittelbarer Operand als 8-Bit-Signe-Integer dargestellt werden kann?Wenn es außerhalb des Sortiments -128 bis +127 ist, muss der Assembler eine längere Kodierung verwenden.