2017-06-11 1 views
12

En d'autres termes, est-ce que je pourrais avoir besoin de cette instruction?Pourquoi l'instruction REP LODS AL existe-t-elle?

d'Intel Manuel d'instructions, c'est ce que l'instruction faire:

Charge (E) octets CX de DS: [(E) SI] à AL.

Prenons l'exemple suivant dans MSNA:

section .data 
    src: db 0, 1, 2, 3 

section .code 
    mov esi, src 
    mov ecx, 4 
    rep lodsb ; mov al, byte[esi + ecx -1]; ecx++ 

Alors que l'instruction est en cours d'exécution rep lodsb, je ne dispose d'aucun contrôle sur la valeur chargée dans al. Tout ce que je peux faire est d'attendre, jusqu'à ce que l'instruction se termine pour obtenir la dernière valeur de al, ce qui, bien sûr, je peux obtenir directement, sans la boucle.

La même question vaut pour le reste de la famille: REP LODS AX, REP LODS EAX et REP LODS RAX.

+1

Mon ancien Microsoft MASM « Guide du programmeur » dit que 'LODS' est le seul dans cette famille d'instructions qui ne prend pas un préfixe de répétition. –

+8

Il existe parce qu'il était trop cher pour le faire exister. Vous ne pouvez pas vous permettre de faire des petites choses quand vous devez construire un processeur 16 bits à partir de seulement 20000 transistors. –

+0

@WeatherVane, je pense que ce n'est pas à MASM de décider pour nous, LOL –

Répondre

9

La lecture depuis la mémoire peut avoir des effets secondaires dans certains cas. Par exemple, cela peut se produire si la mémoire est mappée sur des registres matériels. L'effet secondaire exact dépend du matériel. Donc, rep lodsb peut être utile dans de très rares cas où vous avez besoin de l'effet secondaire, mais vous n'avez pas besoin des valeurs qui ont été lues.

7

... Y at-il un cas que je pourrais besoin cette instruction?

Vous ne pourriez pas besoin il en soi, mais le codage dans le monde 16 bits, où la conservation de l'espace est important, j'ai plus d'une fois préféré

rep lodsb 

plus long (en octets)

add si, cx 
mov al, [si-1] 

Bien sûr, tout dépend de la situation.

Notez que vos instructions de remplacement pour aller chercher sans la boucle est en fait mov al, byte[esi + ecx -1]

+0

Il semble que c'est très difficile d'en avoir besoin. Merci pour la correction aussi. –

+0

Yay, un autre tour dans la ceinture pour le golf de code! –