0
点赞
收藏
分享

微信扫一扫

win32汇编学习之三


     今天学习的是常用指令的解释

.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 局部变量;错误用法!




举报

相关推荐

0 条评论