内存组件中的开关输入位置
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
,而是使用额外的寄存器,如 CL
和 DL
以提高效率。
; 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 代码)不能出现在数组本身中。
我需要在一个过程中对数组进行排序,并且最小的数字应该与第一个数字交换它的位置。比第二个较小的数字和第二个数字等等...我刚刚在 ds:0000
中写了 00 00 00 00proc 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
,而是使用额外的寄存器,如 CL
和 DL
以提高效率。
; 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 代码)不能出现在数组本身中。