Re: [心得:x86程式碼] 2位元組無號數轉字串--下集
在上集中有指出一重大BUG,本集來看看如何改正過來。
上集中指出若百、千位為0將被忽視掉,因此何種場合百、千位會為0?
依程式運作來看當然不會是小於100的值,所以只有是5位數的值才符合條件,
因此只要碰到5位數目時,在處理其萬位之後再作個判斷即可。
以下修改完程式碼中,有標 ;* 註解者為新加入。
;
; 2位元組無號數據轉字串
;
; 輸入: AX=值 ; ES:DI=字串存放處
;
; 返回: AL=字串長度(1~5)
;
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
ADD AL,'0'
STOSB
MOV AX,DX
INC CL
CMP AX,100 ;*
JAE TH_NUM3 ;*
PUSH AX ;*
MOV AX,'00' ;*
STOSW ;*
INC CL ;*
INC CL ;*
POP AX ;*
JMP T_NUM ;*
TH_NUM:
CMP AX,100
JB T_NUM
TH_NUM3: ;*
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.115.19.228
推
12/07 10:41, , 1F
12/07 10:41, 1F
→
12/07 13:00, , 2F
12/07 13:00, 2F
推
12/07 17:57, , 3F
12/07 17:57, 3F
→
12/07 21:33, , 4F
12/07 21:33, 4F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章