1 |
Moin, |
2 |
|
3 |
On Sun, 14 May 2006 11:29:35 +0200 (CEST) |
4 |
twist@××××××××.de wrote: |
5 |
|
6 |
> ich bin im moment am diplomarbeit basteln und bin dabei über folgende |
7 |
> prozessor-anomalie gestolpert: |
8 |
|
9 |
Hm, naja, sagen wir vielleicht: Unterschiedliche Behandlung des |
10 |
Flags-Registers. Würde mich aber wundern, wenn das nicht dokumentiert |
11 |
wäre. Aber der Reihe nach an deinem Beispiel-Programm... |
12 |
|
13 |
> wenn man den cmp dx, 4 durch z.b. cmp dx, 8 ersetzt, dann läuft das |
14 |
> programm wie erwartet... |
15 |
|
16 |
Dazu schreibe ich unten noch was. |
17 |
|
18 |
also, hier der kritische Bereich: |
19 |
---snip |
20 |
pushf |
21 |
|
22 |
pushf |
23 |
pop ax |
24 |
|
25 |
popf |
26 |
---snip |
27 |
|
28 |
Erzeugt hier folgenden Code: 9c 9c 68 58 9d |
29 |
|
30 |
Das Problem: die pushf's schieben 32bit auf den Stack, verringern also |
31 |
den Stack-Pointer jeweils um 4 (256 Byte sind für dieses Programm sehr |
32 |
großzügig!). D.h., relativ sind wir bei -8. Dann kommt "pop ax", man |
33 |
beachte: "68" im Code, also Wechsel zu 16bit. D.h., der Stackpointer |
34 |
erhöht sich nur um zwei. Mit dem nächsten popf ziehst du dann die |
35 |
oberen 16bit der Flags in die unteren und umgekehrt und hinterläßt |
36 |
außerdem noch zwei Bytes auf dem Stack. |
37 |
|
38 |
Da du sonst ja auch 32bit-Register benutzt, würde ich schlicht dazu |
39 |
raten, "pop eax" zu nehmen. |
40 |
|
41 |
Dass das dann mit dem cmp zusammenhängt, liegt wohl daran, dass hier |
42 |
das zero-Flag entweder gesetzt sind oder nicht. |
43 |
|
44 |
Tricks mit pushf/popf waren übrigens auch mal ein probates Mittel, |
45 |
herauszufinden, auf welcher i32-Architektur ein Programm läuft. Ich bin |
46 |
mir also recht sicher, dass dokumentiert ist, was hier passiert. |
47 |
|
48 |
Gruß, |
49 |
|
50 |
-hwh |
51 |
|
52 |
-- |
53 |
gentoo-user-de@g.o mailing list |