摘要:关于c语言和汇编语言中所涉及的大端序和小端序的一个记录

说明

可以简单的认为winhex打开的文件开头只要没特殊说明都是以小端序的形式排列的,特殊说明比如开头是FEFF就说明这个文件是大端序。

memcpy(buffer,buf,sizeof(buf))时buf在buffer中的排列顺序

汇编和c语言中的大端小端问题1.jpg

图中为winxp下将buf数组复制到buffer数组的汇编调试,rep moovs为memcpy的核心代码,功能就是将地址DS:SI中的buf数组复制到地址ES:DI的buffer数组中去。复制时是从buf[0]复制到buffer[0]中即地址从低向高复制,也就是buffer数组会从栈的低地址向栈的高地址延伸。

c语言数组的数据压栈顺序

汇编和c语言中的大端小端问题2.jpg

可以看到调用test函数时,buf数组参数的进栈顺序是从数组的高地址开始。

int13中断读取磁盘数据时数据在寄存器中的顺序

汇编和c语言中的大端小端问题3.jpg

使用winhex可以看到磁盘中的数据文件是以EB3C开头的(小端序),然后int 13读取这个文件,发现在寄存器是大端序

push 0x1234在寄存器中的排列顺序

汇编和c语言中的大端小端问题4.jpg

push 0x12345678的压栈顺序

汇编和c语言中的大端小端问题5.jpg

push 0x12345678编译成二进制exe文件后的排列顺序

汇编和c语言中的大端小端问题6.jpg

汇编和c语言中的大端小端问题7.jpg

push 字符串的压栈顺序

汇编和c语言中的大端小端问题8.jpg