内存组件中的开关输入位置

switch input place in the memory assembly

我需要在一个过程中对数组进行排序,并且最小的数字应该与第一个数字交换它的位置。比第二个较小的数字和第二个数字等等...我刚刚在 ds:0000

中写了 00 00 00 00
proc min
    push bx
    push ax
    mov si,bx 
    inc bx
    checkminnum: ; the outer loop for checking all the numbers
        mov al, [byte ptr si]
        cmp [byte ptr bx] , al
        jb smaller 
            mov si, bx; the offset of the smaller num is saved in si
        smaller:
        inc bx
        cmp [byte ptr bx], '$' ; check when the loop should end
    jne checkminnum
    pop ax
    pop bx
ret
endp min

proc swap
    push bx
    mov bx, offset array
    repos:
        call min
        mov al, [byte ptr bx]
        push ax
        mov al, [byte ptr si]
        mov [byte ptr bx], al
        pop ax
        mov [byte ptr si], al
        inc bx
        cmp [byte ptr bx], '$'
    jne repos
    pop bx
ret 
endp swap

min 过程出现以下两个错误:

  • 您使用的条件与找到最小值所需的条件相反。
  • 您的代码将在其最后一次迭代中将 $- 终止符视为数组元素。您必须检查终止符 before 与以下数组元素进行比较,因为所述元素可能不存在。

代码所做的是升序插入排序。

; IN (bx) OUT (al='$',si) MOD ()
proc min
    push bx
  SetMin:
    mov  si, bx    ; Position of minimum
  Cont:
    inc  bx
    mov  al, [bx]
    cmp  al, '$'
    je   Done
    cmp  al, [si]  ; Compare with current minimum
    jb   SetMin    ; Smaller, so record position
    jmp  Cont      ; Not smaller, so just continue
  Done:
    pop  bx
    ret
endp min

swap过程中,如果最小值的位置等于数组的当前前面,最好根本不交换元素。
而不是使用堆栈并使用单个寄存器 AL,而是使用额外的寄存器,如 CLDL 以提高效率。

; IN () OUT () MOD (al,cl,dl)
proc swap
    push bx
    push si
    mov  bx, offset array
  More:
    call min       ; -> AL='$' SI
    cmp  si, bx
    je   Skip
    mov  cl, [bx]
    mov  dl, [si]
    mov  [bx], dl
    mov  [si], cl
  Skip:
    inc  bx
    cmp  [bx], al  ; AL='$'
    jne  More
    pop  si
    pop  bx
    ret 
endp swap

使用终止符处理数组的一个缺点是值 36($ 字符的 ASCII 代码)不能出现在数组本身中。