GNU Assembler - Short jump erzwingen (x86)

OP #7646635
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

(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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren