Gentoo Archives: gentoo-user-de

From: twist@××××××××.de
To: gentoo-user-de@l.g.o
Subject: Re: [gentoo-user-de] crash bestätigung
Date: Sun, 14 May 2006 18:16:31
Message-Id: 38091.84.252.65.139.1147630021.squirrel@evilhome.de
In Reply to: Re: [gentoo-user-de] crash bestätigung by Hans-Werner Hilse
1 hi,
2
3
4 > also, hier der kritische Bereich:
5 > ---snip
6 > pushf
7 >
8 > pushf
9 > pop ax
10 >
11 > popf
12 > ---snip
13
14 sieht bei mir so aus (athlon xp 2000):
15
16 twist@xen ~/tmp $ objdump -S -Mintel main
17
18 main: file format elf32-i386
19
20 Disassembly of section .text:
21
22 080480a0 <.text>:
23 80480a0: bc c0 91 04 08 mov esp,0x80491c0
24 80480a5: 66 31 d2 xor dx,dx
25 80480a8: 66 81 fa 00 00 cmp dx,0x0
26 80480ad: 9c pushf
27 80480ae: 9c pushf
28 80480af: 66 58 pop ax
29 80480b1: 9d popf
30 80480b2: b8 01 00 00 00 mov eax,0x1
31 80480b7: bb 00 00 00 00 mov ebx,0x0
32 80480bc: cd 80 int 0x80
33
34
35 >
36 > Erzeugt hier folgenden Code: 9c 9c 68 58 9d
37 >
38 > Das Problem: die pushf's schieben 32bit auf den Stack, verringern also
39 > den Stack-Pointer jeweils um 4 (256 Byte sind für dieses Programm sehr
40 > großzügig!). D.h., relativ sind wir bei -8. Dann kommt "pop ax", man
41 > beachte: "68" im Code, also Wechsel zu 16bit. D.h., der Stackpointer
42 > erhöht sich nur um zwei. Mit dem nächsten popf ziehst du dann die
43 > oberen 16bit der Flags in die unteren und umgekehrt und hinterläßt
44 > außerdem noch zwei Bytes auf dem Stack.
45
46 darüber hab ich auch schon lange gegrübelt. meine docu sagt aber:
47
48 PUSHF/PUSHFD
49
50 Pushes the flags register onto the stack. PUSHF always pushes the 16-bit
51 flags register. On the 80386/486, use PUSHFD to push the 32-bit flags
52 register.
53
54 und die dinger werden mit 10011100 codiert, also 0x9c. anscheinend ist das
55 abhängig davon, ob die kiste im protected mode läuft. das würde auch
56 abwärtskompatibilität erklären.
57
58 >
59 > Da du sonst ja auch 32bit-Register benutzt, würde ich schlicht dazu
60 > raten, "pop eax" zu nehmen.
61 >
62 > Dass das dann mit dem cmp zusammenhängt, liegt wohl daran, dass hier
63 > das zero-Flag entweder gesetzt sind oder nicht.
64
65 das ding wird intern doch so ausgewertet:
66
67 cmp op1, op2
68
69 tmp = op1 - op2
70
71 die flags werden tmp entsprechend gesetzt.
72 --> damit ist das zero-flag immer gleich (bei cmp 0, 4 und cmp 0, 8).
73
74 >
75 > Tricks mit pushf/popf waren übrigens auch mal ein probates Mittel,
76 > herauszufinden, auf welcher i32-Architektur ein Programm läuft. Ich bin
77 > mir also recht sicher, dass dokumentiert ist, was hier passiert.
78
79 ja, stimmt. aber dennoch darf mir ein fehlerhaftes programm nicht den
80 x-server unterm a..... wegballern.
81
82 twist
83
84 --
85 gentoo-user-de@g.o mailing list

Replies

Subject Author
Re: [gentoo-user-de] crash bestätigung Hans-Werner Hilse <hilse@×××.de>