02e - Explicaciones de preguntas surgidas en clase
Clase 2023-02-03
El misterio de MOVABS
Mi programa:
mov rax, 0789ADEADBEEDh
mov rbx, rax
push rbx
xor ebx, ebx
mov rax, rsp
mov rax, [rax]
El disassemble de mi ejecutable:
401000: 48 b8 ed be ad de 9a movabs rax,0x789adeadbeed
401007: 78 00 00
40100a: 48 89 c3 mov rbx,rax
40100d: 53 push rbx
40100e: 31 db xor ebx,ebx
401010: 48 89 e0 mov rax,rsp
401013: 48 8b 00 mov rax,QWORD PTR [rax]
¿Por qué el ensamblador cambia el primer MOV a MOVABS?
Parece ser que oficialmente la instrucción que se utiliza en el microprocesador para mover un valor inmediato a registro es MOVABS. Lo extraño es que se escribes la instruccion MOVABS en el programa de assembly, el ensamblador lo cuenta como un error!
¿Por qué XOR EAX,EAX resetea a RAX completo?
No encontré contestación a esa. Sin embargo traté
xor AX,AX y sí funciona y xor AL,AL también. ¿Habremos encontrado un error en la implementación de esa instruccion en micro?
¿Cuándo enciende el overflow flag?
El OVERFLOW flag prende cuando una operación aritmética hace que el sign bit (el bit #63) cambie de 0 a 1. Por ejemplo
mov rax, 07FFFFFFFFFFFFEEDh
mov rbx, 01000000000000000h
add rax, rbx. ; luego de esta se enciende el OVERFLOW pues el sign
; bit cambia de 0 a 1
add rax, rbx ; luego de esta el OVERFLOW se apaga pues no hubo cambio
; en el sign bit (se quedó en 1)