《80X86汇编语言程序设计教程》保护模式部分一例汇编不过去,望高手帮忙

mie 2003-03-05 08:22:15
演示任务内有特权级变换的转移的那段代码,汇编产生如下错误
---------- 汇编 (16位) ----------
Invalid keyboard code specified
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: e.ASM
**Error** e.ASM(50) Offset or pointer is 32-bit
**Error** e.ASM(52) Offset or pointer is 32-bit
**Error** e.ASM(54) Offset or pointer is 32-bit
**Error** e.ASM(74) Offset or pointer is 32-bit
**Error** e.ASM(76) Offset or pointer is 32-bit
**Error** e.ASM(78) Offset or pointer is 32-bit
*Warning* e.ASM(193) Operand size conflict
*Warning* e.ASM(195) Operand size conflict
Error messages: 6
Warning messages: 2
Passes: 1
Remaining memory: 436k

Normal Termination
输出完成(耗时 0 秒)。
...全文
255 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearfly1980 2003-03-22
  • 打赏
  • 举报
回复
哦!!!我用的是TASM5.0,TLINK!!!
呵呵!!!!
bearfly1980 2003-03-22
  • 打赏
  • 举报
回复
呵呵!!!我前天去找了一段Linux的setup.s的代码!!!!!再加上以前写的就可以了!!!!
主要是empty_8042的时候有点问题!!!!用Linux的代码就可以了!!!!
还有跳转到32位段是最好用硬编码!!!就是用DB/DW!!!!
hehe
bearfly1980 2003-03-07
  • 打赏
  • 举报
回复
这个程序我以前试过!!!好像编译通过之后还是运行不起来!!!!机器会重启!!!好像是全局表分配有问题!!!我想需要手动计算地址!!!!!!
mie 2003-03-07
  • 打赏
  • 举报
回复
wobuzai(我不在)
DemoCodeLen = $
1. 这时的DemoCodeLen应该理解为常数吧.
2. 只知道变量和标号有三种属性,这种形式的常数也有如?请问如何改变这种形式的常数的类型属性,使它成为16位
3. 还有我用MASM ASM4.ASM时出现了下面的情况:

Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993. All rights reserved.

Invoking: ML.EXE /I. /Zm /c /Ta ASM4.ASM

error A2901 : cannot run ML.EXE

这是怎么回事,如何解决?
4. /Ta是什么意思?
以上四个问题请帮忙解决.然后在我的所有相关贴子中回复,然后我好结贴.

mie 2003-03-07
  • 打赏
  • 举报
回复
谢谢,我也知道改为一个常数可以,但要手工计算.
我现在想问问有没有什么伪指令可以强制32位数DemoCodeLen为16位的,也好让我在16位段中使用它.ptr和this好像都不能用在这.
还有我想问问像DemoCodeLen这种表示形式的是不是也叫常数.
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
前3个错误发生的地方都改为常数0ffffh,用MASM编译:
D:\t>MASM ASM4.ASM
Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993. All rights reserved.

Invoking: ML.EXE /I. /Zm /c /Ta ASM4.ASM

Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.

Assembling: ASM4.ASM

D:\t>
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
有办法的,把它改为一个常数,程序会正常运行。
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
如果你的MASM.EXE,ML.EXE是在C:\MASM611\BIN下的话,就设PATH=%PATH%;C:\MASM611\BIN
mie 2003-03-07
  • 打赏
  • 举报
回复
1.路径没有设置好?
如何设置,在哪设置?
2.谁知道,如何强制这种形式的常数DemoCodeLen为16位,难道真的没有这种伪指令或其它方法吗?
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
1,你的路径没有设置好。
2,我也不知道,可能不行。
mie 2003-03-07
  • 打赏
  • 举报
回复
谢谢1
1.但是我的masm611\bin下有masm和ml等所有文件呀
2.我最想知道如果在tasm5中通过这程序,能不能强制这种形式的常数DemoCodeLen为16位
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
这个程序是没有问题的,可以正确运行的.
wobuzai 2003-03-07
  • 打赏
  • 举报
回复
这个确实是常数,但它是在32位段中,我说的改为常数是改为0xFFFF
你的MASM目录下没有ML.EXE这个文件.
mie 2003-03-07
  • 打赏
  • 举报
回复
谁帮忙回答我最后一次回复的四个问题.然后我要结贴了.
mie 2003-03-06
  • 打赏
  • 举报
回复
好像就是说如何把32位的操作数在16位段中应用
al2913 2003-03-06
  • 打赏
  • 举报
回复
up
mie 2003-03-06
  • 打赏
  • 举报
回复
谢谢,那请问如果要用TASM5.0的话,有没有办法能汇编这段程序.
wobuzai 2003-03-06
  • 打赏
  • 举报
回复
用TASM 3.1就可以编译过去.

D:\T>tasm asm4.asm
Turbo Assembler Version 3.1 Copyright (c) 1988, 1992 Borland International

Assembling file: asm4.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 407k


D:\T>
mie 2003-03-06
  • 打赏
  • 举报
回复
platinum309(白金)
老兄!书上的例子总要试试吧
cui(蚊子王)
这段程序是因为在16位段中出现了32位的偏移或操作数,我现在不知道用什么伪指令可以强制32位偏移或操作数

为16位偏移或操作数.从而能在16位段中用它.
但这里的是个常数
DemoCodeLen = $
因为这条语句在32位段DemoCodeSeg中定义,所以DemoCodeLen就成了32位的,在16位段DemoLDTSeg中用就出现了

error:Offset or pointer is 32-bit
现在不知道如何强制DemoCodeLen为16位.
怪了,书上的程序竟然过不去!书上指定用5.0的
蚊子王 2003-03-06
  • 打赏
  • 举报
回复
用3.0或3.1的tasm来试试看,不要用太高版本的tasm
加载更多回复(8)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧