GNU Assembler - Short jump erzwingen (x86)

OP #7646635

Hallo!

Gibt es eine Möglichkeit in GAS mit dem man einen kurzen Sprung (relativer 8 Bit Sprung) mit der AT&T Syntax erzwingen kann? GAS macht daraus immer einen relativen 16 Bit Sprungbefehl.

Als Beispiel (8 Bit):

Quelle:

1
    nop
2
    nop
3
    jmp 1f
4
    nop
5
    nop
6
1:
7
    nop
8
    nop

Ausgabe:

1
   0:   90                      nop
2
   1:   90                      nop
3
   2:   eb 02                   jmp    0x6
4
   4:   90                      nop
5
   5:   90                      nop
6
   6:   90                      nop
7
   7:   90                      nop

Mag vielleicht nicht ein optimales Beispiel sein, aber die vorige Ausgabe 0xeb 0x02 macht GAS leider nicht, sondern 0xe9 0x02 0x00 an der Adresse 0x2.

#7646874

Bei mir erzeugt er einen "jmp rel8":

1
$ echo "nop;nop;jmp 1f;nop;nop;1:nop;" | as -V -o t.o && objdump -d t.o
2
GNU assembler version 2.18.0 (i486-linux-gnu) using BFD version (GNU Binutils for Debian) 2.18.0.20080103
3

4
t.o:     file format elf32-i386
5

6
Disassembly of section .text:
7

8
00000000 <.text>:
9
   0:  90                     nop    
10
   1:  90                     nop    
11
   2:  eb 02                  jmp    0x6
12
   4:  90                     nop    
13
   5:  90                     nop    
14
   6:  90                     nop
#7646883

Foobar schrieb:

Bei mir erzeugt er einen "jmp rel8": $ echo "nop;nop;jmp 1f;nop;nop;1:nop;" | as -V -o t.o && objdump -d t.o GNU assembler version 2.18.0 (i486-linux-gnu) using BFD version (GNU

Bei mir, mit x86_64 host, das Selbe:

1
GNU assembler version 2.40 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.40
2

3
t.o:     file format elf64-x86-64
4

5

6
Disassembly of section .text:
7

8
0000000000000000 <.text>:
9
   0:  90                     nop
10
   1:  90                     nop
11
   2:  eb 02                  jmp    0x6
12
   4:  90                     nop
13
   5:  90                     nop
14
   6:  90                     nop

@foobar: ot, aber wie kommt man 2024 noch zu einem x86/i486 host? Ist das ein embedded system oder schon ein paar Jahre alt?

#7646910

ot, aber wie kommt man 2024 noch zu einem x86/i486 host? Ist das ein embedded system oder schon ein paar Jahre alt?

Das ist ein EeePC 900 - mein Betterminal (für mikrocontroller.net, News, Youtube, Mediathek, Radio, etc reicht der aus). Die anderen Rechner sind allerdings auch nicht viel frischer.

#7646964

(prx) A. K. schrieb:

Foobar schrieb:

Betterminal

Bet-Terminal? Kannte ich noch nicht. :)

Fand ich auch merkwürdig. Die Befehlzeile mit echo und objdump ist ebenfalls klasse.

Eine Antwort auf die Ausgangsfrage ist nicht so einfach. Ich habe (so auf die schnelle) drei Links dazu gefunden: https://www.scs.stanford.edu/05au-cs240c/lab/i386/s16_02.htm https://stackoverflow.com/questions/14889643/how-encode-a-relative-short-jmp-in-x86 https://compas.cs.stonybrook.edu/~nhonarmand/courses/sp17/cse506/ref/assembly.html

sprich: hängt sehr vom Zusammenhang ab, den wir hier leider nicht sehen :(

#7647021

Wäre das nicht ein i686?

Das Kernel ist i686:

1
$ uname -a
2
Linux pinsch 2.6.27.4 #45 SMP Sun Sep 13 15:22:15 CEST 2009 i686 GNU/Linux

Die Binutils sind aber von Debian wohl mit "i486-linux-gnu" erzeugt - keine Ahnung warum (gab bei GNU evtl noch kein i686).

[Edit] Evtl eher, damit das auch mit alten CPUs läuft (das Kernel ist nicht von Debian).

OP #7647053

Vielen Dank für die Antworten!

War leider meinerseits ein Layer 8 Problem. Hab bei meinen vorigen Test immer die Spungrichtung vergessen anzugeben. Also statt "jmp 1f" habe ich vorher immer "jmp 1" geschrieben. Da macht GAS ohne dem 16 Bit Modus (.code16) sogar einen relativen 32 Bit Sprungbefehl. Außerdem hat GAS einen Relokation Eintrag in der Objektdatei erstellt.

Sorry, dass ich eure Zeit verschwendet habe. :( Hätte ich auch selber drauf kommen müssen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 2 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.