[]指令的疑问
在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
MEMORY:9E1F4 AC lodsb ; 这里是循环开始位置 9E1F9h
MEMORY:9E1F4 ; BYTE a; int i=0;
MEMORY:9E1F4 ; for ( a=[ 9E295 h+i]; i=[ 9e295 h+i]. i++)
MEMORY:9E1F5 84 C0 test al, al
MEMORY:9E1F7 74 47 jz short near ptr Exit_Loop ; if (a==0) 如果数据为0, 跳出循环, 跳到 9E240
MEMORY:9E1F9 3C 0A cmp al, 0Ah
MEMORY:9E1FB 75 0D jnz short near ptr Not_Equal_A0 ; if (a =! 0xA) 继续判断是什么数值,跳到 9E20A h
MEMORY:9E1FD 26 C6 43 01 00 mov byte ptr es:[bp+di+1], 0 ; 如果 a == 0xAh, 则 [bp+di+1] = 0; di += 0xA0; bp = 0; 继续循环
MEMORY:9E202 81 C7 A0 00 add di, 0A0h ; '
MEMORY:9E206 33 ED xor bp, bp
MEMORY:9E208 EB EA jmp short near ptr loop_next
MEMORY:9E20A ; ---------------------------------------------------------------------------
MEMORY:9E20A 3C 0D cmp al, 0Dh
MEMORY:9E20C 74 E6 jz short near ptr loop_next ; if (a == 0xD) 如果是回车符,则 continue 下一个循环
MEMORY:9E20E 3C 10 cmp al, 10h
MEMORY:9E210 77 0B ja short near ptr Bigger_10h ; if (a > 0x10 )
MEMORY:9E212 8A E0 mov ah, al
MEMORY:9E214 3C 10 cmp al, 10h
MEMORY:9E216 75 DC jnz short near ptr loop_next ; 如果这个byte的低4位为 0x10,则 continue
MEMORY:9E218 E8 29 00 call near ptr unk_E244
MEMORY:9E21B EB D7 jmp short near ptr loop_next