Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 我的bubble代码在汇编语言中正确吗?_Assembly_X86 16_Emu8086 - Fatal编程技术网

Assembly 我的bubble代码在汇编语言中正确吗?

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

您的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       ;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