当前位置: 代码迷 >> 汇编语言 >> []指令的疑点
  详细解决方案

[]指令的疑点

热度:169   发布时间:2016-05-02 04:41:57.0
[]指令的疑问
在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
  相关解决方案