回 帖 发 新 帖 刷新版面

主题:[讨论]我编写了一个冒泡法老是出错,帮我改改

DATA  SEGMENT
           S  DB        12,36,14,25,9,23
           X  DB        1
        FLEG  DB        0
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      BEGIN:  MOV       AX,DATA
              MOV       CX,DX
              LEA       SI,S
              MOV       CX,6
              MOV       FLEG,0
      AGAIN:  MOV       BX,CX
              DEC       BX
          A:  CMP       [SI],[SI+1]
              JB        N1
              JNB       N2
         N1:  XCHG      [SI],[SI+1]
              MOV       FLEG,1
              CMP       BX,0
              JZ        F1
              INC       SI
              DEC       BX
              JMP       A
         N2:  CMP       BX,0
              JZ        F1
              INC       SI
              DEC       BX
              JMP       A
         F1:  CMP       FLEG,0
              JZ        OVER
              JNZ       OVER1

      OVER1:  LEA       SI,S
              ADD       SI,SI+1
              INC       X
              MOV       FLEG,0
              LOOP      AGAIN
       OVER:  MOV       DX,OFFSET S
              MOV       AH,09H
              INT       21H
              MOV       AH,4CH
              INT       21H
        CODE  ENDS
              END       BEGIN
[color=FF0000]分别是第1518 35行出错[/color]

回复列表 (共4个回复)

沙发

最起码你的DS都没有初始化。好好看看

板凳


连汇编框架都不对,能不错吗?

3 楼

你写的格式几乎不大好,应该出的错误比较多.
  我也写了一个冒泡法,输入10个字符能判断大小并输出.运行出来几乎没有问题.一个问题我百思不得其解,怎么结果输入的是12 个字符呢?请达人帮我改改.
  data segment
  mes1  db 'input the number:$'
  buf   db 11
        db ?
        db  11 dup(?)
 mes2   db 'the squense is:$'
data ends
  code segment
  assume cs:code,ds:data
start:  mov ax,data
        mov ds,ax
        mov dx,offset mes1
        mov ah,09
        int 21h
        mov dx,offset buf
        mov ah,0ah
        int 21h
        mov cx,10
        mov bx,0
   z1:  mov si,offset buf+2
        add si,bx
        call min
        mov si,offset buf+2
        add si,bx
        mov ah,0
  l4:   cmp al,[si]     ;找最小值在整个字符串中的位置位tran做准备
        jz  l3
        inc si
        inc ah
        jmp l4
   l3: call tran
       inc  bx
       loop z1
       mov dx,offset mes2
       mov ah,9h
       int 21h
       mov di,offset buf+12
       mov byte ptr [di],'$'
       mov ah,9h
       mov dx,offset buf+2
       int 21h
       mov ah,4ch
       int 21h
   min proc      ;找到最小的值 
      push cx
      push bx
      mov  al,[si]
      add  bx,1
      mov  cx,10
      sub  cx,bx
      cmp  cx,0
      jz   l7
  l1: inc si
      cmp al,[si]
      jb  l2
      mov  al,[si]
  l2: loop l1
  l7: pop  bx
      pop  cx
      ret
      min  endp
 tran proc              ;移动位置,并把最小的值移到第一
      push cx
      mov  cx,0
      mov  cl,ah
      cmp  cx,0
      jz  l6
 l5:  mov  dl,[si-1]
      mov  [si],dl
      dec  si
      loop l5
  l6: mov [si],al
      pop cx
      ret
      tran endp
    code ends
 end start

4 楼

给你一个正确的,好好看看:
STACK SEGMENT STACK
      DB 200 DUP(0)
STACK ENDS
DATA  SEGMENT
BUF    DB 20H,11H,25H,49H,0,43H,2H,0FFH
N      EQU $-BUF
DATA  ENDS
CODE  SEGMENT
      ASSUME CS:CODE,DS:DATA,SS:STACK
START:
      MOV AX,DATA
      MOV DS,AX
      MOV SI,1
L1:   MOV DI,SI
      INC DI
      MOV AL,[BUF+SI-1]
L2:   CMP AL,[BUF+DI-1]
      JBE NEXT
      XCHG [BUF+DI-1],AL
      MOV  [BUF+SI-1],AL
NEXT: INC  DI
      CMP  DI,N
      JBE  L2
      INC  SI
      CMP  SI,N-1
      JBE  L1
      MOV  AH,4CH
      INT 21H
CODE  ENDS
      END START      

我来回复

您尚未登录,请登录后再回复。点此登录或注册