⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3-28.asm

📁 华工电信系汇编习题的编程实现
💻 ASM
字号:
stack segment stack 'stack'
      dw 32 dup(?)
stack ends

data segment 
     BufIn db 255,0,255 dup(?)
     BCDNum db 102 dup(?)
     NSize db ?
data ends

code segment 
begin proc far
      assume ss:stack,cs:code,ds:data
      push ds
      sub ax,ax
      push ax
      mov ax,data
      mov ds,ax

      mov dx,offset BufIn
      mov ah,10
      int 21H
;在输入的串后面再加上一个逗号
      mov dl,','
      mov cl,BufIn[1]
      mov ch,0
      mov SI,cx
      mov BufIn[SI+2],dl
;;;;;;;;;;
      mov dx,offset BufIn + 2
      mov cl,BufIn[1]
      INC cl
      CALL far ptr GetSize
      mov NSize,cl
;;;;;;;;;;
      mov cl,NSize
      mov ch,0
      mov dx,offset BufIn + 2
      mov DI,offset BCDNum
AGAIN3:
      CALL AscToBCD
      loop AGAIN3
     
      mov SI,offset BCDNum
      mov cl,NSize
      mov ch,0
      CALL far ptr GetMax

     push ax
      mov dl,00AH
      mov ah,2
      int 21H

      mov al,NSize
      mov ah,0
      mov dl,10
      div dl
      mov bx,ax
      add dl,30H
      mov dl,al
      mov ah,2
      int 21H
      mov dl,bh
      add dl,30H
      mov ah,2
      int 21H

      mov dl,00AH
      mov ah,2
      int 21H            
     pop ax
      CALL far ptr Display
      ret
      
begin   endp

;dx 传入十进制字符的首地址
;转化后的压缩BCD数在DI偏移的地址中
;DI会增加2
;dx会改变到下一个逗号后
AscToBCD proc
      push SI
      push ax
      push bx
      push cx

      mov SI,dx
      mov dx,0
      mov ax,0
      mov bx,0
AGAIN: 
      mov bl,[SI]
      sub bl,030H
      mov cx,10
      mul cx
      add ax,bx
      INC SI
      CMP byte ptr [SI],','
      JNZ AGAIN
;;;;;;;;;;;;
      mov dx,SI
      INC dx ;跳过逗号
    push dx
      
      mov dx,0
      mov cx,10

      div cx
      mov [DI + 1],dl
      mov dx,0

      div cx
      push cx
      mov cl,4
      shl dl,cl
      pop cx
      add [DI + 1],dl
      mov dx,0

      div cx
      mov [DI],dl
      mov dx,0
      
      mov cl,4
      shl al,cl      
      add [DI],al
      
      add DI,2
    pop dx

      pop cx
      pop bx
      pop ax
      pop SI
      ret
AscToBCD endp

;dx传入字符串的首地址
;cx中传入字符的个数
;cx中返回数目

GetSize proc far
        push SI
        push ax
        mov SI,dx
        mov ah,0
AGAIN2:
       mov al,[SI]
       CMP al,','         
       JNZ NEXT2 
       INC ah 
NEXT2:
       INC SI
       loop AGAIN2
       mov cx,0
       mov cl,ah
       pop ax
       pop SI
       ret
GetSize endp

;cl存放数目
;SI存放BCD串的首地址
;ax存放最大的BCD数
GetMax proc far
      mov ax,0
      
AGAIN4:
      CMP ah,[SI]
      JA NEXT4
      JZ CMPNEXT
      JMP EXCHANGE      
CMPNEXT:
      CMP al,[SI + 1]
      JA NEXT4
EXCHANGE:
      mov ah,[SI]
      mov al,[SI + 1]      
NEXT4:        
      add SI,2
      loop AGAIN4
      ret
GetMax endp

;将ax中的BCD数显示出来
DisPlay proc far
        push dx
        push cx
        push bx

        mov bx,ax
        mov dl,bh
        mov cl,4
        shr dl,cl
        add dl,030H
        mov ah,2
        int 21H
                        
        mov dl,bh
        and dl,00FH
        add dl,030H
        int 21H
      
        mov dl,bl
        shr dl,cl
        add dl,030H
        int 21H

        mov dl,bl
        and dl,00FH
        add dl,030H
        int 21H

        pop bx
        pop cx
        pop dx

        ret
Display endp

code    ends

      end begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -