110825_/tex/asm101625matrix.asm

;; (c) david vajda
;; 10/13/25
;; matrix multiplikation nasm x86, i586, amd64, ia64, ...

global _start
section .data
    ;; (xmm)-register xmm_i sind 128 bit, schon klar
    ;; muss man ueberlegen. weil, ob ich 16 oder 8 xmm register habe, muss ich gucken
    ;; und wenn es nur 8 sind, wie bei mm7 .. mm0, dann muss gucken, weil die 64 bit muessen erhalten bleiben
    ;; da sich allerdings herausgestellt hat, dass, folgendes: das bisher 4 bloecke a 64 bit sind, allerdings
    ;; 8 gebraucht sind, fuegen wir die alten zahlen wieder ein und machen die ungepackt, am besten mit bash
    ;; programmieren

    ;; M1: dw 0x00d6, 0x0056, 0x00f5, 0x0067,  0x0084, 0x001b, 0x00b5, 0x00ba,  0x0062, 0x007a, 0x003c, 0x00b9,  0x00a8, 0x0012, 0x00f4, 0x00e4
    ;; M2: dw 0x00b2, 0x00a3, 0x001f, 0x009f, 0x0044, 0x005b, 0x00b4, 0x00e1, 0x007d, 0x00dc, 0x008e, 0x00b3, 0x008c, 0x00b9, 0x00ea, 0x002d

    ;; M1: .dw 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010
    ;; M2: .dw 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010

   ;; M1: .db 0x4a, 0xd6, 0x4c, 0x56, 0x6c, 0xf5, 0x22, 0x67, 0x83, 0x84, 0xea, 0x1b, 0x46, 0xb5, 0xa4, 0xba, 0x38, 0x62, 0x4c, 0x7a, 0x9d, 0x3c, 0x35, 0xb9, 0xdf, 0xa8, 0x97, 0x12, 0xa4, 0xf4, 0x6f, 0xe4
    ;; M2: .db 0xd6, 0xb2, 0x54, 0xa3, 0x77, 0x1f, 0xb5, 0x9f, 0x1f, 0x44, 0x9d, 0x5b, 0xbb, 0xb4, 0x22, 0xe1, 0x64, 0x7d, 0x66, 0xdc, 0x48, 0x8e, 0xcd, 0xb3, 0xcb, 0x8c, 0xc6, 0xb9, 0xd3, 0xea, 0xda, 0x2d

;;cat tosed101425.tt | sed 's/0x\([a-z0-9][a-z0-9]\)\([a-z0-9][a-z0-9]\)/0x\1, 0x\2/g'
;; nach dem sed ist immer noch ein fehler drin, so, weil die sollen ungepackt, das heisst, die brauchen fuehrend zwei nullen

   M1: dw 0x004a, 0x00d6, 0x004c, 0x0056, 0x006c, 0x00f5, 0x0022, 0x0067, 0x0083, 0x0084, 0x00ea, 0x001b, 0x0046, 0x00b5, 0x00a4, 0x00ba, 0x0038, 0x0062, 0x004c, 0x007a, 0x009d, 0x003c, 0x0035, 0x00b9, 0x00df, 0x00a8, 0x0097, 0x0012, 0x00a4, 0x00f4, 0x006f, 0x00e4
    M2: dw 0x00d6, 0x00b2, 0x0054, 0x00a3, 0x0077, 0x001f, 0x00b5, 0x009f, 0x001f, 0x0044, 0x009d, 0x005b, 0x00bb, 0x00b4, 0x0022, 0x00e1, 0x0064, 0x007d, 0x0066, 0x00dc, 0x0048, 0x008e, 0x00cd, 0x00b3, 0x00cb, 0x008c, 0x00c6, 0x00b9, 0x00d3, 0x00ea, 0x00da, 0x002d
    Mall: dw 512 DUP (0x00)
    M3: dw 190 DUP (0x00)

    ;M3: db 10, 13
    ;;M3str: db
section .text
    _start:

    ;; so der erste schritt ist das zu transformieren ...
    ;; ok, ich transformiere die matrix mal selber und zwar per hand
    ;;


    mov rsi, M1
    mov rbp, Mall
    mov cl, 0x08
    mov ch, 0x08
matrixmul1:
    ;;movq xmm0, [rsi]
    ;;movq xmm1, [rdi]
    ;;pmullw xmm1, xmm0
    ;;movq [rdi], xmm1
    movq mm0, [rsi]
    mov rdi, M2
    mov cl, 0x08
matrixmul2:
    movq mm1, [rdi]
    pmullw mm1, mm0
    add rdi, 0x08
    movq [rbp], mm1
    add rbp, 0x08
    dec cl
    cmp cl, 0x00
    jne matrixmul2


    add rsi, 0x08
    dec ch
    cmp ch, 0x00
    jne matrixmul1

    movq rsi, M2
    movq mm0, [rsi]
    mov rcx, 7
    mov rdi, M3

matrixadd2:
    add rsi, 8
    mov mm1, [rsi]
    paddw mm0, mm1
    dec rcx
    je matrixadd2

    mov rdx, 1024
    mov rcx, Mall
    mov rax, 0x04
    mov rbx, 0x01
    int 0x80

    mov rax, 0x01
    mov rbx, 0x00
    int 0x80