Forum: PC-Programmierung GNU Assembler - Short jump erzwingen (x86)


von Johannes K. (krotti42)


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.

von Foobar (asdfasd)


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

von Wf88 (wf88)


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?

von Foobar (asdfasd)


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.

von (prx) A. K. (prx)


Lesenswert?

Foobar schrieb:
> Betterminal

Bet-Terminal? Kannte ich noch nicht. :)

: Bearbeitet durch User
von Rbx (rcx)


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 
:(

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Foobar schrieb:
> Das ist ein EeePC 900

Wäre das nicht ein i686? D.h. es sollte, zumindest theoretisch, ein 
aktueller 32bit-Kernel laufen?

: Bearbeitet durch User
von Foobar (asdfasd)


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).

: Bearbeitet durch User
von Foobar (asdfasd)


Lesenswert?

>> Bet-Terminal? Kannte ich noch nicht. :)
>
> Fand ich auch merkwürdig.

Ihr dürftet gemerkt haben, dass ich nicht jedem neuen Kram 
hinterherrenne ;-)

Betterminal (alt) = Bettterminal (neu) = Bett-Terminal (aktuell)

von Rbx (rcx)


Lesenswert?

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

2009 gab es noch 32 Bit Windows, und: Cygwin Full Install ;)

von Johannes K. (krotti42)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.