OFFSET 操作符返回的是 数据标号的偏移地址,看代码

;test_03

INCLUDE irvine32.inc
INCLUDELIB Irvine32.lib
INCLUDELIB KERNEL32.LIB


.data
b_val	BYTE	?
w_val	WORD	?
d_val1	DWORD 	?
d_val2  DWORD 	? 

.code
main PROC
	mov	eax,offset b_val
	mov	ebx,offset w_val
	mov	ecx,offset d_val1
	mov	edx,offset d_val2
	
	call	DumpRegs
	exit
main endp
END main

这段代码 ,一共4个标号,3种不同大小类型,OK,我们看下寄存器图

image

我们可以从中看出 .data数据段起始内存是00403000,第一个标号是BYTE 类型,占去了一个字节,用OFFSET w_val,就能看出w_val起始内存是00403001,正好是一个字节大小,后面的以此类推。

 

在计算机内存中,处理偶数地址的数据比奇数快的多,可是刚才的EBX却是奇数,怎么让他到偶数位呢,那我们就需要ALIGN了。

ALIGN伪指令可以跟上 1 ,2 ,4,16  ,表示将地址对齐的空间大小。

改下上面的程序:

;test_04

INCLUDE irvine32.inc
INCLUDELIB Irvine32.lib
INCLUDELIB KERNEL32.LIB


.data
b_val	BYTE	?
ALIGN	4
w_val	WORD	?
ALIGN	4
d_val1	DWORD 	?
d_val2  DWORD 	? 

.code
main PROC
	mov	eax,offset b_val
	mov	ebx,offset w_val
	mov	ecx,offset d_val1
	mov	edx,offset d_val2
	
	call	DumpRegs
	exit
main endp
END main
image

我们加了 2句ALIGN 4 ,看下寄存器,大家就明白了。

posted on 2011-11-05 15:07  锅子  阅读(514)  评论(0编辑  收藏  举报