10-x86汇编——大小端模式

本文深入探讨了汇编语言如何处理内存中的数据存储,特别是大小端模式的区别。通过实例展示了16位和32位数据在内存中的存储方式,并解释了小端模式和大端模式的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编语言实际上是和内存以及寄存器打交道的,当处理器执行汇编指令时,影响的不是内存变化就是寄存器的变化,前面我们已经详细介绍过寄存器了,这一小节我们主要讨论数据在内存中的存储——大小端模式。

当我们对内存读写时,实际上是操作的内存地址(又可以称为内存编号),每一个内存地址都对应着一个内存存储单元,而每个内存单元对应1个字节(相当于8个比特位)。

如上图所示,假设我们需要在以0x08001为起始地址的一段内存区域内依次存储9个字节数据应该怎么做呢?通过前面的学习,其实这很好办。

 

下面是给出的实现代码:

mov ax,0x0800
mov ds,ax 				;把数据段寄存器DS定位到0x0800内存地址

mov byte[ds:0001],0x11		;从0x08001起始地址依次写入字节数据
mov byte[ds:0002],0x22
mov byte[ds:0003],0x33
mov byte[ds:0004],0x44
mov byte[ds:0005],0x55
mov byte[ds:0006],0x66
mov byte[ds:0007],0x77
mov byte[ds:0008],0x88
mov byte[ds:0009],0x99 

end:
jmp 0x07C0:end 

times 510-($-$$) db 0x00
db 0x55,0xAA 

 

执行结果:

从上图来看,程序的执行结果是非常符合我们预期所想的,这里我们再思考一下:首先大家都知道一个内存地址只能存储一个字节的数据,如果我们把一个16位的数据存储到内存中会发生什么?

我们可以通过word来写入一个字,word代表一个字,一个字是2个字节大小。

可以认为word关键字就是让编译器知道,你到底要覆盖几个内存地址。

 

修改上面的代码为:

mov word[ds:0001],0x1122		
mov dx,word[ds:0001]			 ;往寄存器dx中写入一个字

执行结果如下:

还是以0x08001起始地址写入一个十六位的数据0x1122,我们可以看到在内存中实际上占用了两个内存地址,0x22存储在0x08001内存地址,0x11存储在0x08002内存地址。

也就是说,当我们要往一个内存地址写入2个字节的时候,就会以该地址为起始地址,依次写入数据(覆盖下一个内存地址)。那如果我们要往某个内存地址写4个字节呢?

mov dword[ds:0001],0x11223344
mov edx,dword[ds:0001]

dword表示写入4字节,edx是一个32位的寄存器。

 

执行结果如下:

我们可以看到0x08001内存地址存放了0x44,0x08004内存地址存放了0x11。我们再换一句说法,0x08001内存地址存储了一个4字节[32位]的数字:0x11223344。

这种内存存储方式称之为小端模式,内存的低地址存储了数据低位,内存的高地址存储了数据高位。例如0x11223344这个数据来说,0x11代表最高位,而0x44代表最低位。

对于内存地址来说,0x08001是最低位,0x08004是最高位。

至于大端模式就是数据低位在内存高位,数据高位在内存低位,最后,如果CPU是大端模式工作的话,那么大家思考一下,当执行如下指令:mov dword[ds:0001],0x11223344,数据在内存是如何存储的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值