4

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

我一直在使用这个教程,到目前为止它让我很痛苦。我正在使用 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?)。对这个问题有什么具体帮助吗?

4

5 回答 5

10

可以这样想:x86 架构实际上只理解机器代码。像 NASM 这样的汇编程序将从汇编转换为机器代码。因此,您选择的汇编器实际上并不重要,只要它进行正确的翻译(NASM 就是这样做的)。

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

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

现在,我确实找到了这个记录 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

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

于 2010-05-20T14:37:50.163 回答
7

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

于 2010-05-20T14:41:24.620 回答
5

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

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

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

于 2010-05-20T14:40:11.520 回答
1

嗯,您使用的是汇编器编译器的不同方言...手册明确指出,它的 A86 汇编器是一个共享软件汇编程序包(哎呀,这是很久以前的事了!!!)您最好的选择是检查取而代之的是一些 nasm 教程,顺便说一下,这里发布了一个关于最佳 nasm 教程的问题。

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

于 2010-05-20T14:38:36.747 回答
1

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

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

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

于 2020-03-26T23:29:26.433 回答