Arhitectura x86_64 include instrucțiuni dedicate pentru operații pe blocuri mari de memorie (string primitives), echivalentele hardware directe pentru memcpy și memset din biblioteca C.
Copiere de memorie rapidă (memcpy pe 64 de biți) cu REP MOVSQ
section .text
global copiere_rapida
; void copiere_rapida(void *dest, const void *src, uint64_t qword_count)
; RDI = dest (destinație)
; RSI = src (sursă)
; RDX = număr de quadwords (blocuri de 8 octeți)
copiere_rapida:
cld ; Clear Direction Flag (DF=0 -> adresele cresc automat)
mov rcx, rdx ; RCX este contorul pentru prefixul REP
rep movsq ; Cât timp RCX > 0:
; [RDI] = [RSI]
; RSI += 8, RDI += 8
; RCX -= 1
ret
Inițializarea memoriei cu zero (bzero / memset 0) cu REP STOSQ
section .text
global zeroizeaza_buffer
; void zeroizeaza_buffer(void *dest, uint64_t qwords)
; RDI = adresa bufferului
; RSI = numărul de qwords
zeroizeaza_buffer:
cld
xor rax, rax ; Valoarea de umplere = 0
mov rcx, rsi ; Numărul de iterații în RCX
rep stosq ; Scrie RAX la adresa [RDI] de RCX ori, avansând RDI cu 8 octeți
ret
| Instrucțiune | Dimensiune element | Registru valoare | Registru Sursă → Destinație |
|---|---|---|---|
movsb / movsq |
1 octet / 8 octeți | Memorie directă | [RSI] → [RDI] |
stosb / stosq |
1 octet / 8 octeți | AL / RAX |
RAX → [RDI] |
lodsb / lodsq |
1 octet / 8 octeți | AL / RAX |
[RSI] → RAX |
scasb / scasq |
1 octet / 8 octeți | AL / RAX |
Compară RAX cu [RDI] (căutare) |
Întrebări & Exemple de Cod:
Operații pe Șiruri și Blocuri de Memorie: MOVSB, STOSB și Prefixul REP în x86_64Ai o nelămurire despre utilizarea comenzii
Operații pe Șiruri și Blocuri de Memorie: MOVSB, STOSB și Prefixul REP în x86_64sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.