[心得:x86程式碼] 2位元組無號數轉字串

看板ASM (組合語言)作者 (PPC)時間13年前 (2011/11/30 10:39), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串1/1
本片段程式是把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
版上好久沒看到x86 推一下XD
11/30 12:40, 1F

11/30 13:42, , 2F
我都直接把最前面的0輸出了XDDDDDDD~~偷懶作法
11/30 13:42, 2F

11/30 17:38, , 3F
科科,這段程式有個重大BUG,處理類似10020就錯了
11/30 17:38, 3F

11/30 17:39, , 4F
留給別人當練習修改用...XD
11/30 17:39, 4F
文章代碼(AID): #1ErPTA6- (ASM)
文章代碼(AID): #1ErPTA6- (ASM)