我是在编写汇编程序还是NASM?

问题描述 投票:3回答:4

我受够了。我已经尝试了一段时间了,但是我觉得我正在针对我的编译器而不是语言进行编码。

我一直在使用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上?)。关于此问题有任何具体帮助吗?

assembly nasm
4个回答
7
投票

与其他语言一样,关于汇编的一件事是它部分地由汇编程序定义。 “ div 5”对我来说似乎很奇怪-但是我使用MASM学习了汇编,它具有不同的语法。根据本教程中的注释,看起来该教程使用的汇编器为指令提供了一些“隐式”操作数,而NASM没有,并且期望div指令采用Intel语法。

恕我直言,使用NASM可以为您提供最好的服务,但您可以获取特定于NASM或适用于“纯”英特尔语法的教程。 Art of Assembly这本书是有关Intel语法的很好的参考资料。

((编辑:如果上面的链接失败,请尝试this,这是上面的链接转发的位置]


8
投票

这样想:x86架构实际上只了解机器代码。诸如NASM之类的汇编程序将从汇编代码转换为机器代码。因此,只要选择正确的翻译程序(NASM会这样做),您对汇编程序的选择实际上就没多大关系。

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

此外,NASM site本身只是将您引向了x86汇编的英特尔文档,因此您可以确定它不期望使用某种特殊形式。

现在,我确实找到了记录DIV指令的site,它的意思是:

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的参数可以是寄存器或内存位置,但您可以给它一个常量。


6
投票

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


2
投票

嗯,您使用的是汇编程序编译器的另一种方言……该手册明确明确地指出,它的A86汇编程序是一个共享汇编程序包(很久以前!!!)您最好的选择是而是查看一些nasm教程,偶然地有一个关于最佳nasm教程的问题here

x86汇编程序,无论您使用什么,例如GAS,NASM,A86,TASM,MASM都大体相同,有些可能带有多余的语法糖,有些则可能不是...

© www.soinside.com 2019 - 2024. All rights reserved.