先发个子程序,若用int21h,ah=0AH读入字符串,这子程序能把它
转换成32bit数值传回,换言之,最多读到FFFFFFFFh,即4294967295
分两个版本
版本一只用16bit暂存器,由dx:ax传回
版本二用32bit暂存器,由EAX传回
使用方法,si指向输入缓冲,呼叫子程式即可
程序代码:
lea dx,InputBuffer ;指向输出缓冲
mov ax,0c0ah ;输入函数,先清空键盘缓冲
int 21h
..
..
..
lea si,InputBuffer + 2
Call GetValue32 或 Call GetValue32x
16bit暂存器版
程序代码:
;--------------------------------------------------
;转值子程序,把输入的10进制文字转成16进制
;输入:ds:si数字字符串起点,以0dh或0结束
;输出:ds:ax=转换后的32进制值,cf=1表示有非数字字符
;若输入值少于65535,则dx=0
;--- 16bit暂存器版---------------------------------
GetValue32:
push bx
push cx
push si
push di
push bp
xor cx,cx
xor di,di
xor dx,dx
mov bx,10
d10:
lodsb
cmp al,0dh ;若以0d为结束符,启用这句,关闭下句
;cmp al,0 ;若以0为结束符,启用这句,关闭上句
jz d20
sub al,'0'
cmp al,9
jbe d15
d12:
stc
jmp short d99
d15:
cbw
mov bp,ax ;store to bp
mov ax,cx ;get cx
mul bx ;x 10
mov cx,ax ;store to key hi
mov ax,bp ;restore from bp
xchg ax,di ;get key lo
mul bx ;x 10
xchg ax,di ;store to key lo
add di,ax ;add low byte to key lo
adc cx,dx ;add to key hi
jnc d10
jmp short d12
d20:
mov dx,cx
mov ax,di
clc
d99:
pop bp
pop di
pop si
pop cx
pop bx
ret
32bit暂存器版
程序代码:
;--- 32bit暂存器版---------------------------------
;转值子程序,把输入的10进制文字转成16进制
;输入:ds:si数字字符串起点,以0dh或0结束
;输出:eax=转换后的32进制值,cf=1表示有非数字字符
;若希望由ds:ax传回,可加三句于ret之前
; mov edx,eax
; shr edx,16
; and eax,0000FFFFh
;--------------------------------------------------
.386
GetValue32X:
push ebx
push edi
xor ebx,ebx
mov edi,10
GetV10:
lodsb ;指向起点
and eax,000000ffh ;清除高bit,保留AL
cmp al,0dh ;若以0d为结束符,启用这句,关闭下句
;cmp al,0 ;若以0为结束符,启用这句,关闭上句
jz Getvx
sub al,'0'
cmp al,9
ja Getvy
xchg ebx,eax ;交换
mul edi
add ebx,eax ;累加
jmp short GetV10
Getvx:
mov eax,ebx ;ascii转值后由eax转回
clc ;成功cf=0
jmp short Getvz
Getvy:
stc ;错误 cf=1
Getvz:
pop edi
pop ebx
; mov edx,eax
; shr edx,16
; and eax,0000FFFFh
ret
[此贴子已经被作者于2016-6-27 22:06编辑过]