这段时间我正在努力学习装配。我使用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。
答案 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 - 你的大部分问题都有答案。