作者POWERPC (PPC)
看板ASM
标题[心得:x86程式码] 2位元组无号数转字串
时间Wed Nov 30 10:39:04 2011
本片段程式是把2BYTES无号数转成字串,流程明了,就不多加注解了。
由於2BYTE无号数可表示0~65535,因此可知最多有5个字元。
当初设计时没对0头做消除处理,所以如952会呈0952,而7则为07,因此再加入侦测0头辨别
原想用一旗标来设置起头非0标记(如果不设则20050将会成25,0都不见了),
但为了这一方式再弄个旗标似乎太小用了,後来想出用计数字元数量来做就解决此问题。
程式一开始先断数据是否0,是0就直接填0到字串,较省时省力。
设0头记号(CL),再来看是否小於10000,小於则跳到除100处理下去。
其中只要起头非0则CL暂存器加一,只要CL不为0,那位於十位及千位的0就不被忽略。
若要有补0作用只要改一下就成了。依此法也可扩张到4BYTES用法
给各位当见面礼,很早知PTT有这板,N年後终於入会PTT了 XD
用法:
I: AX=数据 ; DI = 字串存放处指标
O: AL=字元数量
TOW_BYTE2DEC_STRING:
OR AX,AX
JZ ZERO_NUM
PUSH BX
PUSH CX
PUSH DX
XOR CL,CL
CMP AX,10000
JB TH_NUM
XOR DX,DX
MOV BX,10000
DIV BX
AAM
ADD AL,'0'
STOSB
MOV AX,DX
INC CL
TH_NUM:
CMP AX,100
JB T_NUM
MOV BL,100
DIV BL
MOV CH,AH
AAM
OR CL,CL
JNZ TH_NUM1
OR AH,AH
JNZ TH_NUM1
ADD AL,'0'
STOSB
JMP TH_NUM2
TH_NUM1:
XCHG AH,AL
ADD AX,'00'
STOSW
INC CL
TH_NUM2:
INC CL
MOVZX AX,CH
T_NUM:
OR AL,AL
JZ Z_NUM
AAM
OR CL,CL
JNZ T_NUM1
OR AH,AH
JNZ T_NUM1
ADD AL,'0'
STOSB
INC CL
MOV AL,CL
POP DX
POP CX
POP BX
RETN
T_NUM1:
XCHG AH,AL
Z_NUM:
ADD AX,'00'
STOSW
INC CL
INC CL
MOV AL,CL
POP DX
POP CX
POP BX
RETN
ZERO_NUM:
MOV AL,'0'
STOSB
MOV AL,1
RETN
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.197.176
※ 编辑: POWERPC 来自: 59.112.197.176 (11/30 10:50)
1F:推 TaiwanXDman:版上好久没看到x86 推一下XD 11/30 12:40
2F:推 jason12308:我都直接把最前面的0输出了XDDDDDDD~~偷懒作法 11/30 13:42
3F:→ POWERPC:科科,这段程式有个重大BUG,处理类似10020就错了 11/30 17:38
4F:→ POWERPC:留给别人当练习修改用...XD 11/30 17:39