Assembly 我的bubble代码在汇编语言中正确吗?
您的BubbleSort很好,但是如果它能够处理一个只包含一个元素甚至零个元素的数组,则可以使它更加安全Assembly 我的bubble代码在汇编语言中正确吗?,assembly,x86-16,emu8086,Assembly,X86 16,Emu8086,您的BubbleSort很好,但是如果它能够处理一个只包含一个元素甚至零个元素的数组,则可以使它更加安全 用于测试此功能的代码可以与外部环路逻辑结合使用: org 100h .Model SMALL .Stack .Data Ar DB 06h,05h,04h,02h Len DW ($-Ar) .CODE Mov Ax,@Data Mov Ds,Ax Mov Bx,Len ;length of the array Dec Bx ;to
用于测试此功能的代码可以与外部环路逻辑结合使用:
org 100h
.Model SMALL
.Stack
.Data
Ar DB 06h,05h,04h,02h
Len DW ($-Ar)
.CODE
Mov Ax,@Data
Mov Ds,Ax
Mov Bx,Len ;length of the array
Dec Bx ;total number of passes ( n-1)
Nxtpass:
Mov Cx,Bx ;total number of comparison
Mov Si,0 ;index=0
Nxtcomp:Mov Al,Ar[Si] ;read 1st number
Inc Si ;update pointer
Cmp Al,Ar[Si] ;compare 1st number with 2nd number
Jb No_EXCG ;if same , noexchange
XCHG Al,Ar[Si]
Mov Ar[Si-1],Al ; do exchange
No_EXCG:loop Nxtcomp ;repeat until comparison
Dec Bx
JNZ Nxtpass ;repeat untill pass = 0;
ret
如果没有元素,则子bx,1
指令将使CF=1 aka“低于”。如果只有1个元素,
sub bx,1
指令将使ZF=1 aka“相等”。jnbe Nxtpass
指令将仅在“NeitherBelowNorEqual”(也称为“Upper”)条件下跳转
这个评论有误导性!交换元素可以在“下方”上跳过,但也可以在“相等”上跳过。最好使用jbe No_EXCG
编程风格是个人化的,但用大写字母书写助记符和注册名称是非常非常不寻常的
Cmp Al,Ar[Si] ;compare 1st number with 2nd number
Jb No_EXCG ;if same , noexchange
“我的代码正确吗”对于这个网站来说是一个太宽泛的问题。你在各种数据上测试过吗?你知道有什么错误吗?您是否不确定代码的某个特定部分?为什么希望代码在偏移量
100h
处生成?这是典型的CP/M程序,它以指向PSP的CS=DS=ES=SS开始,不希望对段寄存器进行任何操作。另请参阅。如果您已经对此进行了测试(例如,在调试器中),并且您认为它可以正常工作,那么如果您正在查找是否有关于它编写得有多好的反馈,您可以将其发布在上。(例如,您的循环很紧凑,底部有分支条件,不会浪费push/pop上的指令来对两个循环使用循环
,或者任何类似的愚蠢操作。因此,对于8086来说,它可能是相当有效的,但是在现代x86上,使用mem的xchg将非常慢:隐式锁
)你为什么要实施最糟糕的排序算法呢?
Cmp Al,Ar[Si] ;compare 1st number with 2nd number
Jb No_EXCG ;if same , noexchange
.Model SMALL
.Stack
.Data
Ar db 06h, 05h, 04h, 02h
Len equ $-Ar
.Code
mov ax, @Data
mov ds, ax
mov bx, Len
jmp Start
Nxtpass:
mov cx, bx
xor si, si
Nxtcomp:
mov al, Ar[si]
inc si
cmp al, Ar[si]
jbe No_EXCG
xchg al, Ar[si]
mov Ar[si-1], al
No_EXCG:
loop Nxtcomp
Start:
sub bx, 1
jnbe Nxtpass
ret