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)