Articles of x86 64

Bomba lab phase_4

Dump of assembler code for function func4 : mov %rbx,-0x18(%rsp) : mov %rbp, -0x10(%rsp) : mov %r12,-0x8(%rsp) : sub $0x18,%rsp : mov %edi,%ebx : mov %esi,%ebp : test %edi, %edi : jg 0x400fb2 : mov $0x0,%ebp : jmp 0x400fd2 cmp $0x1, %edi : je 0x400fd2 : lea -0x1(%rbx),%edi : callq 0x400f90 : mov %eax,%r12d : […]

Perché System V / AMD64 ABI richiede un allineamento dello stack di 16 byte?

Ho letto in diversi punti che è stato fatto per “motivi di prestazioni”, ma mi chiedo ancora quali siano i casi particolari in cui le prestazioni vengono migliorate da questo allineamento a 16 byte. O, in ogni caso, quali sono stati i motivi per cui questo è stato scelto. edit : Sto pensando di aver […]

Stampa di un intero come una stringa con syntax AT & T, con chiamate di sistema Linux anziché printf

Ho scritto un programma Assembly per visualizzare il fattoriale di un numero dopo la syntax AT & t. Ma non funziona. C’è il mio codice .text .globl _start _start: movq $5,%rcx movq $5,%rax Repeat: #function to calculate factorial decq %rcx cmp $0,%rcx je print imul %rcx,%rax cmp $1,%rcx jne Repeat # Now result of factorial […]

Successive sys_write syscalls non funziona come previsto, bug NASM su OS X?

Sto cercando di imparare l’assemblaggio MacOS usando NASM e non riesco a far funzionare un programma banale. Sto provando una variazione di “Hello, World” in cui le due parole sono chiamate indipendentemente da una macro. Il mio codice sorgente assomiglia a questo: %macro printString 2 mov rax, 0x2000004 ; write mov rdi, 1 ; stdout […]

Esiste un numero intero a 128 bit in gcc?

Voglio un intero a 128 bit perché voglio memorizzare i risultati della moltiplicazione di due numeri a 64 bit. C’è qualcosa di simile in gcc 4.4 e sopra?

Perché è (o non è?) SFENCE + LFENCE equivalente a MFENCE?

Come sappiamo da una risposta precedente a Ha senso istruire LFENCE nei processori x86 / x86_64? che non possiamo usare SFENCE invece di MFENCE per coerenza sequenziale. Una risposta suggerisce che MFENCE = SFENCE + LFENCE , cioè che LFENCE fa qualcosa senza cui non possiamo fornire la coerenza sequenziale. LFENCE rende imansible il riordino: […]

Perché l’accesso non allineato alla memoria di mmap a volte segfault su AMD64?

Ho questo pezzo di codice che segfaults quando si esegue su Ubuntu 14.04 su una CPU compatibile AMD64: #include #include #include int main() { uint32_t sum = 0; uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); uint16_t *p = (buffer + 1); int i; for (i=0;i<14;++i) { //printf("%d\n", i); sum += p[i]; } return […]

Indirizzo forma canonica e aritmetica del puntatore

Su architetture conformi a AMD64, gli indirizzi devono essere in forma canonica prima di essere sottoposti a dereferenziazione. Dal manuale Intel, sezione 3.3.7.1 : Nella modalità a 64 bit, un indirizzo è considerato in forma canonica se i bit di indirizzo 63 attraverso il bit implementato più significativo dalla microarchitettura sono impostati su tutti o […]

Perché questa funzione spinge RAX in pila come prima operazione?

Nell’assemblaggio della sorgente C ++ qui sotto. Perché RAX è spinto in pila? RAX, come ho capito dall’ABI, potrebbe contenere qualsiasi cosa, dalla funzione di chiamata. Ma lo salviamo qui e poi spostiamo lo stack indietro di 8 byte. Quindi il RAX in pila è, penso che sia rilevante solo per l’operazione std::__throw_bad_function_call() …? Il […]

x86_64 ASM – byte massimi per un’istruzione?

Qual è il numero massimo di byte che un’istruzione completa richiederebbe nel codice asm x64? Qualcosa come un salto di indirizzo potrebbe occupare fino a 9 byte suppongo: FF 00 00 00 00 11 12 3F 1F ma non so se questo è il numero massimo di byte che un’istruzione x64 può usare