[心得:x86程式碼] 2位元組無號數轉字串
本片段程式是把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)
推
11/30 12:40, , 1F
11/30 12:40, 1F
推
11/30 13:42, , 2F
11/30 13:42, 2F
→
11/30 17:38, , 3F
11/30 17:38, 3F
→
11/30 17:39, , 4F
11/30 17:39, 4F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章