;; (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