Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 我想在汇编中进行气泡排序,但我不';我不明白为什么';它不工作了_Sorting_Assembly_X86 16_Bubble Sort - Fatal编程技术网

Sorting 我想在汇编中进行气泡排序,但我不';我不明白为什么';它不工作了

Sorting 我想在汇编中进行气泡排序,但我不';我不明白为什么';它不工作了,sorting,assembly,x86-16,bubble-sort,Sorting,Assembly,X86 16,Bubble Sort,我有一个函数“swapByRef”,它在这段代码中工作(这段代码只是检查函数是否交换了值) 但是在我的代码(冒泡排序代码)中,过程不会交换数组中的值,数组也不会被排序 MODEL small STACK 100h DATA SEGMENT ARR dw 9,5,7,3,8 len dw 5 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA start: mov ax, DATA mov ds, ax mov bx, o

我有一个函数“swapByRef”,它在这段代码中工作(这段代码只是检查函数是否交换了值)

但是在我的代码(冒泡排序代码)中,过程不会交换数组中的值,数组也不会被排序

MODEL small
STACK 100h
DATA SEGMENT
ARR dw 9,5,7,3,8
len dw 5
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE, DS:DATA
start:
    mov ax, DATA
    mov ds, ax

    mov bx, offset ARR
sorting:
    mov ax, len
    dec ax
    cmp bx, ax
    je redo
    mov ax, ARR[bx]
    mov dx, ARR[bx+ 2]
    cmp al, ah
    jg swap
    jmp continue
swap:
    push offset [ARR + bx]
    push offset [ARR + bx + 2]
    call swapByRef
continue:
    inc bx
    jmp sorting
redo:
    cmp len, 0
    je exit
    mov ax, len
    dec ax
    mov len, ax
    xor bl, bl
    jmp sorting
exit:
    mov ax, 4c00h
    int 21h

    swapByRef proc
    mov bp, sp
    mov bx, [bp + 2]
    mov ax, [bx]
    mov si, [bp + 4]
    mov cx, [si]
    mov [bx], cx
    mov[si], ax
    ret 4
swapByRef endP
CODE ENDS
END start
我尝试过调试,但仍然无法在代码中找到问题…
任何帮助都会很棒,谢谢

将偏移量添加到数组中两次!您需要初始化
BX=0


您已经阅读了
AX
DX
中的元素。然后还比较
AX
DX

您也可以将其写得更短,如下所示:

    mov ax, ARR[bx]
    cmp ax, ARR[bx+2]
    jng continue
swap:

假设数组包含单词,并且
BX
是数组中的一个偏移量,您需要在第2步中更改
BX
。写入
添加bx,2
而不是
包含bx
。 这也意味着最好设置
len dw 10
,并使用
子词ptr len,2
分步骤修改它


您的swapByRef进程会销毁很多寄存器。尤其是松开BX是有问题的
这是一个不阻塞寄存器的通用解决方案。根据需要进行优化

swapByRef proc
    push bp
    mov  bp, sp
    push ax
    push bx
    push cx
    push si
    mov  bx, [bp + 4]
    mov  ax, [bx]
    mov  si, [bp + 6]
    mov  cx, [si]
    mov  [bx], cx
    mov  [si], ax
    pop  si
    pop  cx
    pop  bx
    pop  ax
    pop  bp
    ret  4

试着更好地调试。还要对代码进行注释。无论如何,有两个问题是显而易见的:
cmpal,ah
如果您的值在
ax
dx
中,则没有什么意义。此外,字是2个字节,因此您应该相应地缩放地址。编写一个实际的swap by ref函数,要求您传递两个地址,这使得BubbleSort在asm中的实现更加困难/复杂。您知道要交换的两个元素彼此相邻,因为这是BubbleSort,所以只需使用在数组中遍历的指针的偏移量和其他几个scratch reg即可。e、 g.这个实现并不糟糕:,另请参见。
 mov ax, ARR[bx]
 mov dx, ARR[bx+ 2]
 cmp al, ah
 jg swap
 jmp continue
swap:
    mov ax, ARR[bx]
    cmp ax, ARR[bx+2]
    jng continue
swap:
swapByRef proc
mov bp, sp
mov bx, [bp + 2]
mov ax, [bx]
mov si, [bp + 4]
mov cx, [si]
mov [bx], cx
mov[si], ax
ret 4
swapByRef proc
    push bp
    mov  bp, sp
    push ax
    push bx
    push cx
    push si
    mov  bx, [bp + 4]
    mov  ax, [bx]
    mov  si, [bp + 6]
    mov  cx, [si]
    mov  [bx], cx
    mov  [si], ax
    pop  si
    pop  cx
    pop  bx
    pop  ax
    pop  bp
    ret  4