101325__/tex/asm101325matrix.asm

;; teilweise ersetzt durch, logisch fehler, ansatz...

;; (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: db 10, 13
    ;;M3str: db
section .text

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


    mov rsi, M1
    mob 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
    dec cl
    cmp cl, 0x00
    jne matrixmul2


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



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

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


;; (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: db 10, 13
    ;;M3str: db
section .text

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


    mov rsi, M1
    mob 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
    dec cl
    cmp cl, 0x00
    jne matrixmul2


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



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

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


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

global _start
section .data
    M1: .db 4, 10, 13, 6, 4, 12, 5, 6, 6, 12, 15, 5, 2, 2, 6, 7, 8, 3, 8, 4, 14, 10, 1, 11, 4, 6, 11, 5, 10, 4, 11, 10, 3, 8, 6, 2, 4, 12, 7, 10, 9, 13, 3, 12, 3, 5, 11, 9, 13, 15, 10, 8, 9, 7, 1, 2, 10, 4, 15, 4, 6, 15, 14, 4
    ;; M2: .db 13, 7, 1, 11, 6, 4, 12, 13, 6, 7, 15, 11, 4, 8, 11, 3, 11, 1, 4, 11, 7, 8, 8, 14, 2, 15, 4, 4, 13, 14, 12, 10, 5, 11, 9, 2, 6, 12, 12, 13, 4, 5, 13, 2, 6, 13, 6, 10, 10, 9, 5, 14, 13, 11, 11, 2, 3, 15, 11, 1, 12, 3, 9, 13
    M2: 13, 6, 11, 2, 5, 4, 10, 3, 7, 7, 1, 15, 11, 5, 9, 15, 1, 15, 4, 4, 9, 13, 5, 11, 11, 11, 11, 4, 2, 2, 14, 1, 6, 4, 7, 13, 6, 6, 13, 12, 4, 8, 8, 14, 12, 13, 11, 3, 12, 11, 8, 12, 12, 6, 11, 9, 13, 3, 14, 10, 13, 10, 2, 13


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

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


    mov rsi, [M1]
    mov rdi, [M2]

    mov xmm0, [rsi]
    mov xmm1, [rdi]
    pmullw xmm1, xmm0
    add rsi, 0x08



    mov rdx, 66
    mov rcx, M3str
    mov rax, 0x04
    mov rbx, 0x01
    int 0x80

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