在数组排序中使用相对值(asm)

时间:2011-03-06 16:19:20

标签: visual-c++ masm

我需要对数组进行排序,并将数组中的每一行按升序排序。我似乎没那么好(惊喜!),因为我不断遇到两个错误:

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 个答案:

答案 0 :(得分:2)

以下几行存在问题:

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等)。

另外,我真的希望这是一个练习,而不是一个真正的项目。如果是真的,请重新考虑使用装配。对于像这样微不足道的事情,汇编是错误的,错误的选择。爱斯佩克。考虑到你有多糟糕。