Necesito ayuda para entender el endianness dentro de los registros de la CPU de los procesadores x86. Escribí este pequeño programa conjunto:Endianidad dentro de los registros de la CPU
section .data
section .bss
section .text
global _start
_start:
nop
mov eax, 0x78FF5ABC
mov ebx,'WXYZ'
nop ; GDB breakpoint here.
mov eax, 1
mov ebx, 0
int 0x80
me encontré con este programa en GDB con un punto de interrupción en la línea número 10 (comentado en la fuente más arriba). En este punto de interrupción, info registers
muestra el valor de eax=0x78ff5abc
y ebx=0x5a595857
.
Dado que los códigos ASCII para W, X, Y, Z son 57, 58, 59, 5A respectivamente; e intel es little endian, 0x5a595857 parece ser el orden correcto de bytes (el byte menos significativo primero). ¿Por qué entonces no es la salida para eax register 0xbc5aff78
(byte menos significativo del número 0x78ff5abc primero) en lugar de 0x78ff5abc
?
Gracias por la respuesta. Aparentemente, 'WXYZ' está almacenado en orden inverso en el registro ebx. De acuerdo con el depurador, el registro BL contiene 87 (valor decimal de 0x57); seguramente, hay una noción de orden de bytes aquí? ¿Por qué no se almacenó 'W' en los 8 bits más altos de ebx? – wrxyz
En realidad, los registros * son * parcialmente byte direccionables. Puede acceder a los dos bytes inferiores de EAX con AL y AH. –
Eso es byte accesible, no byte "direccionable". Puede acceder a ese byte inferior pero aún no puede responder a la pregunta: "es ese byte inferior ubicado en una dirección de memoria más alta o más baja que el byte más alto". (Bueno, puede argumentar que el código de operación, si se interpreta como un número entero, es más grande o más pequeño que el otro, pero eso es muy arbitrario) – slebetman