请大神帮忙用汇编语言做道题。最好把思路或流程图和结果写下。实现把buf开始的50个单元中的正数……

如题所述

这题出的不严谨,真不像是解究逻辑的写程序的人出的题。
把buf开始的50个单元中的正数... 
这话怎么理解?是理解成这50个数都是正数,还是这50个数中有正有负,只对其中的正数进行处理?
简单起见,程序采用了全部是正数的理解。

assume cs:cseg, ds:dseg

dseg segment
  buf db  90,91,92,93,94,95,96,97,98,99
      db  80,81,82,83,84,85,86,87,88,89
      db  56,57,58,59,60,61,62,63,64,65
      db  46,47,48,49,50,51,52,53,54,55
      db  26,27,28,29,30,31,32,33,34,35
  len equ $-buf
  buf1 db len dup(0)
dseg ends

cseg segment
start:
  mov ax, dseg
  mov ds, ax

  mov cx, len
  mov si, offset buf
  mov di, offset buf1
  mov ah,0
$0:
  mov al, [si]
  call con2bcd
  mov [di], al
  inc si
  inc di
  loop $0

  mov dx, len
  mov si, offset buf1
  mov ah,0eh
$1:
  mov cx, 10
$2:
  mov bl, [si]
  call printbcd
  inc si
  dec cx
  jnz $3
  mov al,0dh
  int 10h
  mov al,0ah
  int 10h

  dec dx
  jnz $1
  jmp $4
$3:
  dec dx
  jnz $2

$4:
  mov ah,4ch
  int 21h

;convert(al) to BCD code, make sure (al)<100
;return in (al)
con2bcd proc near
  mov bx, 10
c0:
  xor dx, dx
  div bx
  push dx
  cmp ax, 0
  jnz c0

  pop bx
  mov ah, bl  ;
  pop bx
  mov al, bl

  push cx
  mov cl, 4
  shl al, cl
  shr ax, cl
  pop cx
  ret
con2bcd endp

;param in (bl)
printbcd proc near
  push cx
  mov cl,4

  mov al, bl
  shr al, cl
  xor al, 30h
  int 10h

  mov al, bl
  and al, 0fh
  xor al, 30h
  int 10h

  mov al, 20h
  int 10h

  pop cx
  ret
printbcd endp

cseg ends
end start

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-07-08
        CODE  SEGMENT
              ASSUME    CS:CODE
 
         BUF  DB        50 DUP(?)
        BUF1  DB        50 DUP(?)
 
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              ; ==============随机生成50个数 
              LEA       DI,BUF
              MOV       CX,50
              CLD
         @1:
              CALL      RAND
              STOSB
              MOV       AX,2
              CALL      DELAY_PROC
              LOOP      @1
              ;===============输出这50个数 
              CALL      LFCR
              LEA       SI,BUF
              MOV       CX,50
              CLD
        @11:
              LODSB
              CALL      DSPAL
              LOOP      @11
             
              ;================转为bcd码保存 
              LEA       SI,BUF
              LEA       DI,BUF1
              MOV       CX,50
              CLD
         @2:
              LODSB
              MOV       AH,0
              MOV       BL,10
              DIV       BL
              SHL       AL,4
              ADD       AL,AH
              STOSB
              LOOP      @2
              ;===============输出bcd数 
              CALL      LFCR
              LEA       SI,BUF1
              MOV       CX,50
              CLD
         @3:
              MOV       AX,CX
              MOV       BL,10
              DIV       BL
              OR        AH,AH
              JNE       @4
              CALL      LFCR
         @4:
              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
              LOOP      @3
 
              MOV       AH,4CH
              INT       21H
 
;===============================================================              
  DELAY_PROC  PROC      NEAR        ;延迟子程式,  延迟   ax/18秒
              PUSH      ES
              PUSH      DX
              MOV       DX,40H
              MOV       ES,DX
              MOV       DX,ES:[006CH]           ;取系统1/18秒计数
              ADD       DX,AX       ; 延时 x/18
    DELAY10:
              CMP       ES:[006CH],DX           ;时限到了?
              JBE       DELAY10     ;没
              POP       DX
              POP       ES
              RET
  DELAY_PROC  ENDP
;============================================================
        RAND  PROC      NEAR
              ; 利用时钟的低位反转除100的余数作为随机数 
              ; 随机数在ax中带回 
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSHF
              MOV       AH,0
              INT       1AH
              ; MOV       AX,CX     
              MOV       BX,DX
              MOV       CX,16
     @RAND1:
              ROR       BX,1
              RCL       AX,1
              LOOP      @RAND1
              MOV       DX,0
              MOV       BX,100
              DIV       BX
              MOV       AX,DX
              POPF
              POP       DX
              POP       CX
              POP       BX
              RET
        RAND  ENDP
;==================================
       LFCR:  PUSH      AX
              PUSH      DX
              MOV       AH,2
              MOV       DL,13
              INT       21H
              MOV       DL,10
              INT       21H
              POP       DX
              POP       AX
              RET
;=================================
       DSPAL  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSHF
              XOR       AH,AH
              XOR       CX,CX
              MOV       BL,10
    @DSPAL1:
              DIV       BL
              INC       CX
              MOV       DL,AH
              XOR       AH,AH
              OR        DX,30H
              PUSH      DX
              CMP       AL,0
              JNE       @DSPAL1
              MOV       AH,2
   @DISPAL2:
              POP       DX
              INT       21H
              LOOP      @DISPAL2
              MOV       DL,32
              INT       21H
              POPF
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       DSPAL  ENDP
;================================
        CODE  ENDS
              END       START