2016-04-27 13 views
0

Wenn die alten Segmente mit Registern ist veraltet, warum immer noch in dem aktuellen Tag nicht vorhanden ist, wenn ich wie diese:Warum rep movb verwendet Datensegmente?

rep movsb %ds:(%rsi),%es:(%rdi) 

Was ist dieser „ds“ und „es“ tun? Es wäre nicht das Gleiche ohne die Segmente?

+0

Gehen Sie voran und lassen Sie die Segmente weg. Das Segment für 'rsi' wird standardmäßig mit' ds' und das Segment mit 'rdi' wird standardmäßig mit' es' bezeichnet. Sie müssen es also nicht sagen. –

+2

@RaymondChen nicht zu erwähnen, dass im 64-Bit-Code, der dies eindeutig ist, sie sowieso ignoriert werden. Das sieht aus wie die Ausgabe eines albernen Disassemblers, der gerne Standardsegmente und implizite Operanden anzeigt. – Jester

+0

objdump:/und gdb zeigt auch die Segmente ... – int3

Antwort

5

Sie müssen sie nicht angeben, aber sie sind immer noch "da". Sie werden jedoch nicht als "Segment-Register" verwendet; Sie werden als Selektoren verwendet.

Die Segmentregister werden jetzt als Selektoren aus der Tabelle Globaler Deskriptor (oder möglicherweise lokaler Deskriptor) verwendet, die zum Definieren von Speicherbereichen und ihrer Lese-/Schreibberechtigungen verwendet wird.

+0

ist wie "fragen" GDT, ob die Adresse, die rdi oder rsi hat, zum Schreiben oder was auch immer die Anweisung zu tun hat? – int3

+0

Mmm .. Es fragt nicht, es erzählt. EDI verwendet den ES-Selektor und ESI verwendet den DS-Selektor. –