📄 extstr.asm
字号:
model large extend_text,pascal
include extend.inc
extrn ExtMul:far,Comp2Ext:far,ExtPow10:far
.data
C1e8 dt 1e8
.code Extend_Text
Argm Src,dword,1
Argm Dst,dword,1
Loc Temp,word,4
Loc J,word,1
Loc I,word,1
Entry Str2Ext
push si di
push ds
lds si,Src
cld
xor di,di
mov dx,di
mov cx,di
mov bx,di
mov I,di
mov J,di
@@1: lodsb
cmp al,'0'
jb @@6
cmp al,'9'
ja @@6
sub al,'0'
cbw
or bx,bx
jnz @@3
or cx,cx
jnz @@4
or dx,dx
jnz @@4
xchg ax,di
mov dx,10
mul dx
@@2: add di,ax
adc dx,0
adc cx,0
adc bx,0
mov ax,J
add I,ax
jmp @@1
@@3: cmp bx,3276
jae @@5
@@4: push ax
shl di,1
rcl dx,1
rcl cx,1
rcl bx,1
push bx cx dx di
shl di,1
rcl dx,1
rcl cx,1
rcl bx,1
shl di,1
rcl dx,1
rcl cx,1
rcl bx,1
pop ax
add di,ax
pop ax
adc dx,ax
pop ax
adc cx,ax
pop ax
adc bx,ax
pop ax
jmp @@2
@@5: mov ax,J
inc ax
add I,ax
jmp @@1
@@6: cmp al,'.'
jne @@7
cmp J,0
jne @@7
dec J
jmp @@1
@@7: mov Temp[0],di
mov Temp[2],dx
mov Temp[4],cx
mov Temp[6],bx
mov di,I
cmp al,'E'
je @@8
cmp al,'e'
jne @@13
@@8: xor bx,bx
lodsb
mov cl,al
cmp al,'-'
je @@10
cmp al,'+'
je @@10
@@9: cmp al,'0'
jb @@11
cmp al,'9'
ja @@11
cmp bx,1000
jae @@11
sub al,'0'
cbw
shl bx,1
mov dx,bx
shl bx,1
shl bx,1
add bx,dx
add bx,ax
@@10: lodsb
jmp @@9
@@11: cmp cl,'-'
jne @@12
neg bx
@@12: add di,bx
@@13: pop ds
lea ax,Temp
push ss ax
les ax,Dst
push es ax
call Comp2Ext
mov ax,0f000h
cmp di,ax
jge @@14
sub di,ax
push ax
les ax,Dst
push es ax
call ExtPow10
@@14: push di
les ax,Dst
push es ax
call ExtPow10
xchg ax,si
dec ax
sub ax,Src.Offs
jmp short @@15
@@15: pop di si
Exit
Argm Src,dword,1
Argm W,word,1
Argm Sign,dword,1
Argm Dst,dword,1
Loc Temp,word,5
Loc P,dword,1
Loc SSP,word,1
Loc J,word,1
Loc I,word,1
Entry Ext2Str
push si di
mov ax,8000h
cmp W,0
jg @@1
mov ax,18
xchg ax,W
@@1: mov j,ax
les di,dst
mov P.Offs,di
mov P.Segm,es
push ds
lds si,Src
lea di,Temp
push ss
pop es
cld
mov cx,5
rep movsw
pop ds
mov ax,Temp[8]
sub cx,cx
shl ax,1
rcl cx,1
les di,Sign
mov es:[di],cx
shr ax,1
jz @@2
cmp ax,7fffh
jb @@4
mov dx,7fffh
jmp short @@3
@@2: sub dx,dx
@@3: les di,Dst
sub al,al
stosb
mov ax,dx
jmp @@27
@@4: sub ax,3fffh
cmp ax,27
jge @@5
or ax,ax
jl @@5
mov I,8
jmp @@7
@@5: mov dx,4d10h
imul dx
xchg ax,bx
mov ah,4dh
mov al,byte ptr Temp[7]
shl al,1
mul ah
add ax,bx
adc dx,0
neg ax
adc dx,0
mov I,dx
cmp dx,J
jl @@2
mov si,8
sub si,dx
mov ax,1000h
cmp si,ax
jl @@6
sub si,ax
push ax
lea ax,Temp
push ss ax
call ExtPow10
@@6: push si
lea ax,Temp
push ss ax
call ExtPow10
@@7: mov SSP,sp
@@8: mov cx,30
sub cl,byte ptr Temp[8]
sub bx,bx
mov si,Temp[0]
mov di,Temp[2]
mov ax,Temp[4]
mov dx,Temp[6]
cmp cx,16
jb @@9
mov bx,si
mov si,di
mov di,ax
mov ax,dx
sub dx,dx
sub cx,16
jz @@11
@@9: push bp
sub bp,bp
@@10: shr dx,1
rcr ax,1
rcr di,1
rcr si,1
rcr bx,1
rcr bp,1
loop @@10
mov cx,bp
pop bp
@@11: push di
lea di,Temp
push ss
pop es
xchg ax,cx
stosw
xchg ax,bx
stosw
xchg ax,si
stosw
pop ax
stosw
mov ax,3ffeh
stosw
xchg ax,cx
@@12: mov bx,I
les di,P
mov si,Dst.Offs
mov cx,10000
div cx
mov cx,100*256+10
xchg ax,dx
div ch
xchg ax,dx
div ch
cmp al,ch
jb @@13
sub al,ch
inc bx
push ax
mov al,'1'
call @19
pop ax
@@13: call @15
mov I,bx
mov P.Offs,di
lea ax,Temp
push ss ax
cmp byte ptr Temp[7],0
js @@14
push ss ax ss ax
call Comp2Ext
sub Temp[8],64
@@14: lea ax,C1e8
push ds ax
call ExtMul
sub ax,ax
mov dx,ax
cmp Temp[8],3fffh
jb @@12
jmp @@8
@15 proc near
call @@16
xchg ax,dx
@@16: mov ch,ah
call @@17
mov al,ch
@@17: cbw
div cl
add ax,'00'
call @@18
mov al,ah
@@18: cmp al,'0'
jne @19
cmp di,si
je @@20
@19: stosb
dec W
jl @22
@@20: cmp bx,J
jle @22
dec bx
ret
@15 endp
@@21: jmp @@2
@22: mov sp,SSP
cmp di,si
je @@21
dec di
add bx,di
sub bx,si
cmp byte ptr es:[di],'5'
jae @@25
@@23: cmp di,si
je @@21
dec di
cmp byte ptr es:[di],'0'
je @@23
jmp short @@26
@@24: dec di
inc byte ptr es:[di]
cmp byte ptr es:[di],'9'
jbe @@26
@@25: cmp di,si
jne @@24
mov byte ptr es:[di],'1'
inc bx
@@26: mov byte ptr es:[di+1],0
mov ax,bx
jmp short @@27
@@27: pop di si
Exit
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -