shumik1337

Зарегистрирован с 10.06.2020
Комментарии
10 июня 2020

Версия на Intel ASM под intel 8086. Очень маленькая по размеру бинарника. Имеет ограничение по размеру змейки - размер от 1 до 9

.MODEL  TINY

; link with flag /n

.DATA
    STEPS   DW 0, 0, 0, 0
    DELTAS  DW 2, 0, -2, 0

    ARR     DW 81 DUP(0)
    N       DW ?
    _10     DB 10
.CODE
print   PROC
    ADD     DL, 48
    MOV     AH, 02h
    INT     21h
    RET
print   ENDP

traverse    PROC
    MOV     CX, STEPS[BX]       ; КОЛИЧЕСТВО ШАГОВ
    MOV     AX, DELTAS[BX]      ; РАЗМЕР ШАГА
    _loop_travel:
        ADD     SI, AX          ; СЛЕДУЮЩИЙ ЭЛЕМЕНТ
        MOV     ARR[SI], DX     ; ПОМЕСТИЛИ ЧИСЛО
        INC     DX              ; УВЕЛИЧИЛИ ЧИСЛО
    LOOP    _loop_travel

    SUB     STEPS[BX], 2        ; В СЛЕДУЮЩИЙ РАЗ ПРОЙДЕМ НА 2 ШАГА МЕНЬШЕ
    ADD     BX, 2               ; СДВИНУЛИСЬ НА СЛЕДУЮЩИЙ ИНДЕКС
    RET
traverse    ENDP

main    PROC
    MOV     AX, 
    MOV     DS, AX

    ;---N=---
    MOV     DL, 'N' - 48
    CALL    print

    MOV     DL, '=' - 48
    CALL    print
    ;---N=---

    ;AX = N
    DEC     AH
    INT     21h
    SUB     AX, 304

    MOV     N, AX

    ; AX = N*2
    SAL     AX, 1
    MOV     DELTAS + 2, AX  ; ВПРАВО ПРОПУСКАЕМ СТРОКИ
    NEG     AX
    MOV     DELTAS + 6, AX  ; ВЛЕВО ПРОПУСКАЕМ СТРОКИ

    MOV     DX, 1           ; САМИ ЧИСЛА 1-N^2
    MOV     SI, -2          ; ИНДЕКС В МАССИВЕ

    ; ИНИЦИАЛИЗИРУЕМ КОЛИЧЕСТВО ШАГОВ В КАЖДУЮ СТОРОНУ
    MOV     AX, N
    MOV     STEPS, AX       ; ВПРАВО СНАЧАЛА N ШАГОВ

    DEC     AX
    MOV     STEPS+2, AX     ; ВНИЗ СНАЧАЛА N-1 ШАГ
    MOV     STEPS+4, AX     ; ВЛЕВО СНАЧАЛА N-1 ШАГ

    DEC     AX
    MOV     STEPS+6, AX     ; ВВЕРХ N-2 ШАГА

    _fill_loop:
        ; LEFT=>RIGHT
        MOV     BX, 0
        CALL    traverse

        ; UP=>DOWN
        ;MOV     BX, 2
        CMP     STEPS[BX], 0
        JE      _print_mat
        CALL    traverse

        ; LEFT<=RIGHT
        ;MOV     BX, 4
        CALL    traverse

        ; UP<=DOWN
        ;MOV     BX, 6
        CMP     STEPS[BX], 0
        JE      _print_mat
        CALL    traverse
    JMP     _fill_loop

    _print_mat:
    MOV     SI, 0
    MOV     CX, N
    _print_outer:
        PUSH    CX

        MOV     DL, 10-48
        CALL    print

        MOV     CX, N
        _print_inner:
            MOV     AX, ARR[SI]
            DIV     _10
            MOV     BX, AX

            MOV     DL, BL
            CALL    print

            MOV     DL, BH
            CALL    print

            MOV     DL, ' ' - 48
            CALL    print

            ADD     SI, 2
        LOOP    _print_inner
        POP     CX

    LOOP    _print_outer
    MOV     AX, 4C00h
    INT     21h
main    ENDP
END     main
Ответить