REP bei CX=0

28/09/2009 - 09:11 von Markus Wichmann | Report spam
Hi all,

ich schreibe gerade die C Standard Lib in Assembler nach. Dabei kam ich
auch zu memcpy und memmove.

Ich dachte mir, dass der Prozessor vielleicht nicht nur Bytes durch die
Gegend schieben will, und entrollte die Schleife etwas:

;ecx - Anzahl zu kopierender Bytes
;esi - Quelle
;edi - Ziel

mov edx, ecx
shr ecx, 2
and edx, 3
rep movsd
mov ecx, edx
rep movsb

Nun ist es ja allerdings möglich, dass die Anzahl zu kopierender Bytes
durch 4 teilbar ist, sodass edx=0, d.h. schon zu Beginn von "rep movsb"
ist ecx=0. Dummerweise steht in meiner Doku zum Prozessor (x86) nicht
drin, ob "rep" eine anfangs- oder endgeprüfte Schleife ist, sprich:

Wird bei einer Instruktion mit rep-Pràfix erst ecx dekrementiert und
dann geprüft, wie hoch es ist oder andresrum?

BTW: Ich bràuchte noch eine Aufstellung der Register, die laut
x86-Linux-ABI von der aufgerufenen Funktion gesichert werden müssen.

Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
 

Lesen sie die antworten

#1 Dirk Wolfgang Glomp
28/09/2009 - 10:20 | Warnen spam
Am Mon, 28 Sep 2009 09:11:10 +0200 schrieb Markus Wichmann:

Hi all,



Hallo Markus...

ich schreibe gerade die C Standard Lib in Assembler nach. Dabei kam ich
auch zu memcpy und memmove.

Ich dachte mir, dass der Prozessor vielleicht nicht nur Bytes durch die
Gegend schieben will, und entrollte die Schleife etwas:

;ecx - Anzahl zu kopierender Bytes
;esi - Quelle
;edi - Ziel

mov edx, ecx
shr ecx, 2
and edx, 3
rep movsd
mov ecx, edx
rep movsb

Nun ist es ja allerdings möglich, dass die Anzahl zu kopierender Bytes
durch 4 teilbar ist, sodass edx=0, d.h. schon zu Beginn von "rep movsb"
ist ecx=0. Dummerweise steht in meiner Doku zum Prozessor (x86) nicht
drin, ob "rep" eine anfangs- oder endgeprüfte Schleife ist, sprich:

Wird bei einer Instruktion mit rep-Pràfix erst ecx dekrementiert und
dann geprüft, wie hoch es ist oder andresrum?

BTW: Ich bràuchte noch eine Aufstellung der Register, die laut
x86-Linux-ABI von der aufgerufenen Funktion gesichert werden müssen.



Wenn du ein DOS oder Windows hast, könntest du es schnell mit debug
herausbekommen:

debug
-a
xxxx:0100 mov si,200
xxxx:0103 mov di,300
xxxx:0106 rep movsb
xxxx:0108
-e ds:200
xxxx:0200 00.01 00.02 00.03
g=cs:0100 0108

AX00 BX00 CX00 DX00 BP00 SI00 DI00

-d es:0300
xxxx:0300 00 00 00 00 00 00 ...

Dirk

Ähnliche fragen