Использование относительных значений в сортировке массива (asm) - PullRequest
1 голос
/ 06 марта 2011

Мне нужно отсортировать массив и отсортировать каждую отдельную строку в массиве в порядке возрастания.Мне кажется, что дела идут не так хорошо (удивительно!), Так как меня продолжают поражать две ошибки:

a2101: невозможно добавить две перемещаемые метки и a2026: ожидаемая константа

Вот мой вид,это имеет смысл для меня, но я думаю, что я все еще пытаюсь внедрить методики языка высокого уровня в ассемблер.Есть ли способ обойти невозможность использования относительных значений?(массив состоит из 7 строк по 9 столбцов, кстати).

mov cx, 7; cx = number of rows

outer: ; outer loop  walk through the rows

  push cx 
  mov cx, 9
  mov row, cx ;rows

    middle: ; middle-loop walk through the columns

      push cx
      sub cx, 1  ;cx = cx-1
      mov column, cx  ;columns
          inner:  ;inner loop - compare and exchange column values

                  cmp mArray[row*9 + column], mArray[row*9 + column+1]
                  xchg mArray[row*9 + column+1], mArray[row*9 + column]
                  ; compare and exchange values from mArray table
                  inc column
          loop inner

      pop cx
    loop middle ;end middle loop

  pop cx
 loop outer ; end outer loop

ret

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 06 марта 2011

Следующие строки проблематичны:

cmp mArray[row*9 + column], mArray[row*9 + column+1]
xchg mArray[row*9 + column+1], mArray[row*9 + column]

В отличие от HLL, сборка НЕ ​​допускает произвольных выражений вместо констант или переменных.Вот почему HLL были изобретены в первую очередь.Рассчитайте смещение в регистрах перед использованием:

mov ax, row
mov bx, ax
shr bx, 3 ; bx = row*8 now
add bx, ax ; bx = row*9 now
add bx, column ; bx = row*8+column now
mov dx, [bx] ;first comparand
inc bx
cmd dx, [bx] ; that's your compare!

Кроме того, вы не используете ветвления;инструкция cmp абсолютно бессмысленна;вы теряете его результат, а xcng не выполняется условно.Читайте о командах условного перехода (jz / jnz и т.Если это по-настоящему, пожалуйста, пересмотрите использование сборки.Для чего-то столь же тривиального, как это, сборка - неправильный, неправильный выбор.Espec.учитывая, насколько ты в этом плох.

...