Assembly 博尔兰C++;3.1和TASM-汇编程序未定义符号错误 我在Box Box中使用Borland C++ 3.1(TASM)做一些后退16位计算。
我正在读克里斯托弗·兰普顿(Christopher Lampton)的一本书——《想象花园》(1994)——我把书中的软盘弄丢了 这意味着我必须从页面中写出代码。Assembly 博尔兰C++;3.1和TASM-汇编程序未定义符号错误 我在Box Box中使用Borland C++ 3.1(TASM)做一些后退16位计算。,assembly,tasm,16-bit,Assembly,Tasm,16 Bit,我正在读克里斯托弗·兰普顿(Christopher Lampton)的一本书——《想象花园》(1994)——我把书中的软盘弄丢了 这意味着我必须从页面中写出代码。 到目前为止,一切都很顺利 现在,我要给我的小raycaster添加优化,我添加了fixmul,fixdiv和drawwall,一切都很好 添加drawfloorrow函数后,所有的一切都会丢失( TASM抱怨说,宽度、光索引、xincrement等都是未定义的符号。 这很奇怪,因为我的装配知识非常有限:我不是把它们定义为符号吗 我很困
到目前为止,一切都很顺利 现在,我要给我的小raycaster添加优化,我添加了
fixmul
,fixdiv
和drawwall
,一切都很好
添加drawfloorrow
函数后,所有的一切都会丢失(
TASM抱怨说,宽度
、光索引
、xincrement
等都是未定义的符号。这很奇怪,因为我的装配知识非常有限:我不是把它们定义为符号吗 我很困惑 我对汇编几乎一无所知,所以如果有几位资深的汇编程序员能发现我的错误,我会很高兴的 此代码开始出现错误:
mov [width],bx
免责声明:评论中有人说我不知道什么是符号。我当然喜欢。:)我只是不知道如何在汇编中创建它们。
我在C和C++中以及其他语言中一直创建符号。 编辑: 是否ASM源代码文件缺少数据段
要点:这似乎是一个必须与其他库和主程序链接在一起的库。我想缺失的符号是在另一个模块中定义的。EXTRN声明一个外部符号 加
到源代码的开头,就不会再有错误了。然后,您必须找出符号所在的位置。这似乎是一个必须与其他库和主程序链接在一起的库。我想缺失的符号是在另一个模块中定义的。EXTRN声明一个外部符号 加
到源代码的开头,就不会再有错误了。然后您必须找出符号所在的位置。问题在于ASM源文件需要一个数据段,因此-在RossRidge和rkhb的帮助下-以下是文件顶部缺少数据部分的摘录:
.MODEL large
.DATA
yincrement dd 0
.DATA?
wwidth dw ?
lightindex dd ?
rownum dw ?
colnum dw ?
xincrement dd ?
texture dd ?
botptr dd ?
textureptr dd ?
.CODE
.386
PUBLIC _fixmul,_fixdiv,_drawwall
PUBLIC _drawfloorrow
_fixmul PROC
ARG arg1:DWORD, arg2:DWORD
[...]
问题在于ASM源文件需要一个数据段,因此在RossRidge和rkhb的帮助下,下面是文件顶部缺少数据部分的摘录:
.MODEL large
.DATA
yincrement dd 0
.DATA?
wwidth dw ?
lightindex dd ?
rownum dw ?
colnum dw ?
xincrement dd ?
texture dd ?
botptr dd ?
textureptr dd ?
.CODE
.386
PUBLIC _fixmul,_fixdiv,_drawwall
PUBLIC _drawfloorrow
_fixmul PROC
ARG arg1:DWORD, arg2:DWORD
[...]
我在代码中没有看到将
width
定义为符号的任何地方。该指令要求在其他地方定义width
,以便它知道应该位于何处。该定义通常也会为width
分配空间。解决这一错误的简单方法是删除该指令和以前的mov bx,w
指令。然后将后面的cmp bx[width]
更改为cmp bx,w
。换句话说,直接使用参数w
,而不是将其复制到不存在的内存位置。。。不,这不起作用,因为代码稍后会更改BP,这是访问参数w
所必需的。不幸的是,这种情况经常发生。实际上,书中的代码没有错误更奇怪。我在代码中没有看到将宽度
定义为符号的任何地方。该指令要求在其他地方定义宽度
,以便它知道它应该位于何处。该定义通常也会为width
分配空间。解决这一错误的简单方法是删除该指令和以前的mov bx,w
指令。然后将后面的cmp bx[width]
更改为cmp bx,w
。换句话说,直接使用参数w
,而不是将其复制到不存在的内存位置。。。不,这不起作用,因为代码稍后会更改BP,这是访问参数w
所必需的。不幸的是,这种情况经常发生。事实上,书中的代码没有错误更奇怪。谢谢你的有力提示!它们在内部使用,问题是(我相信)ASM源文件需要一个数据段。@jacmoe:.DATA段不能存在于每个源文件中。它可以在另一个模块中。所有.DATA段都将链接到单个.DATA段。如果在此处定义符号,则在重新定义符号的链接阶段可能会出现错误。然而,这是推测。我不知道这本书。正式注明-谢谢!:)目前只有一个模块-使用内置ASM进行VGA等@jacmo:当您看到典型的德语错误“must't”时,请考虑“needon't”。谢谢。谢谢你的有力提示!它们在内部使用,问题是(我相信)ASM源文件需要一个数据段。@jacmoe:.DATA段不能存在于每个源文件中。它可以在另一个模块中。所有.DATA段都将链接到单个.DATA段。如果在此处定义符号,则在重新定义符号的链接阶段可能会出现错误。然而,这是推测。我不知道这本书。正式注明-谢谢!:)目前只有一个模块-使用内置ASM进行VGA等@jacmo:当您看到典型的德语错误“must't”时,请考虑“needon't”。谢谢
.MODEL large
.DATA
yincrement dd 0
.DATA?
wwidth dw ?
lightindex dd ?
rownum dw ?
colnum dw ?
xincrement dd ?
texture dd ?
botptr dd ?
textureptr dd ?
.CODE
.386
PUBLIC _fixmul,_fixdiv,_drawwall
PUBLIC _drawfloorrow
_fixmul PROC
ARG arg1:DWORD, arg2:DWORD
[...]