使用 MMIXAL 实现简单的 ITOA
简介
本文假设读者对 MMIX 架构和 MMIXAL 汇编语言有足够的了解。
本文使用 MMIXAL 汇编语言实现一个简单的 ITOA 函数(或者叫 subroutine ),可以转换最大为10位的10进制正整数(9999999999)。
这个函数没有使动态内存分配,转换后的结果保存在固定的内存位置,也就是全局变量中。
代码运行
将代码保存到例如 itoa.mms 的文件中,运行命令 mmixal itoa.mms; mmix itoa.mmo
代码实现
LOC Data_Segment
GREG @
EOL BYTE 10,0
BIG OCTA 9999999999
LOC #200
Main LDA $2,BIG
LDOU $1,$2,0
PUSHJ $0,ITOA
GETA $255,A
TRAP 0,Fputs,StdOut
LDA $255,EOL
TRAP 0,Fputs,StdOut
SET $2,1234
PUSHJ $1,ITOA
GETA $255,A
TRAP 0,Fputs,StdOut
LDA $255,EOL
TRAP 0,Fputs,StdOut
TRAP 0,Halt,0
// ITOA converts the unsigned number in n to ascii representation,
// result in A, len in $0.
A LOC @+11
n IS $0
i IS $1
r IS $2
a IS $3
ri IS $4
b IS $5
bb IS $6
ITOA GETA a,A
SET i,10
SET b,0
INIT STB b,a,i
SUB i,i,1
BNN i,INIT
SET i,0
DIVIDE DIV n,n,10
GET r,rR
INCL r,'0'
STB r,a,i
BZ n,REVERSE
INCL i,1
JMP DIVIDE
REVERSE SET n,i
SET ri,0
1H LDB b,a,i
LDB bb,a,ri
STB b,a,ri
STB bb,a,i
ADD ri,ri,1
SUB i,i,1
CMP r,ri,i
BNN r,END
JMP 1B
END INCL n,1
POP 1,0