我已经编写了使用冒泡排序对数组进行排序的汇编程序。我收到错误。这是完整的代码
org 100h
section .data
array db 5, 3, 7, 1, 4, 9, 2, 8, 6
array_size db 9
new_line db 0xA
comma db ','
section .bss
temp resb 1
output resb 2
section .text
start:
mov al, [array_size]
dec al
mov cl, al
bubble_sort:
xor bx, bx
outer_loop:
cmp bx, cl
jge done
xor si, si
inner_loop:
mov al, [array_size]
sub al, bl
cmp si, al
jge next_outer_loop
mov al, [array + si]
mov dl, [array + si + 1]
cmp al, dl
jle next_esi
mov [temp], al
mov [array + si], dl
mov al, [temp]
mov [array + si + 1], al
next_esi:
inc si
jmp inner_loop
next_outer_loop:
inc bx
jmp outer_loop
done:
xor si, si
print_loop:
mov al, [array + si]
add al, '0'
mov [output], al
mov ah, 09h
lea dx, [output]
int 21h
inc si
mov al, [array_size]
cmp si, al
jge print_loop
为什么 NASM 给我这个错误? 第 23 行错误:操作码和操作数的组合无效 第 31 行错误:操作码和操作数的组合无效 第 66 行错误:操作码和操作数的组合无效
cmp bx, cl
cmp si, al
cmp si, al
此错误仅表示最左侧操作数(目标)的大小不等于最右侧操作数(源)的大小。
在您的程序中,最简单的解决方法是声明 array_size 一个 16 位数量:
array_size dw 9
,当然还要加载到 AX!
mov [temp], al mov [array + si], dl mov al, [temp] mov [array + si + 1], al
请注意,对于交换部分,您不需要 temp 变量:
mov [array + si], dl
mov [array + si + 1], al