MMIXAL ITOA

360 阅读1分钟

使用 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