Lenguaje informático big-endian

La palabra Endian proviene de "Los viajes de Gulliver" escrita por Jonathan Swift. Este libro divide a las personas en dos categorías según cómo rompen los huevos. Los que rompen los huevos por el extremo redondo se clasifican como BigEndian, y los que rompen los huevos por el extremo puntiagudo se clasifican como LittleEndian. El origen de la guerra civil en Lilliput es si los huevos se rompen en orden big-endian o little-endian. En la industria informática, BigEndian y LittleEndian casi inician una guerra. En la industria informática, Endian representa el orden en el que se almacenan los datos en la memoria. El siguiente ejemplo ilustra la diferencia entre los modos grande y pequeño en las computadoras.

Si un entero de 32 bits 0x12345678 se almacena en una variable entera (int), la variable entera se almacena en la memoria en modo terminal grande o pequeño como se muestra en la siguiente tabla. Para simplificar, este libro utiliza OP0 para representar el byte más significativo de datos de 32 bits y OP3 para representar el byte menos significativo de datos de 32 bits. ;Desplazamiento de dirección; modo Big-endian; modo Little-endian 0x 0012(OP0)78(OP3)0x 1234(op 1)56(OP2)0x 0256(OP2)34(op 1)0x 0378(OP3)10. Esta variable entera corta se almacena en la memoria como se muestra en la siguiente tabla. ;Desplazamiento de dirección; Modo big-endian Como se puede ver en la tabla anterior, la principal diferencia entre el modo little-endian 0x 0012(OP0)34(op 1)0x 00134(op 1)12(OP0) y big-endian; El modo es el de almacenar datos por palabra en orden de sección. El almacenamiento de datos a gran escala está en consonancia con el pensamiento humano normal, mientras que el almacenamiento de datos a pequeña escala favorece el procesamiento informático. Aún no hay ninguna conclusión sobre cuál es mejor, si un terminal grande o un terminal pequeño, para el almacenamiento de datos.

Algunos sistemas de procesador, como el Pentium de Intel, utilizan el modo de terminal pequeño para el almacenamiento de datos. Algunos sistemas de procesador utilizan el modo big-endian para el almacenamiento de datos, como los procesadores IBM Semiconductor y Freescale PowerPC. No sólo en el procesador, sino también en el diseño de algunos periféricos, también existe la posibilidad de utilizar terminales grandes o pequeños para el almacenamiento de datos.

Por lo tanto, en un sistema de procesador, pueden existir dos modos, big-endian y little-endian, al mismo tiempo. Este fenómeno trae muchos problemas al diseño de software y hardware del sistema, lo que requiere que los ingenieros de diseño del sistema tengan un conocimiento profundo de las diferencias entre los modos big-endian y little-endian. La diferencia entre el modo big-endian y el modo little-endian se refleja en los registros, el conjunto de instrucciones y el bus del sistema de un procesador. Desde una perspectiva de software, los procesadores con diferentes modos de terminal deben considerar las diferencias en los modos de terminal al transmitir datos. Por ejemplo, al transmitir datos de red, se debe considerar la conversión de modo final. Los programadores con experiencia en programación de interfaces Socket deben haber utilizado las siguientes funciones para la conversión del orden de bytes entre terminales grandes y pequeños.

# define tohs(n)//conversión del tipo de datos de 16 bits desde el orden de bytes de la red al orden de bytes del host

# DefineHtons (n)//tipo de datos de 16 bits desde la conversión del orden de bytes del host al orden de bytes de la red

# Define NtoHL(n)//Conversión del tipo de datos de 32 bits del orden de bytes de la red al orden de bytes del host

# DefineHtonL(n) // Conversión del tipo de datos de 32 bits del orden de bytes del host al orden de bytes de la red

Entre ellos, el orden de bytes de la red utilizado por Internet se aborda en modo big-endian y el host La endianidad varía según a diferentes procesadores, por ejemplo, los procesadores PowerPC usan el modo big-endian y los procesadores Pentuim usan el modo small-endian.

No es necesario convertir el orden de bytes de los procesadores en modo big-endian al orden de bytes de la red. En este momento, ntohs(n)=n, nto HL = n; sin embargo, el orden de bytes de los procesadores en modo little-endian debe convertirse a bytes de red. En este momento, ntohs(n) = __swab16(n), ntohl =__swab32(n). Las funciones __swab16 y __swab32 se definen de la siguiente manera.

#define ___swab16(x)

{

_ _ u 16 _ _ x =(x);

((__u16)(

(((_ _ u 16)(_ _ x)&(_ _ u 16)0x 00f fu)& lt;& lt8) |

(((_ _ u 16) ( _ _ x)&(__u16)0xff00U)>& gt8)));

}

#define ___swab32(x)

{< /p >

_ _ u32 _ _ x =(x);

((__u32)(

(((_ _ u32)(_ _ x)& amp ;( _ _ u32)0x 000000 fful)& lt;& lt24) |

(((_ _ u32)(_ _ x)& amp;(_ _ u32)0x 0000 ff 00 ul) & lt ;& lt8) |

(((_ _ u32)(_ _ x)& amp;(__u32)0x00ff0000UL)>& gt8) |

(((_ _u32) (_ _ Conversión del orden de las secciones para optimizar funciones como __swab16 y __swap32. Además, la instrucción rlwimi en el procesador PowerPC también se puede utilizar para implementar funciones como __swab16 y __swap32. En Linux PowerPC, se definen una serie de funciones relacionadas con la conversión del orden de bytes, consulte para más detalles. /include/ASM-PowerPC/orden de bytes h.

Los programadores también deben considerar el problema del modo final al procesar archivos normales. 32. Los resultados de la lectura y escritura de archivos de 16 bits son diferentes entre los procesadores en modo big-endian y los procesadores en modo little-endian. Los lectores no pueden comprender realmente la diferencia entre los modos grandes y pequeños únicamente desde la perspectiva del software. De hecho, para comprender verdaderamente la diferencia entre modos grandes y pequeños, debemos tener una comprensión profunda de las diferencias entre modos grandes y pequeños desde la perspectiva de los sistemas, conjuntos de instrucciones, registros y buses de datos. Además de las diferencias en la programación de diferentes modos de terminal en la Sección 4.2.1, los procesadores también difieren en el diseño de hardware debido a problemas con el modo de terminal. Desde una perspectiva del sistema, los problemas del modo final tienen impactos diferentes en el diseño del software y del hardware. Cuando existen modos endian grandes y pequeños en el sistema del procesador, se debe realizar un procesamiento especial en los accesos en estos diferentes modos endian.

Los procesadores PowerPC dominan el mercado de redes. Se puede decir que la mayoría de los equipos de comunicación utilizan procesadores PowerPC para el procesamiento de protocolos y otro procesamiento de información de control. Esta también puede ser la razón por la que la mayoría de los protocolos en la red utilizan direccionamiento de cabeza grande. Por lo tanto, en el diseño de software de protocolos de red, los procesadores que utilizan el modo de terminal pequeño necesitan manejar los cambios en el modo de terminal en el software. Pentium domina el mercado de las computadoras personales, por lo que la mayoría de los periféricos utilizados por las computadoras personales adoptan el modo de terminal pequeño, incluido el bus PCI, Flash y otros dispositivos utilizados por los equipos de red. Esto también requiere que los ingenieros de hardware presten atención a la conversión de los modos de terminal en hardware. diseño.

Los periféricos little-endian en este libro se refieren a los registros de dichos periféricos que se almacenan en formato little-endian, como el espacio de configuración de dispositivos PCI, registros en NOR FLASH, etc.

Para algunos dispositivos, como las partículas DDR, no hay registros de almacenamiento en modo terminal pequeño, por lo que lógicamente no hay necesidad de convertir el modo terminal. El diseño solo requiere la interconexión uno a uno del bus de datos y no requiere conversión del bus de datos.

Desde un punto de vista de aplicación práctica, los procesadores que usan el modo de terminal pequeño necesitan manejar la conversión del modo de terminal en el software, porque los procesadores que usan el modo de terminal pequeño no necesitan realizar ninguna conversión.

El diseño de hardware de los procesadores en modo big-endian requiere una conversión del modo de extremo de procesamiento.

Los procesadores en modo big endian necesitan lidiar con registros, conjuntos de instrucciones, buses de datos y conexiones entre los buses de datos y los periféricos little endian. , para resolver el problema de conversión del modo endian al conectar periféricos little-endian.

Los procesadores basados ​​en modos endian grande y pequeño son diferentes en la definición del orden de bits de los registros y buses de datos.

Los procesadores de 32 bits en modo big-endian, como el MPC8541 basado en el núcleo E500, definen el bit más significativo de su registro como 0 y el bit menos significativo como 31; procesamiento en modo little-endian El dispositivo define el bit más alto de su registro como 31 y la dirección de orden inferior como 0.

Correspondiente a esta dirección, el bit más alto del bus de datos de un procesador de 32 bits en modo big endian es 0 y el bit más alto es 31; El procesador en modo little endian es 31 y el bit más bajo es 0. Como se muestra en la Figura 4.5. OP0 op 1 OP2 op 3 op 1 OP2 op 3 31 0 31 0; Figura 4.5 Definición de registro de procesadores en modo big y small endian Definición del orden de bits de los registros del procesador en modo big endian; La secuencia de bits del bus externo del procesador en modo endian también sigue la misma regla. La secuencia de bits del bus externo del procesador en modo big endian difiere según el bus de datos de 32, 16 y 8 bits utilizado.

En modo big-endian, el msb del bus de datos de 32 bits es el bit 0, el MSB son los campos 0 al 7 del bus de datos, el lsb es el bit 31 y el bit 31; LSB es el campo número 24 de 31. En el modo little endian, el msb del bus de 32 bits es de 31 bits, el MSB son los 31 ~ 24 bits del bus de datos, el lsb es el bit 0 y el LSB es el campo 7 ~ 0.

El msb del bus de datos de 16 bits en modo big-endian es el bit 0, y el MSB es el campo 0 al 7 del bus de datos, mientras que el lsb es el bit 15 y el LSB; Es el campo 8 al 15. El msb del bus de 16 bits es de 15 bits, el MSB son los 15 ~ 7 bits del bus de datos, el lsb es el bit 0 y el LSB es el campo 7 ~ 0.

En modo big-endian, el msb del bus de datos de 8 bits es el bit 0, y el MSB son los campos 0 al 7 del bus de datos, el lsb es el bit 7 y el; LSB son los campos del 0 al 7. El msb del bus de 8 bits es el séptimo bit, el MSB es el séptimo ~ 0.° bit del bus de datos, el lsb es el 0.° bit y el LSB es el campo 7.° ~ 0.°.

Se puede ver en el análisis anterior que para buses de datos de 8, 16 y 32 bits, cuando se utiliza el modo big-endian, las posiciones del MSB y MSB de los datos bus permanecen sin cambios Cuando se utiliza el modo little-endian, las posiciones del bus de datos Las posiciones de lsb y LSB permanecen sin cambios.

Por esta razón, el acceso a la memoria del procesador a 8 bits, 16 bits y 32 bits (incluido el acceso a periféricos) en modo big-endian generalmente incluye el dominio 0-7, es decir, el MSB. El acceso a la memoria de los procesadores de 8, 16 y 32 bits en modo de terminal pequeño incluye los bits del 7.º al 0. En el modo de terminal pequeño, los campos del 7.º al 0.º son LSB.

Dado que los buses de datos de procesadores grandes y pequeños tienen diferentes definiciones de ancho de 8 bits, 16 bits y 32 bits, es necesario discutir cómo manejar la conversión de modo final a nivel del sistema. .

En un sistema de procesador big-endian, es necesario gestionar el acceso del procesador big-endian a los periféricos little-endian.

1.1.2.1 El procesador big-endian accede a periféricos little-endian de 32 bits. Cuando un procesador big-endian usa un bus de 32 bits para acceder a periféricos little-endian, los bits 0 a 7 del bus de datos de 32 bits del procesador big-endian se usan para manejar OP0 y los bits 8 a 15 se usan para manejar OP1. y 65438. Little endian de 32 bits El dispositivo utiliza los bits 31 ~ 24 del bus de datos para procesar OP0, los bits 23 ~ 16 para procesar OP1, los bits 15 ~ 8 para procesar OP2 y los bits 7 ~ 0 para procesar OP3.

Los procesadores big-endian, como el MPC8541, utilizan instrucciones stw, sth, stb y lwz, lhz, lbz para acceder a dispositivos externos de 32 bits. Una vez completadas estas instrucciones, los datos almacenados en el dispositivo externo se leerán en los registros de propósito general del MPC8541. Para garantizar la coherencia del software, después del acceso, el orden de bytes almacenado en los registros generales OP0, OP1, OP2 y OP3 debe ser coherente con el orden de bytes almacenado en los periféricos little-endian. En este momento, cuando se utiliza el bus de datos del procesador de gama grande para conectar los periféricos de gama pequeña, se debe realizar algún procesamiento y las conexiones deben realizarse de acuerdo con una determinada topología para garantizar la coherencia del software. La topología de conexión entre el bus de datos del procesador big-endian y los periféricos little-endian se muestra en la Figura 4.6.

OP0 op 1 OP2 OP3 31 31 7 8 15 16 23 24 24 23 16 15 8 7 0; bus de datos de 32 bits del procesador Big-endian; Figura 4.6 Procesador Big-endian y little; Periféricos -endian La conexión de 32 bits de OP0 OP1 OP2 OP3 se muestra en la Figura 4.6. Cuando se utiliza un procesador big-endian para acceder a un dispositivo little-endian, los respectivos dominios OP0~OP3 se conectan directamente. El bit más alto del bus de datos de 32 bits de un procesador grande es 0 y el bit más bajo es 31; el bit más alto de un dispositivo little-endian es 31 y el bit más bajo es 0; Por lo tanto, los ingenieros de hardware necesitan conectar los bits 0~31 del procesador big-endian con los bits 31~0 del dispositivo little-endian en correspondencia uno a uno.

1.1.2.2 El procesador big-endian accede a periféricos little-endian de 8 y 16 bits. Los procesadores big-endian utilizan un bus de datos de 8 bits y 16 bits para conectar periféricos little-endian de 8 bits y 16 bits. Para los procesadores de 32 bits, el bus utilizado para conectar periféricos suele ser de 32 bits. Por lo tanto, los ingenieros de arquitectura tienen dos opciones al diseñar el bus de un procesador de gran tamaño: usar la parte de gama alta (campos 0~15) o la parte de gama baja (campos 16~31) del bus de 32 bits. para conectar dispositivos de gama pequeña. Los procesadores PowerPC utilizan la parte de gama alta del bus de 32 bits, es decir, los bits 0 a 15 del bus de datos para conectarse a dispositivos little-endian de 16 bits y los bits 0 a 7 para conectarse a dispositivos little-endian de 8 bits. dispositivos endian.

Cuando el procesador PowerPC utiliza un bus de 16 bits para acceder a periféricos de 16 bits, los bits 0 ~ 7 del bus de datos de 16 bits del procesador PowerPC se utilizan para procesar OP0 y los bits 8 ~ 15. se utilizan para procesar OP1. El dispositivo little-endian de 16 bits utiliza los bits 15 a 8 del bus de datos para procesar OP0 y los bits 7 a 0 para procesar OP1.

Cuando el procesador PowerPC utiliza un bus de 8 bits para acceder a periféricos de 8 bits, los campos 0~7 del bus de datos de 8 bits del procesador PowerPC se utilizan para procesar OP0. Los dispositivos utilizan 7 ~ del bit 0 del bus de datos para manejar OP1. La relación de conexión entre el procesador big-endian y los periféricos little-endian se muestra en la Figura 4.7. OP0 op 1 OP0 op 1 15 0 7 8 15 8 7 0; bus de datos de 8/16 bits del procesador big-endian; Figura 4.7 Procesador big-endian y little-endian; Las conexiones periféricas OP07070 de 8/16 bits son similares a las interfaces de bus de 32 bits. Los procesadores PowerPC pueden acceder a dispositivos externos de 32 bits mediante el uso de instrucciones stw, sth, stb y lwz, lhz y lbz y almacenar datos en los registros de propósito general correspondientes. Al final del acceso, el orden de bytes almacenado en los registros generales, OP0 y OP1, debe ser coherente con el orden de bytes almacenado en el pequeño periférico del terminal.

Cuando un procesador PowerPC accede a un pequeño periférico de 8 bits, sólo puede acceder a 8 bits de datos en un ciclo de bus. Si el procesador utiliza la instrucción stw o ​​lwz para acceder a datos de 32 bits en un dispositivo little-endian de 8 bits, entonces OP0, OP1, OP2 y OP3 se transferirán secuencialmente al registro general del PowerPC en el bus de datos.

Cuando el procesador PowerPC accede a un periférico de 16 bits, sólo puede acceder a datos de 16 bits en un ciclo de bus. Si el procesador utiliza la instrucción stw o ​​lwz para acceder a datos de 32 bits en un periférico de 16 bits, transferirá secuencialmente OP0~1 y OP2~3 al registro general de PowerPC en el bus de datos.

Cuando el procesador PowerPC utiliza la instrucción sth o lhz para acceder al dispositivo terminal pequeño de 16 bits, el dispositivo terminal pequeño de 16 bits transmite los datos de 15~0 bits a los 0~15 bits del PowerPC. bus del procesador, y finalmente transfiere los datos transferidos al registro general correspondiente. Muchos lectores aquí se sentirán confundidos, porque para garantizar la coherencia del software, cuando el procesador PowerPC usa la instrucción lhz para acceder al registro de 16 bits de un dispositivo little-endian de 16 bits, el resultado debe guardarse en bits 16 ~ 31 del registro general en lugar de 0 ~15 bits. ¿Cómo mueve el procesador PowerPC de 0 a 15 bits de datos en el bus del sistema a 16 a 31 bits en el registro? Por lo tanto, necesitamos analizar la instrucción lhz.

Los Angeles lhz Road

Si rA = 0, entonces b ← 0

de lo contrario b ← (rA)

EA ← b + EXTS(d)

RD ← (24)0 || MEM (EA, 1) De la descripción anterior de la instrucción lhz, se puede ver que la instrucción lhz almacena directamente OP0 y OP1 del bus de datos en 16~31 bits. del registro y almacena directamente. Se borran los bits 0~15.

Cuando el procesador PowerPC utiliza la instrucción stb o lbz para acceder al dispositivo terminal pequeño de 8 bits, el dispositivo terminal pequeño de 8 bits transmite los 7~0 bits de datos a los 0~7 bits del Bus del procesador PowerPC y, finalmente, transferir datos al registro de uso general correspondiente. El comando lbz se describe a continuación. Centro de I+D del Distrito Comercial de Londres

Si rA = 0, entonces b ← 0

de lo contrario b ← (rA)

EA ← b + EXTS(d)

RD ← (24)0 || MEM (EA, 1) De la descripción anterior de la instrucción lhz, se puede ver que la instrucción lhz almacena directamente OP0 del bus de datos en los bits 24~31 de el registro y los bits 0~23 se borran.

Artículo 2:

Big endian y little endian

2007-12-07 20:36 Suplemento: las computadoras x86 son terminales pequeñas (modifique la tabla de particiones por favor) prestar atención). Para los grandes terminales actuales, los microcontroladores a menudo encuentran un problema de orden de bytes. Aunque parece muy simple, nunca he entendido completamente esto, así que simplemente busqué información para explicarlo claramente. Debido a que las computadoras actuales se basan en ocho bits y un byte, un entero de 16 bits, abreviado en lenguaje C, puede tener dos órdenes de almacenamiento en la memoria: big-endian y litte-endian. Considere un entero corto 0x3132 (0x32 es bajo, 0x31 es alto), asígnelo a una variable corta y luego guárdelo en la memoria. Puede haber las siguientes dos situaciones:

Big endian:

-& gt;& gt& gt& gt& gt& gt& gt& gt; Dirección de memoria dirección creciente

Dirección de variable corta

0x1000 0x1001

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

El byte alto está antes del byte bajo, es decir, el byte alto está en el dirección de memoria en el extremo inferior. ;Bit alto ->;Antes->;Orden lógico normal)

Little endian:

->& gt& gt& gt& gt& gt& gt& gt; Dirección de memoria en dirección creciente

Dirección de variable corta

0x1000 0x1001

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0x 32 | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _inferior->antes->opuesto al orden lógico normal)

Puedes hacer un experimento

Ejecutar el siguiente programa en Windows.

# include & ltstdio.h & gt

# include & ltassert.h & gt

Administrador no válido (no válido)

{ Prueba corta; ARCHIVO * fptest = 0x 3132; //(31 es '1' cuando es código ⅱC, y 32 es '2' cuando es código ⅱC)

if ((fp = fopen ( c:\ \test.txt, wb)) == NULL)

Aserción(0); fwrite(& prueba, tamaño de (corto), 1, fclose(FP); >

}

Luego abra el archivo test.txt en la unidad c. Puede ver que el contenido es 21 y la prueba es igual a 0x3132. Se puede ver claramente que el orden de bytes de x86 es primero bajo y luego alto. Si tomamos este párrafo; cuando se ejecuta el mismo código en una máquina big endian, el archivo impreso es 12. Esto no es un problema en esta máquina, pero cuando copia este archivo de una máquina big endian a una máquina little endian, surgen problemas.

Como en el ejemplo anterior, creamos este archivo de prueba en la máquina big-endian, lo copiamos en la máquina little-endian y usamos fread para leerlo en un resumen. Ya no obtenemos 0x3132 sino 0x3231, por lo que la lectura de datos es incorrecta, por lo que debe ser muy pequeña al transferir datos entre dos máquinas con diferente endianidad. Tenga en cuenta el endianismo. Comprender el endianismo puede ayudarnos a escribir código más avanzado utilizando líneas trasladadas.

Debido a la diferencia en el orden de los bytes, se define que todos los datos relacionados con el orden de los bytes se procesan con big-endian, código BSD BSD:

#define ntohs(n) / /Orden de bytes de la red al orden de bytes del host n representa la red, h representa el host y s representa el nombre corto.

#Definición htons(n) // Desde el orden de bytes del host hasta el orden de bytes de la red, n representa neto, h representa host y s representa abreviatura.

#define ntohl(n) // Orden de bytes de la red al orden de bytes del host n representa neto, h representa host y l representa largo.

#Definition htonl(n) // Orden de bytes del host a orden de bytes de la red n representa neto, h representa host, l representa largo.

Un ejemplo de la implementación de una de las macros: #define SW 16(x)\((short)(x)&;(short)0x 00 ffu)<<8) \(( ( Short)(x)&(short)0xff00U)>& gt8)))

Lo que se implementa aquí es el intercambio de dos secuencias de bytes. Otras macros son similares.

Reescribamos el programa anterior.

# incluir & ltstdio.h & gt

# incluir & ltassert.h & gt

#define sw16(x) \

((corto)(\((corto)(x)& amp;(corto)0x 00 ffu)& lt;& lt8) | \(((corto)(x)& amp;(corto)0xff00U)>& gt8)))

//Debido a que x86 es primero de gama baja, es necesario intercambiar el orden de los bytes de la red.

#Definición htons(x) sw16(x)

Gerente general no válido (no válido)

{Prueba corta; ARCHIVO * fp

test = htons(0x 3132); //('1' de 31 se usa como código ⅱC, '2' de 32 se usa como código ⅱC) if ((fp = fopen (c:\\test.txt,WB) )) == nulo).

Aserción(0); fwrite(& prueba, sizeof(short), 1, fclose(FP);

}

Si está en máquinas con high endian al frente, consistente con el orden de bytes de la red, entonces no podemos hacer nada más que reemplazar la macro #define htons(x) sw16(x) con #define htons(x) (x).

Cuando comencé a comprender este problema, me preguntaba por qué otros datos no necesitaban intercambiar el orden de bytes. Por ejemplo, si escribimos un búfer en un archivo, finalmente lo calculamos. Debido a que todos son tipos de caracteres sin firmar, se escriben byte a byte. Este orden es fijo, no hay problema de orden de bytes, bastante estúpido... Artículo 3:

Los términos big endian y little endian provienen de la obra satírica del siglo XVIII de Jonathan Swift "The Box" Lev's Travels" . Los ciudadanos del antiguo imperio de Blefus estaban divididos en dos partes según la forma en que comían huevos: una comienza desde el extremo grande del huevo al comer el huevo y la otra comienza desde el extremo pequeño del huevo.

La CPU X86 usa LE (llamado "orden de bytes del host" en Windows) y SocksAddr usa BE (llamado "orden de bytes de la red"), por lo que necesita usar htns, html, nth, nth para invertir el orden de bytes.

De hecho, lo tuve claro cuando me familiaricé con el montaje. Desafortunadamente, mi ensamblaje little-endian es el orden de bytes que mejor se adapta al pensamiento de la gente. Por el contrario, el orden superior de los valores de almacenamiento de orden inferior es el orden de bytes más acorde con el pensamiento humano. Porque desde la primera impresión de las personas, los valores de orden inferior son pequeños, por lo que deberían serlo. colocado en un lugar con una dirección de memoria pequeña, es decir, una dirección de memoria de orden bajo. Por el contrario, el valor de orden superior debe colocarse en un lugar con una dirección de memoria grande. En otras palabras, la dirección de orden de bytes más intuitiva de la dirección de memoria de orden superior es big-endian. ¿Por qué el bit de orden inferior de la dirección de orden superior del valor de memoria de orden inferior es intuitivo? Independientemente de la correspondencia, solo necesita escribir la dirección de memoria de izquierda a derecha en orden de menor a mayor y escribir el valor en orden de mayor a menor. Ejemplo de llenado byte a byte: modo de almacenamiento de palabras dobles en la dirección de memoria 4000 4001020304 (DWORD) 4000 4001 4002 4003 le 04 02 01 BE 01 02 03 04 Explicación de MSDN del orden de bytes LE y BE El significado del orden de bytes big-endian El byte más significativo se encuentra al final izquierdo de una palabra. little-endianEl byte más significativo se encuentra al final derecho de una palabra. El byte más significativo aquí puede interpretarse como el bit más alto del valor. Si es dinero, es lo más valioso. Por ejemplo, tengo 1234 yuanes, el más valioso es 1000 yuanes y el menos valioso es 4 yuanes, por lo que este 1 es el byte más importante.

Máquina big-endian: Considera que el primer byte que lee es un byte grande. Máquina little-endian: Considera pequeño el primer byte que lee. Por ejemplo, a partir de la dirección de memoria 0x0000, existen los siguientes datos: 0x 0000 0x 120x 0010x 340x 0002 0x b0x 0003 0x CD. Si leemos una variable de cuatro bytes en la dirección 0x0000, si el orden de los bytes es big-endian, el resultado de la lectura es 0x 1234 ABCD; si el orden de los bytes es little-endian, el resultado de la lectura es 0xcdab3412; Si escribimos 0x1234abcd en la memoria a partir de 0x0000, el resultado es big-endian y little-endian 0x 0000 0x 120 xc 0x 00010x 230 xb0x 0002 0x ab 0x 340x 0003 0x CD 0x 12x. orden de bytes.