一个小程序

iamroc 2004-11-12 04:41:12
.model small
.stack
.data
org 100h
varw dw 1234h,5678h
varb db 3,4
vard dd 12345687h
buff db 10 dup(?)
mess db 'hello'
.code
start: mov ax,@data
mov ds,ax
mov ax,offset varb + offset mess ax=?
mov ax,type buff + type mess + type vard ax=?
mov ax,sizeof varw + sizeof buff + sizeof mess ax=?
mov ax,lengthof varw + lengthof vard ax=?
mov ax,4c00h
int 21h
end start
这是书上的例题,我打成程序,可在MASM6下无法通过编译,提示“error A2101:cannot add two relocatable labels”
到底是怎么回事?
...全文
298 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamroc 2004-11-14
  • 打赏
  • 举报
回复
大概了解了,我现在接触的不深,估计这些慢慢才能真正明白,谢谢clumsy
clumsy 2004-11-14
  • 打赏
  • 举报
回复
一是由于可能需要不同的模块组合一起创建最后的 .exe 文件, 这样的话, 单个模块里的某个变量的最后的偏移地址就和链接时模块的顺序直接相关了, 所以, 在编译时是不能完全确定的, 能确定的只是这个变量在当前模块相应段中的偏移地址. 另外, 不同的编译程序对 .data 的处理也不尽相同, 象你的那个代码, Masm5 创建的 .obj 中的 varw 的偏址是 0100h, 但如果用 Masm6.x 编译的话, 它会在你的实际数据前面填入一些 00 字节, varw 的偏址就不是 100h 了, 而可能是 0106h 或者是 0108h
iamroc 2004-11-14
  • 打赏
  • 举报
回复
谢谢,但还是不太明白怎么回事,为什么offset varb 和 offset mess, 在编译的时候是无法完全确定的?
awcx 2004-11-12
  • 打赏
  • 举报
回复
我也明白了
clumsy 2004-11-12
  • 打赏
  • 举报
回复
offset varb 和 offset mess, 在编译的时候, 都是无法完全确定的, 所以, 两者不能直接相加. 但相减是可以的, 为什么呢? 因为 varb 和 mess 间的相互位置之可以确定的.

21,458

社区成员

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

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