首页
社区
课程
招聘
这句怎么老编译不过去。
发表于: 2006-2-12 23:07 8501

这句怎么老编译不过去。

2006-2-12 23:07
8501

;enter.asm
.386p
.............
Gdtptr dw ..
      db ...

.....
lgdt qword ptr Gdtptr ;32位的。这句在masm enter.asm老是不能通过。书上的例子,
                      ;没有输入错
                      ;它提示的错误是:指令的操作数大小有错误,这是什么意思?是
                      ;qword 错误吗?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
2
fword?
2006-2-13 10:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[Gdtptr]?
2006-2-13 11:11
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
Opcode        Instruction        Description
0F 01 /2        LGDT m16&32        Load m into GDTR
0F 01 /3        LIDT m16&32        Load m into IDTR

LGDT qword ptr Gdtptr?
qword ? 有没有搞错, 你使用的是64位操作系统? 使用的是64位编译器?
2006-2-13 21:07
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那倒不是,,winxp~不过书上的例子是这样啊。。
运行环境:masm615,书《win32汇编程序设计》
那应该怎么改??整本书的例子都有这一句啊。。
帮帮我。。不然这本书白买了。。。我郁闷
2006-2-13 23:14
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
6
32位系统改成 dword 不就完了,用的着忧闷吗?
2006-2-14 03:38
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
lgdt是从内存中数据装入GDTR呀
改成
lgdt dword ptr [Gdtptr]
试试
2006-2-14 10:22
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
.386p

.data
Gdtptr fword 0

.code
lgdt fword ptr Gdtptr
2006-2-14 15:56
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
qword?
2006-2-14 16:03
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
PTR qualifiedtype:
1(BYTE), 2(WORD), 4(DWORD), 6(FWORD),  8(QWORD), 10(TBYTE)

GDTR是48位的寄存器,所以用FWORD
2006-2-14 16:13
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
386下将GDRT全局描述表作为一个特殊的系统段,实际界限是8192*8
长度为48位。但分32位段基址和16位界限,感觉还是应该使用 dword和word
2006-2-14 16:28
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
12
更正前面我的错误说法,正确的答案是heXer的 fword
lgdt 和 lidt 是系统服务的特权指令, 只能在 ring0层运行,masm32的编译器也识别这条指令, 所以在正常的 exe 文件中这条指令是不能成功编译的,会有如下错误提示:
error A2085: instruction or register not accepted in current CPU mode
(其他的编译器应该没有这个问题)
你可以按照驱动程序的格式(即加上DriverEntry ...)作为启动地址,这类代码就能正确的编译,
这类代码一共4个, 即 sgdt, sidt, lgdt, lidt.
前面两个在用户模式是可以正常编译的,而且对长度的要求并不严格,如下格式都可以正常编译,而且产生的代码完全相同.
sgdt qword ptr [esp + gdt]
sgdt fword ptr [esp + gdt]
sidt qword ptr [esp + idt]
sidt fword ptr [esp + idt]
但对于 lgdt, lidt 则只能使用 fword
lgdt fword ptr [esp + gdt]
lidt fword ptr [esp + idt]
另外在 IDA 中分析这些代码, 给出的都是错误结果, 全部用 qword 来解释.
例如 lgdt fword ptr [esp + gdt]
在 IDA 中 一定被反编译成
lgdt qword ptr [esp + gdt]

gdt = qword
lgdt [esp + gdt]
对前面不经过思考就胡乱答题,表示谦意.
2006-2-16 17:30
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵,原来是这样。 学习了
今天,特意去看了一下,关于 Lidt 的Description
The LGDT and LIDT instructions load a linear base address and limit value from a six-byte data operand in memory into the GDTR or IDTR, respectively. If a 16-bit operand is used with LGDT or LIDT, the register is loaded with a 16-bit limit and a 24-bit base, and the high-order eight bits of the six-byte data operand are not used. If a 32-bit operand is used, a 16-bit limit and a 32-bit base is loaded; the high-order eight bits of the six-byte operand are used as high-order base address bits.

The SGDT and SIDT instructions always store into all 48 bits of the six-byte data operand. With the 80286, the upper eight bits are undefined after SGDT or SIDT is executed. With the 80386, the upper eight bits are written with the high-order eight address bits, for both a 16-bit operand and a 32-bit operand. If LGDT or LIDT is used with a 16-bit operand to load the register stored by SGDT or SIDT, the upper eight bits are stored as zeros.

LGDT and LIDT appear in operating system software; they are not used in application programs. They are the only instructions that directly load a linear address (i.e., not a segment relative address) in 80386 Protected Mode.
2006-2-16 21:04
0
游客
登录 | 注册 方可回帖
返回
//