今天学习的是常用指令的解释
.data
bTest db 12h;
wTest dw 1234h
dwTest dd 12345678h
.code
start:
mov al, byte ptr bTest
mov ax, word ptr bTest
mov eax,dword ptr bTest
end start
先说下结果吧:
第一条指令al=12h
第二条指令ax=1212h
第三条指令eax=78123412h
80386是按照顺序由低地址往高地址排列的,对于超过一个字节的数据,80386处理器的数据排列方式是低位数据在低地址
mov eax,dword ptr bTest
ptr指令是强制覆盖变量长度,所以以bTest开始的数据是(eax)
我们知道,bTest地址开始的四个字节包括的是bTest和wTest的全部和dwTest的一个字节
由低地址,bTest是12h wTest是3412h dwTest呢则是78563412h,这样eax由高到低的排列是
78341212h!!
当我们想要使用,某一个字节的扩展时,即,高位保持0,换句话说是
无符号位的扩展是使用指令movzx !movzx eax,bTest eax当中就是12h
有符号位的扩展是使用指令movsx!movsx eax,bTest eax当中就是12h
变量的尺寸呢就是使用sizeof指令,
sizeof可以获取变量,数据类型和数据结构以字节为单位的长度
lengthof指令则是可以获取变量中数据的项数
获取变量的地址
变量地址的获取对于全局变量和局部变量是不一样的
全局变量的地址在编译时通过编译器确定,而局部变量则是通过ebp来做指针进行偏移来确定的
对于全局变量的地址 由offset获得
对于局部变量的地址由lea eax,[ebp-4]该指令可以在运行时按照EBP的值实际计算出地址放到EAX
还有一个
指令就是addr 该指令同时能够获取全局变量和局部变量的地址,在变量名是全局变量时自动替换成offset
变量名是局部变量是,自动替换成LEA,但是有一个限制:当变量名是局部变量时,addr只能使用在invoke参数中,
不能用在
mov eax,addr 局部变量;错误用法!