我需要对数组进行排序,并将数组中的每一行按升序排序。我似乎没那么好(惊喜!),因为我不断遇到两个错误:
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
感谢您的帮助。
答案 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等)。
另外,我真的希望这是一个练习,而不是一个真正的项目。如果是真的,请重新考虑使用装配。对于像这样微不足道的事情,汇编是错误的,错误的选择。爱斯佩克。考虑到你有多糟糕。