Assembly 博尔兰C++;3.1和TASM-汇编程序未定义符号错误 我在Box Box中使用Borland C++ 3.1(TASM)做一些后退16位计算。

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等都是未定义的符号。 这很奇怪,因为我的装配知识非常有限:我不是把它们定义为符号吗 我很困

我正在读克里斯托弗·兰普顿(Christopher Lampton)的一本书——《想象花园》(1994)——我把书中的软盘弄丢了

这意味着我必须从页面中写出代码。
到目前为止,一切都很顺利

现在,我要给我的小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
[...]