能力值:
( LV12,RANK:650 )
|
-
-
2 楼
你用的啥汇编器,MASM不是这样的吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
最初由 RoBa 发布 你用的啥汇编器,MASM不是这样的吧。
我就是使用MASM32的V8.0版本编译的,你不信,可测试一下。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这个问题难道没有兄弟碰到过吗,怎么没有人回答呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
试试mov eax,dword ptr [12345678h]
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
最初由 东方弘 发布 试试mov eax,dword ptr [12345678h]
这样的写法一样不能,你也可测试一下。
|
能力值:
( LV8,RANK:130 )
|
-
-
7 楼
是有些不明白
.这是一点测试
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
;-------------------------------------------------------
.DATA
.CODE
START:
mov eax,[00401004h]
mov eax,00401004h
mov eax,dword ptr 00401004h
mov eax,dword ptr [00401004h]
mov eax,00401004h
mov eax,ds:00401004h
mov eax,ds:[00401004h]
invoke ExitProcess,0
end START
下面是od的代码
00401000 >/$ B8 04104000 mov eax,Noname1.00401004
00401005 |. B8 04104000 mov eax,Noname1.00401004
0040100A |. B8 04104000 mov eax,Noname1.00401004
0040100F |. B8 04104000 mov eax,Noname1.00401004
00401014 |. B8 04104000 mov eax,Noname1.00401004
00401019 |. A1 04104000 mov eax,dword ptr ds:[401004]
0040101E ? A1 04104000 mov eax,dword ptr ds:[401004]
00401023 ? 6A 00 push 0
00401025 ? E8 00000000 call <jmp.&kernel32.ExitProcess>
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
试了试.是不行
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我如写汇编代码mov eax,[ecx+00401004h],经过masm32编译后就能正确显示,为什么多了ecx就能,少了ecx就不可以呢?
请各位兄弟指点一下吧,实在搞不清楚我的代码错在哪?
|
能力值:
( LV9,RANK:210 )
|
-
-
10 楼
那应该是编译器的BUG啦
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
印象中12345678是不能间接寻址的。我没学过汇编
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
最初由 moon 发布 那应该是编译器的BUG啦
不是BUG吧,我使用MASM,TASM等编译器都有这个问题。
甚至使用VC的内联汇编,代码如下
//VC代码
_asm mov eax,[12345678h] ;使用OLLYDBG看到的代码
mov eax,12345678
|
能力值:
(RANK:410 )
|
-
-
13 楼
估计是汇编设计问题,windows是运行在保护模式的,程序读取地址必须遵守保护模式的规定,像mov eax,[xxxxxxxx]直接读取内存数据编译器分不清你要读取那个段的数据(乱读取内存会产生不可预料的错误,一般来说读取程序的内存都是通过全局变量或局部变量由编译器自动分配地址的),所以编译器自动将读取转换成送址的语句mov eax,xxxxxxxx。而你标明了ds段时是因为指明了读取ds段的xxxxxxxx内存数据。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
最初由 小虾 发布 估计是汇编设计问题,windows是运行在保护模式的,程序读取地址必须遵守保护模式的规定,像mov eax,[xxxxxxxx]直接读取内存数据编译器分不清你要读取那个段的数据(乱读取内存会产生不可预料的错误,一般来说读取程序的内存都是通过全局变量或局部变量由编译器自动分配地址的),所以编译器自动将读取转换成送址的语句mov eax,xxxxxxxx。而你标明了ds段时是因为指明了读取ds段的xxxxxxxx内存数据。
再请教一下
mov eax,[ecx+12345678h]
就能默认读DS段呢?
|
能力值:
(RANK:410 )
|
-
-
15 楼
最初由 dssz 发布
再请教一下 mov eax,[ecx+12345678h] 就能默认读DS段呢?
这个属于间接读取,不是属于直接读取。这时的xxxxxxxx是属于偏移址。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
最初由 小虾 发布
这个属于间接读取,不是属于直接读取。这时的xxxxxxxx是属于偏移址。
关于这个问题,应该和保护模式没有关系的,我使用MASM6.0的编译器,编译16位程序的也有这种情况出现。
例如
mov ax,[1234]
编译后变成
mov ax,1234
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
是不是编译时默认段只针对寄存器?
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
最初由 dssz 发布
关于这个问题,应该和保护模式没有关系的,我使用MASM6.0的编译器,编译16位程序的也有这种情况出现。
例如 ........
mov ax,[var].这是直接寻址,var是个变量
mov ax,var是一样的,写法不同而已
|
|
|