OFFSET 操作符返回的是 数据标号的偏移地址,看代码
;test_03INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.datab_val BYTE ?w_val WORD ?d_val1 DWORD ?d_val2 DWORD ? .codemain PROC mov eax,offset b_val mov ebx,offset w_val mov ecx,offset d_val1 mov edx,offset d_val2 call DumpRegs exitmain endpEND main
这段代码 ,一共4个标号,3种不同大小类型,OK,我们看下寄存器图
我们可以从中看出 .data数据段起始内存是00403000,第一个标号是BYTE 类型,占去了一个字节,用OFFSET w_val,就能看出w_val起始内存是00403001,正好是一个字节大小,后面的以此类推。
在计算机内存中,处理偶数地址的数据比奇数快的多,可是刚才的EBX却是奇数,怎么让他到偶数位呢,那我们就需要ALIGN了。
ALIGN伪指令可以跟上 1 ,2 ,4,16 ,表示将地址对齐的空间大小。
改下上面的程序:
;test_04INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.datab_val BYTE ?ALIGN 4w_val WORD ?ALIGN 4d_val1 DWORD ?d_val2 DWORD ? .codemain PROC mov eax,offset b_val mov ebx,offset w_val mov ecx,offset d_val1 mov edx,offset d_val2 call DumpRegs exitmain endpEND main
我们加了 2句ALIGN 4 ,看下寄存器,大家就明白了。