我正在尝试为我的Architecture类编写一个程序,它将循环遍历字符串的字符,但我的循环不起作用,我不知道为什么。它一直给我错误:'mov'的内存引用太多了。
mov $10,AL
top:
~~STUFF~~
dec AL
jnz top
next:
是的我知道这样的问题都在互联网上。我只是在尝试所有的东西时遇到同样的错误,而且我没有留下世界上所有的时间。我将10移动到AL注册表中,我将顶部设置为我的跳转点,并且我使用了jnz,如果不等于零则跳转到右边?我做错了什么?
答案 0 :(得分:2)
假设此程序集采用AT& T语法,mov $10,AL
表示“将立即10
移动到标签AL
指定的内存位置”。同样适用于dec AL
,但还有另一个问题:你没有指定操作数的大小,而汇编程序无法知道AL
是指向一个字节,一个字,一个双字,或四字(虽然有些HLA这样做,AFAIK)。因此,您需要指定操作数的大小。在AT& T语法中,这是通过在指令助记符上附加后缀来完成的:b
表示字节,w
表示单词,d
表示双字,q
表示双字
另一方面,寄存器以AT& T语法中的%
符号作为前缀:因此,如果您想使用al
寄存器作为指示,则应编写{{ 1}}和mov $10, %al
。请注意在这些情况下您不需要操作数大小后缀:汇编程序可以根据您要使用的寄存器的大小来处理它们。但是,无论如何,我总是鼓励附加后缀:因此,写下dec %al
和movb $10, %al
,你就会好起来。
答案 1 :(得分:0)
我不确定您的错误与您显示的代码有关:
在x86上,MOV
无法将任何内容直接从内存移动到内存,您必须将数据存储在两者之间的寄存器中。您收到的错误似乎表明您在代码中的某处尝试了MOV MEM, MEM
。