注册 登录
编程论坛 汇编论坛

汇编语言程序设计一个小程序

薄凉 发布于 2018-06-15 18:07, 4826 次点击
在数据段的变量BUF中有10个字节型无符号的十进制数,它们以无序的方式存放着,设计一个程序将这些数据按由小到大的方式排列起来,并在屏幕上输出排好序的这10个数。(两数之间用空格分开)
7 回复
#2
Valenciax2018-06-18 08:07
如果楼主早一年注册,贴子(不是纯灌水)超过30,我会给你解答.
或者
楼主至少有一个思路,写了若干代码却卡在什么地方,我也会给你解答.
#3
薄凉2018-06-18 21:15
回复 2楼 Valenciax
   CODE  SEGMENT
              ASSUME    CS:CODE
 
         BUF  DB        12H,34H,07H,78H,65H,41H,99H,87H,66H,52H
           N  EQU       $-BUF
 
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              LEA       SI,BUF
              MOV       CX,N
              CALL      SORT
              LEA       SI,BUF
              MOV       CX,N
              CALL      DSPBCD
              MOV       AH,4CH
              INT       21H
;===============================
     DSPBCD:
              PUSH      AX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              CLD
      @BCD1:
              LODSB
              ROR       AL,4
              PUSH      AX
              MOV       DL,AL
              AND       DL,0FH
              OR        DL,30H
              MOV       AH,2
              INT       21H
              POP       AX
              ROR       AL,4
              MOV       DL,AL
              AND       DL,0FH
              OR        DL,30H
              MOV       AH,2
              INT       21H
              MOV       DL,'H'
              INT       21H
              MOV       DL,32
              INT       21H
              MOV       DL,32
              INT       21H
              LOOP      @BCD1
              POP       SI
              POP       DX
              POP       CX
              POP       AX
              RET
               
;===============================
; 单个字符串(或者字节数组)内部的排序(冒泡排序)
        SORT  PROC      NEAR
      ; 串长度置入cx,串首地址置入 si
              PUSH      AX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSHF
              PUSH      CX
              POP       DX
              DEC       DX
    @SORTL1:
              MOV       CX,DX
              MOV       DI,SI
    @SORTL2:
              MOV       AL,[DI+1]
              CMP       AL,[DI]
              JA        @SORTNEXT   ; 无符号 升序
              XCHG      AL,[DI]
              MOV       [DI+1],AL
  @SORTNEXT:
              INC       DI
              LOOP      @SORTL2
              DEC       DX
              JNZ       @SORTL1
              POPF
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       AX
              RET
        SORT  ENDP
;===============================================================  
        CODE  ENDS
              END       START
#4
Valenciax2018-06-19 06:41
先说楼主的代码,也没啥错误,但有一句
ROR AL,4
这是8086汇编不允许的,须在文件开头的地方加一句
.286

再看看题目...
在数据段的变量BUF中有10个字节型无符号的十进制数,它们以无序的方式存放着,设计一个程序将这些数据按由小到大的方式排列起来,并在屏幕上输出排好序的这10个数。(两数之间用空格分开)

题目不太清晰,在内存中,除非特别指明是10进制的BCD,其实储存的都是16进制(也可以说是2进制),
既然说:无符号的十进制数(也没说是byte或word),可以理解为
buf db 07,12, ....... 99   ;共10个,没有h作后缀
另外也没说输出的是10进制还是16进制,但前面说存的是10进制,楼主代码却显示16进制,这可能出现歧异...

好吧,就改写成以10进制罗列资料,以10进制显示供楼主参考......

程序代码:


 CODE  SEGMENT
              ASSUME    CS:CODE
         BUF  DB        12,34,07,78,65,41,99,87,66,246
           N  EQU       $-BUF
         
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              LEA       SI,BUF
              MOV       CX,N
              CALL      SORT
              LEA       SI,BUF
              MOV       CX,N
              CALL      DSPBCD
              MOV       AH,4CH
              INT       21H
;===============================
       DSPBCD PROC    NEAR
          CLD
NEXT:
          PUSH     CX
          LODSB
          MOV    AH,0
          CALL    PRINT_AX;印出AX值
          MOV     AH,2
          MOV     DL,20H    ;显示空白
          INT    21H
          POP     CX
          LOOP     NEXT
          RET
       DSPBCD ENDP   
;===============================
;
输出AX的ASCII到屏幕
     PRINT_AX PROC      NEAR
          MOV    CX,0    ;清0
          MOV    BX,10    ;除法准备
PPAX1:
          MOV    DX,0    ;清0
          DIV    BX    ;AX /10 ,若1234 ,除10后,DL得余数4,
          PUSH    DX    ;保存, AX=1234,依次保存4,3,2,1
          INC    CX    ;累加个数
          OR    AX,AX    ;是否已除尽
          JNZ    PPAX1    ;不是,再除
          MOV    BL,CL    ;存个数
PPAX2:
          POP    DX    ;后入先出,先印出第一数,然后第二....
          OR    DL,30H    ;转ASCII
          MOV     AH,2    ;存入字串缓冲
          INT    21H
          LOOP    PPAX2     ;下一个
          RET
     PRINT_AX ENDP
;===============================
;
单个字符串(或者字节数组)内部的排序(冒泡排序)
        SORT  PROC      NEAR
      ; 串长度置入cx,串首地址置入 si
              PUSH      AX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSHF
              PUSH      CX
              POP       DX
              DEC       DX
    @SORTL1:
              MOV       CX,DX
              MOV       DI,SI
    @SORTL2:
              MOV       AL,[DI+1]
              CMP       AL,[DI]
              JA        @SORTNEXT   ; 无符号 升序
              XCHG      AL,[DI]
              MOV       [DI+1],AL
  @SORTNEXT:
              INC       DI
              LOOP      @SORTL2
              DEC       DX
              JNZ       @SORTL1
              POPF
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       AX
              RET
        SORT  ENDP
;===============================================================  
        CODE  ENDS
              END       START

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2018-6-19 06:43编辑过]

#5
薄凉2018-06-20 17:54
回复 4楼 Valenciax
谢谢
#6
鱼儿海2018-11-02 21:34
哎!
#7
花木拦不住2018-11-13 13:03
谢谢了
#8
张学匚2018-11-27 19:16
1