📄 3-28.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 + -