用汇编语言做大小端的转换代码

用汇编语言做大小端的转换代码,第1张

 字的大小端转换 

        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)又称小端字节序,由于大多数计算机内部处理使用的是小端模式,所以也叫主机序。

在小端模式中,将高位字节放在高位地址,低位字节放在低位地址。

小端模式比较符合我们人类的思维模式,大的放大的那一边,小的放小的那一边。但是在计算机中存储的顺序与慎尘我们看到的顺序是相反的。

对于早期的计算机来说,先处理低位字节效率比较高,因为计算都是从低位开始的,所以大多数计算机内部处理使用的是小端模式。但是计算机发展到现在,计算机的处理器相较于以前已经进步很多了,先处理高位还是低位字节的影响已经可以忽略,但是为了向后兼容,保留了大/小端模式。

大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。

大端模式更适合程序员阅读,因为看到的内容与输出的内容是一致的。

计算机在处理数据的时候,只会按照顺序去读取字宽早禅节,不关心数睁脊据是大端模式还是小端模式。

程序在读取到数据后,需要判断计算机的大小端模式,来决定是否需要进行大小端转换。

如果读到的第一个字节是高位字节,那么就是大端模式;反之,如果读到的第一个字节是低位字节,那么就是小端模式。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12305573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存