在intel x86 / vs 环境,以下6句汇编
(1)mov eax, 0x00400000
(2)mov eax, dword ptr [0x00400000]
(3)mov eax, this
(4)mov eax, dword ptr [this]
(5)mov eax, ecx
(6)mov eax, dword ptr [ecx]
(1)是否==(2)
(3)是否==(4)
(5)是否==(6)
想看一下汇编中dword ptr []对立即数、变量、寄存器的处理方式,但找不到出处。
网上的一些文章有些误人子弟,所以在这里求助大家,先谢过了。
------解决方案--------------------
为说明问题,加了一点内容
.data
...
this dd 5 ;假设this的地址是0x00400000
.code
(1)mov eax, 0x00400000 ;令eax = 0x00400000
(2)mov eax, dword ptr [0x00400000];令eax=this 即eax=5;
(3)mov eax, this ;在FASM汇编中,意思同(1)
(4)mov eax, dword ptr [this];(同2)
(mov ecx,this;)
(5)mov eax, ecx ;eax = ecx,根据下文知,ecx所持为某变量的地址
(6)mov eax, dword ptr [ecx];
在VC中,ecx被用来传递类的指针;
注:-------------
在masm中:
mov ecx,this 等价于 mov ecx,[this],即ecx = 5
此时,this必须定义为dd宽的变量,否则得要写成下面这样:
mov eax, dword ptr [this];
也就是说,在masm中上面的(3)与(4)意思是一样的,但是(4)写得更明确,而(3)可能汇编就通不过,因为this也可能被定义成word等其他类型.
在fasm中:
mov ecx,this 等价于masm的 mov ecx,offset this,即ecx = 0x00400000
也就是ecx取变量this的地址
如果取变量this的值,则this外面必须加方括号
汇编语言是弱类型检查语言,在访问存储器变量时,最好用(2)、(4)这样的语句,告诉汇编器this是多宽的this。
-----------
以上仅供参考
------解决方案--------------------
1L在注里有个地方将
mov ecx, dword ptr [this];
写成
mov eax, dword ptr [this];
特告.
------解决方案--------------------
啊,32位的代码真亲切啊,现在看16位的,蛋碎啊~~~~~~~~~~~
MEMORY:9E1DB 1E push ds ; 保存现场
MEMORY:9E1DC 06 push es
MEMORY:9E1DD 60 pusha
MEMORY:9E1DE 0E push cs
MEMORY:9E1DF 1F pop ds ; ds = cs = 9DC0
MEMORY:9E1DF ; 指向该段段首
MEMORY:9E1E0 68 00 B8 push 0B800h
MEMORY:9E1E3 07 pop es ; es = 0B800h
MEMORY:9E1E4 assume es:nothing
MEMORY:9E1E4 33 D2 xor dx, dx
MEMORY:9E1E6 33 C0 xor ax, ax
MEMORY:9E1E8 33 FF xor di, di
MEMORY:9E1EA 33 ED xor bp, bp
MEMORY:9E1EC AC lodsb ; 操作 9DC0:0695 开始的数据
MEMORY:9E1EC ; [si]加载到al
MEMORY:9E1ED BF A0 00 mov di, 0A0h ; '
MEMORY:9E1F0 F7 E7 mul di
MEMORY:9E1F2 8B F8 mov di, ax ; ax*0A0h 低16位放入di