MASM中Label是地址还是数据?相关指令执行逻辑困惑求解
MASM中Label的两种使用场景解析
一、为什么mov ax, var等效于mov ax, [0000]而非mov ax, 0000?
在MASM的语法规则里,直接使用Label作为操作数时,默认是访问该Label对应的内存地址中的内容,而非直接取Label的偏移地址作为立即数。
以你的代码为例,a是代码段起始处的Label,它的偏移地址为0000h。当你编写mov ax, a时,MASM会自动将其解析为mov ax, word ptr [a](因为AX是16位寄存器,会自动匹配字大小的内存访问),也就是读取代码段中偏移0000h处的字数据(对应a定义的前两个字节12h和23h,小端存储后为2312h)。
如果想把Label的偏移地址作为立即数加载到寄存器,必须显式使用OFFSET关键字,比如mov ax, OFFSET a,此时才会将0000h直接存入AX。
二、为什么c : dw a,b会生成00 00 04 00的数据?
dw是MASM中定义字类型数据的伪指令,当你将Label作为dw的参数时,MASM会把Label对应的偏移地址值存储到指定内存位置:
a是代码段起始Label,偏移地址为0000h,所以第一个字存储0000h,按小端字节序排列就是00 00;b在a之后,a定义了4个字节的db数据,因此b的偏移地址为0004h,第二个字存储0004h,小端字节序下就是04 00;
将这两个字连续存放,c处的内存数据就是00 00 04 00,完全符合偏移地址的计算逻辑。
内容的提问来源于stack exchange,提问作者haha haha
相关产品推荐
相关产品推荐

