近日放假在家,开始研究起汇编语言,看了几日,小有成就。今天晚上有空,写了一个程序,实现C函数库中的itoa()函数的功能,也就是把整数转换成字符串,这是鄙人第一个独立写的汇编程序,肯定有不妥的地方,望高手指正。
;子程序名: ITOA
;功 能: 将16位有符号整数转换为字符串
;入口参数: DS:SI=缓冲区首地址
; AX=要转换的数
;出口参数: 转换后的字符在缓冲区中
ITOA PROC
PUSH BX ;保护寄存器
PUSH CX
PUSH DX
PUSH SI
;
ROL AX,1 ;循环左移,判断符号位
ROR AX,1 ;恢复原数
JNC POS
DEC AX ;减1
XOR AX,0FFFFH ;取反
MOV [SI],'-' ;负号
INC SI
POS: XOR CX,CX ;位数计数器清零
XOR DX,DX
MOV BX,10 ;设置除数
NEXT1: DIV BX
PUSH DX ;余数入栈
INC CX
OR AX,AX ;判断商是否为0
JZ NEXT2
XOR DX,DX
JMP NEXT1
;
NEXT2: POP DX ;构建字符串
ADD DL,'0'
MOV [SI],DL
INC SI
LOOP NEXT2
;
MOV [SI],0 ;字符串结束符,或为'$'
;
POP SI ;恢复寄存器
POP DX
POP CX
POP BX
RET
ITOA ENDP
;功 能: 将16位有符号整数转换为字符串
;入口参数: DS:SI=缓冲区首地址
; AX=要转换的数
;出口参数: 转换后的字符在缓冲区中
ITOA PROC
PUSH BX ;保护寄存器
PUSH CX
PUSH DX
PUSH SI
;
ROL AX,1 ;循环左移,判断符号位
ROR AX,1 ;恢复原数
JNC POS
DEC AX ;减1
XOR AX,0FFFFH ;取反
MOV [SI],'-' ;负号
INC SI
POS: XOR CX,CX ;位数计数器清零
XOR DX,DX
MOV BX,10 ;设置除数
NEXT1: DIV BX
PUSH DX ;余数入栈
INC CX
OR AX,AX ;判断商是否为0
JZ NEXT2
XOR DX,DX
JMP NEXT1
;
NEXT2: POP DX ;构建字符串
ADD DL,'0'
MOV [SI],DL
INC SI
LOOP NEXT2
;
MOV [SI],0 ;字符串结束符,或为'$'
;
POP SI ;恢复寄存器
POP DX
POP CX
POP BX
RET
ITOA ENDP