Articles of assembly

fragmento de código de máquina políglota x86-32 / x86-64 que detecta el modo de 64 bits en tiempo de ejecución?

¿Es posible que los mismos bytes de código de máquina determinen si se están ejecutando en el modo de 32 o 64 bits y luego hacen cosas diferentes? es decir, escribir código de máquina políglota . Normalmente puede detectar en tiempo de comstackción con #ifdef macros. O en C, podría escribir un if() con una […]

Obtener ciclos de CPU usando RDTSC: ¿por qué el valor de RDTSC siempre aumenta?

Quiero obtener los ciclos de la CPU en un punto específico. Yo uso esta función en ese punto: static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile (“.byte 0x0f, 0x31” : “=A” (x)); return x; } El problema es que devuelve siempre un número creciente (en cada ejecución). Es como […]

¿Cómo se leen y escriben las banderas x86 se registra directamente?

Por lo que he leído, parece que hay 9 banderas diferentes. ¿Es posible leer / cambiarlos directamente? Sé que puedo saber, por ejemplo, si el indicador de cero se establece después de hacer una instrucción cmp / jmp, pero estoy preguntando si es posible hacer algo como mov eax, flags o algo. Además, para escribir, […]

Cómo habilitar el soporte de Lenguaje ensamblador en Visual Studio 2013

He estado buscando y todos brindan una respuesta simple Haga clic derecho en el proyecto, Custom Build Rules, marque “Microsoft Macro Assembler”. Pero lamentablemente, en 2013 no es lo mismo. Aquí está la captura de pantalla No sé cómo habilitar el lenguaje ensamblador; habilitando Microsoft Macro Assembler. ¿Alguna guía? He intentado todas estas configuraciones y […]

Shellcode de Linux “¡Hola, mundo!”

Tengo el siguiente código NASM funcional: global _start section .text _start: mov eax, 0x4 mov ebx, 0x1 mov ecx, message mov edx, 0xF int 0x80 mov eax, 0x1 mov ebx, 0x0 int 0x80 section .data message: db “Hello, World!”, 0dh, 0ah que imprime “Hello, World! \ n” en la pantalla. También tengo el siguiente contenedor […]

Traducción de código máquina a LLVM IR (desassembly / reensamblaje de X86_64. X86. ARM en código de bits LLVM)

Me gustaría traducir X86_64, x86, ARM ejecutables en LLVM IR (desassembly). ¿Qué solución sugieres?

Ensamblaje – JG / JNLE / JL / JNGE después de CMP

No entiendo las JG/JNLE/JL/JNGE , que vienen después de CMP. por ejemplo, si tengo: CMP al,dl jg label1 Cuando al=101; dl =200 al=101; dl =200 . ¿En lo que le preguntamos al jg ? ¿Está en al>dl ? o al-dl>0 ? La misma prolbem en el siguiente código: test al,dl jg label1 No entiendo lo […]

¿Tiene algún sentido utilizar la instrucción LFENCE en procesadores x86 / x86_64?

A menudo en Internet encuentro que LFENCE no tiene sentido en los procesadores x86, es decir, no hace nada, por lo tanto, en vez de MFENCE , podemos usar absolutamente absolutamente SFENCE , porque MFENCE = SFENCE + LFENCE = SFENCE + NOP = SFENCE . Pero si LFENCE no tiene sentido, entonces ¿por qué […]

¿Por qué System V / AMD64 ABI exige una alineación de astackmiento de 16 bytes?

He leído en diferentes lugares que se hace por “razones de rendimiento”, pero todavía me pregunto cuáles son los casos particulares en los que el rendimiento mejora con esta alineación de 16 bytes. O, en cualquier caso, ¿cuáles fueron las razones por las cuales se eligió esto? editar : estoy pensando que escribí la pregunta […]

¿Por qué las llamadas al sistema x86-64 Linux modifican RCX y qué significa el valor?

Estoy tratando de asignar algo de memoria en Linux con sys_brk syscall. Esto es lo que intenté: BYTES_TO_ALLOCATE equ 0x08 section .text global _start _start: mov rax, 12 mov rdi, BYTES_TO_ALLOCATE syscall mov rax, 60 syscall Lo que pasa es que, según la convención de llamadas de Linux, esperaba que el valor de retorno estuviera […]