操作码和操作数的组合无效

问题描述 投票:0回答:1

我已经编写了使用冒泡排序对数组进行排序的汇编程序。我收到错误。这是完整的代码

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
assembly nasm dosbox
1个回答
0
投票

此错误仅表示最左侧操作数(目标)的大小不等于最右侧操作数(源)的大小。

在您的程序中,最简单的解决方法是声明 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
© www.soinside.com 2019 - 2024. All rights reserved.