+ -
当前位置:首页 → 问答吧 → 写了个冒泡排序, 有点小小小问题

写了个冒泡排序, 有点小小小问题

时间:2010-11-29

来源:互联网

我的Sort子程序那样子写法, 哪里问题哦, 个人觉得无错, 可惜就是错的, 我汇编基础不是很好, 之前看书有点囫囵吞枣了, 现在写出来的程序问题不大, 但是很恼人, 废话不说了, 请教指出错误

Assembly code


; Template for DOS .exe file

assume cs:code, ds:data, ss:stack

;**********************************************
data segment
    array    db 2, 3, 5, 2, 4, 3, 7, 8, 9, 1
data ends
;**********************************************

stack segment
    db 1024 dup (?)
stack ends

code segment

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Main
;功能: 冒泡排序
;入口: 无
;出口: al(返回dos)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;for (i = 9; i > 0 && bChange; --i)
;{
;    bChange = 0;
;    for (j = 0; j < i - 1; ++j)
;    {
;        if ( array[j] > array[j + 1] )
;        {
;            //交换
;            bChange = 1;
;        }
;    }
;}


Main    Proc
start:    call    Init
    
    call    Sort
    
    call    Result
    call    Pause
    mov    al, 0h
    call    Exit
    ret
Main    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Init
;功能: 初始化
;入口: 无
;出口: 无
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Init    Proc
    mov    ax, data
    mov    ds, ax
    mov    ax, stack
    mov    ss, ax
    ret
Init    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Exit
;功能: 返回dos
;入口: al(返回值)
;出口: al
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Exit    Proc
    mov    ah, 4ch
    int    21h    
    ret
Exit    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Show
;功能: 显示一个字符
;入口: dl
;出口: 无
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Show    Proc
    push    ax
    mov    ah, 02h
    int    21h
    pop    ax
    ret
Show    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Pause
;功能: 暂停一下
;入口: 无
;出口: 无
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Pause    Proc
    push    ax
    mov    ah, 1h
    int    21h
    pop    ax
    ret
Pause    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Result
;功能: 输出结果
;入口: 无
;出口: 无
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Result    Proc
    push    si
    push    di
    push    cx
    push    dx
    
    mov    si, 0
    mov    cx, 10
    
lSho:    mov    dl, array[si]
    or    dl, 30h
    call    Show
    mov    dl, ' '
    call    Show
    inc    si
    loop    lSho
    
    pop    dx
    pop    cx
    pop    di
    pop    si
    ret
Result    EndP

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;名称: Sort
;功能: 冒泡排序算法
;入口: 无
;出口: 无
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Sort    Proc
    
    mov    si, 9        ;i=9
oLoop:    cmp    si, 0
    jge    OExt
    
    mov    di, 0        ;j=0
    mov    dx, si
    dec    dx
iLoop:    cmp    di, dx
    jle    Inext
    mov    dl, [array + di]
    xchg    dl, [array + di]
    mov    [array + di + 1], dl
Inext:
    inc    di
    loop    iLoop
    
Onext:
    dec    si
    loop    oLoop
OExt:;退出外循环
    
    ret
Sort    EndP

code ends

end start



作者: wayaoqiang   发布时间: 2010-11-29

作者: masmaster   发布时间: 2010-11-29

title sort number 
assume cs:code,ds:data 
data segment 
num db 12h,90h,45h,34h,89h,56h,78h,0,23h 
data ends 
code segment 
start: 
  mov ax,data 
  mov ds,ax 
  mov si,0 
  mov cx,lengthof num-1 ;外循环次数 
s: push cx ;保护计数器 
  mov di,si ;si为外循环数据 
  inc di ;di为内循环数据 
s1: mov al,[si] ;开始比较 
  cmp al,[di] ;如果小于 
  jb jx ;跳过 
  xchg al,[di] ;把小数放在[si]中 
  mov [si],al ; 
jx: inc di ;指向内循环下一个数据 
  loop s1 
  inc si ;指向外循环下一个数据 
  pop cx ;恢复外循环计数器 
  loop s 
;结束 
  mov ah,4ch 
  int 21h 
code ends 
end start 

有异常啊, lengthof是什么意思哦, 调不通

作者: wayaoqiang   发布时间: 2010-11-29