nasmi586amd6420250814sortmmx8strings.asm

;; (C) David Vajda
;; 2025-08-15
;; nasm linux/debian gnu i586/amd64/i386 sort mmx strings´

global _start
    section .data
        toSortStr:      db      "Die MMX-Register"," sind 64 Bit bre","it, während die"," XMM-Register 12","8 Bit breit sind",". Die MMX-Befehl","ssatzarchitektur"," stellt acht 64-","Bit-Register (MM","0 bis MM7) zur V","erfügung. Die S","treaming SIMD Ex","tensions (SSE) e","rweitern diese a","uf 128 Bit mit d", 16 dup (0x00)
        toOutPutStr:    db      16 dup (0x00), 10, 13
        toSortStrLen:   dq      0x0000000000000000
        toCmpStrSrc:    dq      0x0000000000000000
        toCmpStrDes:    dq      0x0000000000000000
        toCmpStrDet:    dq      0x0000000000000000
    section .text
_start:
    mov rsi, toSortStr
loop1:
    movdqu xmm1, [rsi]
    movdqu xmm0, [toCmpStrSrc]
    pcmpeqb xmm0, xmm1
    movdqu [toCmpStrDes], xmm0
    mov rbx, [toCmpStrDes+0x00]
    cmp rbx, 0xffffffff
    je loop1end
    mov rbx, [toCmpStrDes+0x08]
    cmp rbx, 0xffffffff
    je loop1end

    movdqu xmm1, [rsi]
    movdqu [toOutPutStr], xmm1

    mov rdx, 0x12
    mov rcx, toOutPutStr
    mov rax, 0x04
    mov rbx, 0x01
    int 0x80

    add rsi, 0x10
    jmp loop1
loop1end:
    mov rsi, toSortStr
loop2:
    movdqu xmm1, [rsi]
    movdqu xmm0, [toCmpStrSrc]
    pcmpeqb xmm0, xmm1
    movdqu [toCmpStrDes], xmm0
    mov rbx, [toCmpStrDes+0x00]
    cmp rbx, 0xffffffff
    je loop2end
    mov rbx, [toCmpStrDes+0x08]
    cmp rbx, 0xffffffff
    je loop2end
    mov rdi, rsi
loop3:
    add rdi, 0x10
    movdqu xmm2, [rdi]
    movdqu xmm0, [toCmpStrSrc]
    pcmpeqb xmm0, xmm2
    movdqu [toCmpStrDes], xmm0
    mov rbx, [toCmpStrDes+0x00]
    cmp rbx, 0xffffffff
    je loop3end
    mov rbx, [toCmpStrDes+0x08]
    cmp rbx, 0xffffffff
    je loop3end
    movdqu xmm1, [rsi]
    movdqu xmm2, [rdi]
    pcmpgtb xmm1, xmm2
    movdqu [toCmpStrDet], xmm1
    mov rbx, [toCmpStrDet+0x00]
    ; cmp rbx, 0x00000000
    cmp rbx, 0xffffffff
    jge cond1
    mov rbx, [toCmpStrDet+0x08]
    ; cmp rbx, 0x00000000
    cmp rbx, 0xffffffff
    jge cond1
    movdqu xmm1, [rsi]
    movdqu xmm2, [rdi]
    movdqu [rsi], xmm2
    movdqu [rdi], xmm1
cond1:
    jmp loop3
loop3end:
    add rsi, 0x10
    jmp loop2
loop2end:
    mov rsi, toSortStr
loop4:
    movdqu xmm1, [rsi]
    movdqu xmm0, [toCmpStrSrc]
    pcmpeqb xmm0, xmm1
    movdqu [toCmpStrDes], xmm0
    mov rbx, [toCmpStrDes+0x00]
    cmp rbx, 0xffffffff
    je loop4end
    mov rbx, [toCmpStrDes+0x08]
    cmp rbx, 0xffffffff
    je loop4end

    movdqu xmm1, [rsi]
    movdqu [toOutPutStr], xmm1

    mov rdx, 0x12
    mov rcx, toOutPutStr
    mov rax, 0x04
    mov rbx, 0x01
    int 0x80

    add rsi, 0x10
    jmp loop4
loop4end:
    mov rsi, toSortStr

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