首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

[]指令的疑义

2014-01-12 
[]指令的疑问在intel x86 / vs 环境,以下6句汇编(1)mov eax, 0x00400000(2)mov eax, dword ptr [0x0040000

[]指令的疑问
在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


------解决方案--------------------


(5)肯定不等于(6)
至于(1)、(2)、(3)、(4),取决于汇编器,从intel汇编器发展出来的汇编器,象ms、borland的产品,都是(1)=(2),(3)=(4),其他的汇编器,不能肯定。

热点排行