Articles of x86 64

Carica da un indirizzo a 64 bit in un altro registro rispetto a rax

Su x64, il caricamento da un indirizzo assoluto a 64 bit (cioè il dereferenziamento di un’immediata a 64 bit) può essere eseguito da movabs addr64, %rax Tuttavia, quando il registro di destinazione è diverso da rax l’assemblatore fornisce un messaggio di errore che rax la operand size mismatch for movabs . Cosa mi manca?

Impostare tutti i bit nel registro della CPU su 1 in modo efficiente

Per cancellare tutti i bit si vede spesso un esclusivo o come in XOR eax, eax . C’è anche un trucco per il contrario? Tutto quello che posso pensare è di invertire gli zeri con un’istruzione extra.

Chiamando printf in x86_64 usando l’assemblatore GNU

Ho scritto un programma usando la syntax AT & T per l’uso con l’assemblatore GNU: .data format: .ascii “%d\n” .text .global main main: mov $format, %rbx mov (%rbx), %rdi mov $1, %rsi call printf ret Uso GCC per assemblare e colbind con: gcc -o main main.s Lo eseguo con questo comando: ./principale Quando eseguo il […]

spingere su 64 bit intel osx

Voglio spingere l’indirizzo a 64 bit nello stack come di seguito, __asm(“pushq $0x1122334455667788”); Ma ottengo errore di compilazione e posso solo spingere in modo seguente, __asm(“pushq $0x11223344”); Qualcuno può aiutarmi a capire il mio errore? Sono nuovo all’assemblaggio, quindi per favore scusami se la mia domanda sembra stupida.

Perché la divisione intera di -1 (quella negativa) risulta in FPE?

Ho l’incarico di espiare alcuni comportamenti apparentemente strani del codice C (in esecuzione su x86). Posso completare facilmente tutto il resto ma questo mi ha davvero confuso. -2147483648 codice 1 output -2147483648 int a = 0x80000000; int b = a / -1; printf(“%d\n”, b); Lo snippet di codice 2 non restituisce nulla e restituisce Floating […]

Prestazioni inaspettatamente povere e stranamente bimodali per il ciclo di acquisto su Intel Skylake

Vedo prestazioni inaspettatamente scadenti per un semplice ciclo del negozio che ha due negozi: uno con un passo in avanti di 16 byte e uno che è sempre nella stessa posizione 1 , come questo: volatile uint32_t value; void weirdo_cpp(size_t iters, uint32_t* output) { uint32_t x = value; uint32_t *rdx = output; volatile uint32_t *rsi […]

Ottimizzazione delle prestazioni dell’assembly x86-64 – Allineamento e previsione delle diramazioni

Attualmente sto codificando versioni altamente ottimizzate di alcune funzioni di stringhe di libreria standard C99, come strlen() , memset() , ecc., Usando l’assembly x86-64 con le istruzioni SSE-2. Finora sono riuscito a ottenere risultati eccellenti in termini di prestazioni, ma a volte ottengo comportamenti strani quando cerco di ottimizzare di più. Ad esempio, l’aggiunta o […]

Cosa significa “rep; nop; “significa nell’assemblaggio x86? È uguale all’istruzione “pausa”?

Cosa fa rep; nop rep; nop significa? È uguale all’istruzione di pause ? È lo stesso di rep nop (senza il punto e virgola)? Qual è la differenza con l’istruzione nop semplice? Si comporta diversamente sui processori AMD e Intel? (bonus) Dov’è la documentazione ufficiale per queste istruzioni? Motivazione per questa domanda Dopo qualche discussione […]

System.BadImageFormatException: imansible caricare file o assembly (da installutil.exe)

Sto cercando di installare un servizio di Windows utilizzando InstallUtil.exe e sto ricevendo il messaggio di errore System.BadImageFormatException: imansible caricare il file o l’assembly ‘ {xxx.exe} ‘ o una delle sue dipendenze. Si è tentato di caricare un programma con un formato errato. Cosa dà? EDIT: (non per OP) Il messaggio completo estratto da dup […]

Perché i sistemi x86-64 hanno solo uno spazio di indirizzi virtuali a 48 bit?

In un libro ho letto quanto segue: I processori a 32 bit hanno 2 ^ 32 indirizzi possibili, mentre gli attuali processori a 64 bit hanno uno spazio di indirizzamento a 48 bit La mia aspettativa era che se si tratta di un processore a 64 bit, lo spazio degli indirizzi dovrebbe essere anche 2 […]