CODE SEGMENT
ASSUME CS:CODE
BUF1 DW 1,2,3,4,5,6,7,8,9,0
N EQU ($-BUF1)/2
BUF2 DW N DUP(?)
START: PUSH CS
POP DS
PUSH CS
POP ES
MOV CX,N
LEA SI,BUF1
LEA DI,BUF2
CLD
@1:
LODSW
XCHG AH,AL
STOSW
LOOP @1
LEA SI,BUF2
MOV CX,N
CLD
@2:
LODSW
CALL DSPAX
LOOP @2
山辩塌 MOV AH,4CH
逗圆 INT 21H
===============================
DSPAX PROC NEAR
灶物 PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSHF
XOR CX,CX
MOV BX,10
@DSPAX1:
XOR DX,DX
DIV BX
INC CX
OR DX,30H
PUSH DX
CMP AX,0
JNE @DSPAX1
MOV AH,2
@DISPAX2:
POP DX
INT 21H
LOOP @DISPAX2
MOV DL,32
INT 21H
POPF
POP DX
POP CX
POP BX
POP AX
RET
DSPAX ENDP
================================
CODE ENDS
END START
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中;0x22放在高地址中,即0x0011中。小端模式,刚好相反
一个判断当前系统是大端还是小端拍历的函数,小端则返回1:
以上函数,若在小端系统下,其字节序为,b[0]中存储00000001,后三个字节依次存储00000000,大端系统下反之
在iOS开发中,苹果已经为我们定义好了一套用于大小端转换的宏定义:
NTOHL,network to host,L、S、LL分别对应long、short、long long
HTONL,反之
大小端转换原理如下:
假设一个short类型的数字:0x1122,那么其二进制形式为:00010001 00100010
首先,取出第一个字节,右移八位:
然后,取出第二个字节,左移八位:
最后,按位袭物搜或,至此,大小端转换完蚂拆成:
大端模式(Big-Endian)又称大端字节序,由于在网络传输中一般使用的是大端模式,所以也叫网络字节序。
在大端模式中,将高位字节放在低位地址,低位字节放在高位地址。
举个例子,数值 0x12345678 ,其中 0x12 这一端是高位字节, 0x78 这一端是低位字节。
该数值的存储顺序是这样的:
大端模式符合我们阅读和书写的方式,都是从左到右的。比如 12345678 ,我们只需要按照从左到右的顺序进行阅读和书写就是大端模式的存储顺序了。
小端模式(Little-Endian)又称小端字节序,由于大多数计算机内部处理使用的是小端模式,所以也叫主机序。
在小端模式中,将高位字节放在高位地址,低位字节放在低位地址。
小端模式比较符合我们人类的思维模式,大的放大的那一边,小的放小的那一边。但是在计算机中存储的顺序与慎尘我们看到的顺序是相反的。
对于早期的计算机来说,先处理低位字节效率比较高,因为计算都是从低位开始的,所以大多数计算机内部处理使用的是小端模式。但是计算机发展到现在,计算机的处理器相较于以前已经进步很多了,先处理高位还是低位字节的影响已经可以忽略,但是为了向后兼容,保留了大/小端模式。
大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。
大端模式更适合程序员阅读,因为看到的内容与输出的内容是一致的。
计算机在处理数据的时候,只会按照顺序去读取字宽早禅节,不关心数睁脊据是大端模式还是小端模式。
程序在读取到数据后,需要判断计算机的大小端模式,来决定是否需要进行大小端转换。
如果读到的第一个字节是高位字节,那么就是大端模式;反之,如果读到的第一个字节是低位字节,那么就是小端模式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)