循环x86程序集

时间:2014-01-31 03:58:01

标签: assembly x86

我正在尝试为我的Architecture类编写一个程序,它将循环遍历字符串的字符,但我的循环不起作用,我不知道为什么。它一直给我错误:'mov'的内存引用太多了。

    mov $10,AL
    top:
    ~~STUFF~~
    dec AL
    jnz top

    next:

是的我知道这样的问题都在互联网上。我只是在尝试所有的东西时遇到同样的错误,而且我没有留下世界上所有的时间。我将10移动到AL注册表中,我将顶部设置为我的跳转点,并且我使用了jnz,如果不等于零则跳转到右边?我做错了什么?

2 个答案:

答案 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 %almovb $10, %al,你就会好起来。

答案 1 :(得分:0)

我不确定您的错误与您显示的代码有关: 在x86上,MOV无法将任何内容直接从内存移动到内存,您必须将数据存储在两者之间的寄存器中。您收到的错误似乎表明您在代码中的某处尝试了MOV MEM, MEM