;; (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
_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
mov rdx, 1024
mov rcx, Mall
mov rax, 0x04
mov rbx, 0x01
int 0x80
mov rax, 0x01
mov rbx, 0x00
int 0x80