;+------------------------------------
;|来源:http://tieba.baidu.com/p/5989032960
;|功能:输出一个类未压缩的BCD数组各元素
;|编程:fasmfan
;|时间:2018.12.26
;|编译:masm v4.00
;+------------------------------------
STACK SEGMENT para STACK 'STACK'
db 4 dup('MYSTACKS')
STACK ENDS
_DATA SEGMENT
bcdArray db 0,2,' ',7,0,' ',0,0,' ',0,4
;以上是根据来源程序片段推算出来的结构。
;这个数据结构(类未压缩的BCD数)的组织是每3个字节为一个数据单位,每个
;字节的数只能是0到9,且个位在高地址,十位在低地址。最多只能是两位无
;符号十进制数(0~99)。
;例如十进制数:89 对应这个数据结构是:8,9,' '
; 7 对应这个数据结构是:0,7,' '
x dw 0
score dw 4 dup(?)
_DATA ENDS
_TEXT SEGMENT
ASSUME CS:_TEXT,DS:_DATA,ss:stack
start:
mov ax,_DATA
mov ds,ax
mov cx,4
lea si, [bcdArray]
xor di,di
next:
call transf
loop next
mov ax,4c00h
int 21h
;+------------------------------------
;|子程序:transf
;+------------------------------------
transf:
push cx ;将cx保护起来
mov x,0 ;
mov cx,2 ;
getnum:
mov al,[si] ;取一个数进AL
sub ah,ah ;
cmp al,20H ;AL是空格吗?
jnz feikongge;不是就跳
inc si ;是,就调整变址器,使其指向下一字节
jmp getnum ;取下一个数
feikongge:
and ax,000FH;AX保留低四位,高四位清零
xchg ax,x ;交换
mov dx,10 ;取乘数
mul dx ;10*AX做乘法,第一次为0
add x,ax ;X=AX+X,累加,再折回头计算第二次时,X<>0了。
inc si ;调整SI指向下一字节
loop getnum ;循环没做完就再来一次。
mov ax,x ;
mov word ptr score[di],ax;
;---------在此加入了输出语句,以便查看运算结果
mov bx,ax
call disp_decimal
mov dl,','
mov ah,2
int 21h
;---------------
mov x,0 ;
add di,2 ;
pop cx ;恢复CX,供主程序使用
ret ;
;+------------------------------------
;子程序:将16 bit无符号整数转换为十进制数串并输出
;输 入:bx=要转换并输出的数
;输 出:在屏幕上显示bx中的数
;+------------------------------------
disp_decimal proc
push ax
push bx
push cx
push dx ;保护入场时的dx寄存器值
;循环做除法,第一次循环求出个位,第二次循环求出十位...
mov ax,bx
mov bx,10
xor cx,cx
lab9078:
xor dx,dx
div bx
push dx
inc cx
cmp ax,0
jnz lab9078
mov ah,2
lab9079:
pop dx
add dl,'0'
int 21h
loop lab9079
pop dx
pop cx
pop bx
pop ax
ret
disp_decimal endp
_TEXT ENDS
END start
;|来源:http://tieba.baidu.com/p/5989032960
;|功能:输出一个类未压缩的BCD数组各元素
;|编程:fasmfan
;|时间:2018.12.26
;|编译:masm v4.00
;+------------------------------------
STACK SEGMENT para STACK 'STACK'
db 4 dup('MYSTACKS')
STACK ENDS
_DATA SEGMENT
bcdArray db 0,2,' ',7,0,' ',0,0,' ',0,4
;以上是根据来源程序片段推算出来的结构。
;这个数据结构(类未压缩的BCD数)的组织是每3个字节为一个数据单位,每个
;字节的数只能是0到9,且个位在高地址,十位在低地址。最多只能是两位无
;符号十进制数(0~99)。
;例如十进制数:89 对应这个数据结构是:8,9,' '
; 7 对应这个数据结构是:0,7,' '
x dw 0
score dw 4 dup(?)
_DATA ENDS
_TEXT SEGMENT
ASSUME CS:_TEXT,DS:_DATA,ss:stack
start:
mov ax,_DATA
mov ds,ax
mov cx,4
lea si, [bcdArray]
xor di,di
next:
call transf
loop next
mov ax,4c00h
int 21h
;+------------------------------------
;|子程序:transf
;+------------------------------------
transf:
push cx ;将cx保护起来
mov x,0 ;
mov cx,2 ;
getnum:
mov al,[si] ;取一个数进AL
sub ah,ah ;
cmp al,20H ;AL是空格吗?
jnz feikongge;不是就跳
inc si ;是,就调整变址器,使其指向下一字节
jmp getnum ;取下一个数
feikongge:
and ax,000FH;AX保留低四位,高四位清零
xchg ax,x ;交换
mov dx,10 ;取乘数
mul dx ;10*AX做乘法,第一次为0
add x,ax ;X=AX+X,累加,再折回头计算第二次时,X<>0了。
inc si ;调整SI指向下一字节
loop getnum ;循环没做完就再来一次。
mov ax,x ;
mov word ptr score[di],ax;
;---------在此加入了输出语句,以便查看运算结果
mov bx,ax
call disp_decimal
mov dl,','
mov ah,2
int 21h
;---------------
mov x,0 ;
add di,2 ;
pop cx ;恢复CX,供主程序使用
ret ;
;+------------------------------------
;子程序:将16 bit无符号整数转换为十进制数串并输出
;输 入:bx=要转换并输出的数
;输 出:在屏幕上显示bx中的数
;+------------------------------------
disp_decimal proc
push ax
push bx
push cx
push dx ;保护入场时的dx寄存器值
;循环做除法,第一次循环求出个位,第二次循环求出十位...
mov ax,bx
mov bx,10
xor cx,cx
lab9078:
xor dx,dx
div bx
push dx
inc cx
cmp ax,0
jnz lab9078
mov ah,2
lab9079:
pop dx
add dl,'0'
int 21h
loop lab9079
pop dx
pop cx
pop bx
pop ax
ret
disp_decimal endp
_TEXT ENDS
END start