关于16位代码和32位代码的问题

golden_alvin 2002-08-03 10:02:21
假设有这样一个32位代码段
CSEG32 SEGMENT USE32
SPM32:
..............


CODE32LEN = $
CSEG32 ENDS

那么在另一个16位代码段中使用
OFFSET SPM32返回的是多少位的偏移?
另外在这个16位代码段中使用MOV EAX,CODE32LEN-1编译时为什么会出现类型不匹配的错误?

在《80X86汇编语言程序设计教程》中385页的例子中16位代码段中转32位代码段的代码
JUMP16 CODE32_SEL,<OFFSET SPM32>
其中JUMP16是一个宏,定义如下:
JUMP16 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW selector
ENDM

编译不通过,为什么?难道书中的例子有问题么?
...全文
94 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wylpro 2002-08-25
  • 打赏
  • 举报
回复
这种问题我遇见很多了。这也是我极力想编写一个自己的ASM的原因。
ASM的处理是这样的:
16位段中的标号一律是16位的,32位段中的标号一律是32位的。原因是在编译时必须严格计算偏移量与匹配机器码长度否则编译就错了。
所以:
CSEG32 SEGMENT USE32
SPM32:
..............
CODE32LEN = $
CSEG32 ENDS

SPM32 CODE32LEN 都是32位的不可能是16位。
ASM检查,在16位段中不能引用这些标号。否则就会出现16位32位标号混用出错。
这有可能是ASM编译时用标号长度来确定机器码的。(16位段中出现了32位段标号,也就无法确定到底是用16位指令还是32位指令。如果该指令是个CALL SPM32 企不是16位段中出现了32位指令)
但是有些版本并没有这么做所以可以引用但也很有限制。
无论你给谁代码,一定要说明编译器的种类和型号,这是必须的,而且也要在代码中注释出所用编译器,以便日后用。如果书中没有声明,那也就太烂了!
giantzz 2002-08-25
  • 打赏
  • 举报
回复
TO Areslee(易水):你说的不对吧
应该是像他们俩说的,在32位段中,它应是32位,而你说是由寄存器决定,什么寄存器,请保指教!
FlyingSch 2002-08-04
  • 打赏
  • 举报
回复
那个段你用了USE32所以OFFSET SPM32返回32位的。
编译出错,你最好同时有TASM和MASM。
Areslee 2002-08-03
  • 打赏
  • 举报
回复
OFFSET SPM32返回的是多少位的偏移要看你用的寄存器而定,32位寄存器就是32位,反之则是16位。

书上的例子好象是TASM编译的

21,459

社区成员

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

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