纳斯姆错误;未定义的标签

时间:2016-11-18 17:06:14

标签: assembly windows-10 nasm assemble

这段时间我正在努力学习装配。我使用ms-dos“debug”命令来创建简单的程序,但现在我想制作大型程序。我下载了nasm并尝试汇编以下代码:

#include <type_traits>

struct BaseA { static constexpr int va = 111; };
struct BaseB { static constexpr int vb = 222; };

struct C : public BaseA {};
struct D : public BaseB {};

template<typename T>
struct Outer {
  template<typename, int selector> struct InnerImpl;

  template<typename S> struct InnerImpl<S, 1> { static constexpr int v = T::va; };
  template<typename S> struct InnerImpl<S, 2> { static constexpr int v = T::vb; };

  static constexpr int computeSelector() {
    // Could be less horrible with C++14 constexpr functions
    // std::is_base_of acts as a demo of complex compile-time conditions
    return std::is_base_of<BaseA, T>::value + std::is_base_of<BaseB, T>::value * 2;
  } // **1

  template<typename S> using Inner = InnerImpl<S, computeSelector()>;
};

但是在标签.model和.code中它表示它们未定义。我在其他几个汇编程序中再次尝试了这一点,并且发生了同样的事情。任何人都可以帮我解决这个问题吗? 我使用的是Windows 10。

1 个答案:

答案 0 :(得分:2)

您的程序的Nasm语法:

segment code 
..start: 
mov ax, bx

特殊符号..start标记程序的入口点。 Here是一本关于在Nasm中编写16位代码的好手册

关于.model small - 在Nasm中没有内存模型,来自http://www.nasm.us/doc/nasmdoc2.html的文档中的内容模型:

  

NASM也没有任何指令支持不同的16位   记忆模型。程序员必须跟踪哪些功能   应该用远程呼叫呼叫,并且近呼叫,和   负责输入正确形式的RET指令(RETN   或RETF; NASM接受RET本身作为RETN的替代形式);在   此外,程序员负责编码CALL FAR   调用外部函数时必要的说明,必须   还要跟踪哪些外部变量定义是远的   它们就在附近。

我建议你阅读Nasm documentation - 你的大部分问题都有答案。