2014-01-31 3 views
-3

Я пытаюсь написать программу для моего класса Architecture, которая будет проходить через символы строки, но мой цикл не работает, и я не уверен, почему. Он продолжает давать мне ошибку: слишком много ссылок на память для «mov».Loop x86 Assembly

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

    next: 

Да, я знаю такие вопросы, как это происходит через Интернет. Я просто продолжаю получать те же ошибки со всем, что я пробую, и у меня нет времени в мире. Я переместил 10 в реестр AL, я установил вершину в качестве точки возврата перехода, и я использовал jnz, который является прыжком, если он не равен нулю вправо? Что я делаю не так?

+1

Какой ассемблер вы используете? В некоторых ассемблерах (Intel и AT & T) аргумент назначения сначала, поэтому 'mov $ 10, AL' может пытаться переместить' AL' в константу, что является недопустимым. – lurker

+0

Попробуйте 'mov AL, 10h' –

+0

Я использую AT & T Style, я считаю, – user3255768

ответ

0

Я не уверен, что ваша ошибка с кодом, который вы указали: На x86 MOV не может перемещать что-либо непосредственно из памяти в память, вы должны хранить данные в регистре между ними. Похожая ошибка, похоже, указывает на то, что вы попытались найти MOV MEM, MEM где-то в вашем коде.

2

Предположив, что эта сборка находится в AT & T синтаксис, mov $10,AL означает «переместить немедленную 10 в ячейку памяти, указанной на этикетке AL». То же самое касается dec AL, но есть еще одна проблема: вы не указываете размер операнда, и ассемблер не знает, указывает ли AL на байт, слово, двойное слово или квадрат (хотя некоторые HLA делают это, AFAIK). Поэтому вам нужно указать размер операнда. В синтаксисе ATT это делается добавлением суффикса в командную мнемонику: b для байта, w для слова, d для двойного слова и q для квадрата.

Регистры, с другой стороны, с префиксом % знаком в AT & T синтаксис: поэтому, если вы хотите использовать al регистр для инструкций, вы должны иметь письменное mov $10, %al и dec %al. Обратите внимание на то, как вам не нужны суффиксы размера операнда в этих случаях: ассемблер может их выработать на основе размера регистра, который вы хотите использовать. Тем не менее, я всегда поощрял добавление суффикса независимо от этого: поэтому напишите movb $10, %al и decb %al, и вам будет хорошо.