vak: (Default)
[personal profile] vak
Я вижу, MMIX вызвал интерес. Вот вам вдогонку пара чуть более сложных примеров на GNU ассемблере.

echo

Классическая юниксная утилита /bin/echo: печатает в строчку свои аргументы. При старте программа получает количество аргументов в регистре $0, а адрес таблицы аргументов - в регистре $1. Файл echo.S:
#define Halt    0
#define Fputs   7
#define StdOut  1

#define argc    $0
#define argv    $1

        .text
        .global _init
_init   SUB     argc, argc, 2       // decrement argc by 2
        PBNN    argc, 2F            // if argc >= 0 - enter loop
        JMP     9F                  // otherwise skip the loop

1H      LDA     $255, Blank         // get address of blank string
        TRAP    0, Fputs, StdOut    // print space
        SUB     argc, argc, 1       // decrement argc
        ADD     argv, argv, 8       // increment argv
2H      LDOU    $255, argv, 8       // get address of argument
        TRAP    0, Fputs, StdOut    // print argument
        PBNZ    argc, 1B            // if arc != 0 - next iteration
9H      LDA     $255, NewLine       // get address of newline string
        TRAP    0, Fputs, StdOut    // print newline
        SET     $255, 0             // exit code
        TRAP    0, Halt, 0          // terminate

        .section .rodata
Blank   .asciz  " "  
NewLine .asciz  "\n"
Компилируем, запускаем:
$ mmix-gcc -nostdlib echo.S -o echo
$ mmix echo foo bar
foo bar

primes

Вычисляем первые 500 простых чисел. Файл primes.S:
#define Halt    0
#define Fputs   7
#define StdOut  1

#define L       500     // The number of primes to find
#define t       $255    // Temporary storage

n      GREG             // Local variables
q      GREG
r      GREG
jj     GREG
kk     GREG
pk     GREG

#define mm      kk      // Reuse the same register

        .data
PRIME1  .hword  2
        .space  2*L-2, 0
ptop    GREG    @
j0      GREG    PRIME1+2-@
BUF     .quad

        .text
        .global _init
_init   SET     n, 3
        SET     jj, j0
2H      STWU    n, ptop, jj
        INCL    jj, 2
3H      BZ      jj, 2F
4H      INCL    n, 2
5H      SET     kk, j0
6H      LDWU    pk, ptop, kk
        DIV     q, n, pk
        GET     r, rR
        BZ      r, 4B
7H      CMP     t, q, pk
        BNP     t, 2B
8H      INCL    kk, 2
        JMP     6B

2H      LDA     t, Title
        TRAP    0, Fputs, StdOut
        NEG     mm, 2
3H      ADD     mm, mm, j0
        LDA     t, Blanks
        TRAP    0, Fputs, StdOut
2H      LDWU    pk, ptop, mm
0H      GREG    #2030303030000000
        STOU    0B, BUF
        LDA     t, BUF+4
1H      DIV     pk, pk, 10
        GET     r, rR
        INCL    r, '0'
        STBU    r, t, 0
        SUB     t, t, 1
        PBNZ    pk, 1B
        LDA     t, BUF
        TRAP    0, Fputs, StdOut
        INCL    mm, 2*L/10
        PBN     mm, 2B
        LDA     t, NewLn
        TRAP    0, Fputs, StdOut
        CMP     t, mm, 2*(L/10-1)
        PBNZ    t, 3B
        TRAP    0, Halt, 0

        .section .rodata
Title   .ascii  "First Five Hundred Primes"  
NewLn   .asciz  "\n"  
Blanks  .asciz  "   "
Компилируем, запускаем:
$ mmix-gcc -nostdlib primes.S -o primes
$ mmix primes
First Five Hundred Primes
    0002 0233 0547 0877 1229 1597 1993 2371 2749 3187
    0003 0239 0557 0881 1231 1601 1997 2377 2753 3191
    0005 0241 0563 0883 1237 1607 1999 2381 2767 3203
    0007 0251 0569 0887 1249 1609 2003 2383 2777 3209
    0011 0257 0571 0907 1259 1613 2011 2389 2789 3217
    0013 0263 0577 0911 1277 1619 2017 2393 2791 3221
    0017 0269 0587 0919 1279 1621 2027 2399 2797 3229
    0019 0271 0593 0929 1283 1627 2029 2411 2801 3251
    0023 0277 0599 0937 1289 1637 2039 2417 2803 3253
    0029 0281 0601 0941 1291 1657 2053 2423 2819 3257
    0031 0283 0607 0947 1297 1663 2063 2437 2833 3259
    0037 0293 0613 0953 1301 1667 2069 2441 2837 3271
    0041 0307 0617 0967 1303 1669 2081 2447 2843 3299
    0043 0311 0619 0971 1307 1693 2083 2459 2851 3301
    0047 0313 0631 0977 1319 1697 2087 2467 2857 3307
    0053 0317 0641 0983 1321 1699 2089 2473 2861 3313
    0059 0331 0643 0991 1327 1709 2099 2477 2879 3319
    0061 0337 0647 0997 1361 1721 2111 2503 2887 3323
    0067 0347 0653 1009 1367 1723 2113 2521 2897 3329
    0071 0349 0659 1013 1373 1733 2129 2531 2903 3331
    0073 0353 0661 1019 1381 1741 2131 2539 2909 3343
    0079 0359 0673 1021 1399 1747 2137 2543 2917 3347
    0083 0367 0677 1031 1409 1753 2141 2549 2927 3359
    0089 0373 0683 1033 1423 1759 2143 2551 2939 3361
    0097 0379 0691 1039 1427 1777 2153 2557 2953 3371
    0101 0383 0701 1049 1429 1783 2161 2579 2957 3373
    0103 0389 0709 1051 1433 1787 2179 2591 2963 3389
    0107 0397 0719 1061 1439 1789 2203 2593 2969 3391
    0109 0401 0727 1063 1447 1801 2207 2609 2971 3407
    0113 0409 0733 1069 1451 1811 2213 2617 2999 3413
    0127 0419 0739 1087 1453 1823 2221 2621 3001 3433
    0131 0421 0743 1091 1459 1831 2237 2633 3011 3449
    0137 0431 0751 1093 1471 1847 2239 2647 3019 3457
    0139 0433 0757 1097 1481 1861 2243 2657 3023 3461
    0149 0439 0761 1103 1483 1867 2251 2659 3037 3463
    0151 0443 0769 1109 1487 1871 2267 2663 3041 3467
    0157 0449 0773 1117 1489 1873 2269 2671 3049 3469
    0163 0457 0787 1123 1493 1877 2273 2677 3061 3491
    0167 0461 0797 1129 1499 1879 2281 2683 3067 3499
    0173 0463 0809 1151 1511 1889 2287 2687 3079 3511
    0179 0467 0811 1153 1523 1901 2293 2689 3083 3517
    0181 0479 0821 1163 1531 1907 2297 2693 3089 3527
    0191 0487 0823 1171 1543 1913 2309 2699 3109 3529
    0193 0491 0827 1181 1549 1931 2311 2707 3119 3533
    0197 0499 0829 1187 1553 1933 2333 2711 3121 3539
    0199 0503 0839 1193 1559 1949 2339 2713 3137 3541
    0211 0509 0853 1201 1567 1951 2341 2719 3163 3547
    0223 0521 0857 1213 1571 1973 2347 2729 3167 3557
    0227 0523 0859 1217 1579 1979 2351 2731 3169 3559
    0229 0541 0863 1223 1583 1987 2357 2741 3181 3571
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org