【问题标题】:Am I Writing Assembly Or NASM?我在写汇编还是 NASM?
【发布时间】:2011-02-21 21:55:52
【问题描述】:

我受够了这个。一段时间以来,我一直在尝试掌握汇编,但我觉得我正在为我的编译器而不是一种语言编写代码。

我一直在使用this tutorial,但到目前为止它让我感到很痛苦。我正在使用 NASM,这可能是问题所在,但我认为它是最受欢迎的。我只是想学习最通用的汇编形式,所以我决定学习 x86。我不断遇到愚蠢的错误,比如无法增加变量。这是最新的一个:无法使用 div。

mov bx, 0;
mov cx, 0;
jmp start;
 start:
 inc cx;
 mov ax, cx;
 div 3; <-- invalid combination of opcode and operand
 cmp ah,0;
 jz totalvalue;
 mov ax, cx;
 div 5; <-- invalid combination of opcode and operand
 cmp ah, 0;
 jz totalvalue;
 cmp cx, 1000;
 jz end;

 totalvalue:
 add bx,cx;
 jmp start;

jmp end;
 end:
   mov ah,4ch;
   mov al,00;
   int 21h;

我应该更换编译器吗?似乎划分应该是标准的。我是否需要阅读两篇教程(一篇关于 NASM,一篇关于 x86?)。对这个问题有什么具体的帮助吗?

【问题讨论】:

  • NASM 是 x86 机器码的一种汇编语言。所有 x86 asm 语言的共同点是一行 asm 源代码将汇编成一条 x86 机器指令。区别在于指令(非指令行)和用于寻址模式的语法等。其他 ISA(如 ARM)有不同的指令和寄存器名称,甚至某些东西的语法也不同。

标签: assembly x86 nasm a86


【解决方案1】:

这样想:x86 架构实际上只理解机器代码。像 NASM 这样的汇编程序将从汇编转换为机器代码。所以你选择的汇编器真的没有多大关系,只要它做正确的翻译(NASM 做的)。

这类似于是使用javac 还是使用Eclipse 的内置编译器的问题。它们都将编译有效的 Java。我知道汇编器还支持一些额外的宏和类似的东西,但这似乎不适用于这种情况。

此外,NASM site 本身只是将您指向 x86 程序集的英特尔文档,因此您可以确定它不会有某种特殊形式。

现在,我确实找到了这个 site 记录 DIV 指令,它有这样的说法:

80x86 除法指令执行 64/32 分区(80386 及更高版本 仅),32/16 分区或 16/8 分配。这些说明采取 形式:

            div     reg     For unsigned division
            div     mem

            idiv    reg     For signed division
            idiv    mem

            aad             ASCII adjust for division

这样就可以解释你的错误了。 div 的参数可以是寄存器或内存位置,但您要给它一个常量。

【讨论】:

  • 我想补充一点,div 操作码不会接受立即值(这就是它们的名称,而不是“常量”)。如果您正在查看操作码引用,立即操作数由缩写“imm”引用,有时后跟一个大小,例如 32 位的“imm32”,16 位的“imm16”等等。有几个操作码有这样奇怪的要求,但 div 是最烦人的。虽然可能比您需要的更多细节,ref.x86asm.net/coder32.html 将为您提供所有说明和可能的运算符组合。
【解决方案2】:

嗯,您使用的是汇编器编译器的不同方言...手册清楚明确地说明,它的 A86 汇编器是一个共享软件汇编程序包(哎呀,那是很久以前的事了!!!)您最好的选择是改为查看一些 nasm 教程,顺便说一句,here 发布了一个关于最佳 nasm 教程的问题..

x86 汇编器,无论您使用什么,例如 GAS、NASM、A86、TASM、MASM,通常都是相同的,有些可能有额外的语法糖,有些可能没有...

【讨论】:

    【解决方案3】:

    与任何其他语言一样,汇编的一个特点是它部分是由汇编程序定义的。那个“div 5”对我来说似乎很奇怪——但我使用 MASM 学习了汇编,它有不同的语法。根据本教程中的 cmets,该教程使用的汇编程序似乎有一些指令的“隐含”操作数,而 NASM 没有,并且期望 div 指令使用 Intel 语法。

    恕我直言,使用 NASM 会为您提供最好的服务,但要获得一个特定于 NASM 或适合“纯”英特尔语法的教程。 Art of Assembly 这本书是 Intel 语法的一个很好的资源。

    (编辑:如果上面的链接失败,请尝试this,这是上面的链接转发的地方)

    【讨论】:

    • 组装艺术第 2 版也可在 O'Reilly/Safari 书籍中找到
    【解决方案4】:

    英特尔不支持立即参数 div(仅支持寄存器和内存参数),因此无论您使用的教程都是为非标准汇编程序构建的。

    【讨论】:

      【解决方案5】:

      虽然 A86​​ 确实提供了一些语法糖,但立即操作数 div 指令不是其中之一。 div 7 导致 A86 发出错误(#21,错误的单个操作数)。

      我怀疑那个旧教程的作者根本没有测试他们的示例代码。

      最好使用与您的工具相匹配的教程(例如,Paul Carter 为 NASM 编写的 PC 汇编语言)。您可能想查看教科书“8086 微处理器:PC 编程和接口”。它是专门为 A86 编写的,可以在许多在线二手书店以 5 美元左右(2020 年)的价格买到。

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 2011-02-21
        • 2010-10-01
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多