Drucken einer Ganzzahl mit x86 32-Bit-Linux sys_write (NASM)

Ich bin neu in diesem Forum. Ich habe ein wenig Erfahrung mit Hochsprachen (wirklich wenig). Vor fast einem Monat dachte ich, es wäre eine gute Idee zu sehen, wie Assembly funktioniert. Nachdem ich mich für nasm (IA-32) unter Linux entschieden hatte, fing ich an, aus einem Tutorial zu lernen.

Nachdem ich es beendet hatte, habe ich versucht, ein einfaches Programm zu schreiben, in dem der Computer eine Liste mit 100 Zahlen (1 2 4 8 16 ...) druckt, aber ich konnte es nicht einmal richtig machen. Ich bekomme diese Ausgabe:

1PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(continues)...

Das Programm sieht so aus:

section .text
    global main
main:
    mov word [num], '1'
    mov ecx, 100
doubl:
    push ecx ; to push the loop counter

    mov eax, 4
    mov ebx, 1
    mov ecx, num
    mov edx, 1
    int 0x80

    sub ecx, 30h
    add ecx, ecx   ; shl ecx, 1
    add ecx, 30h
    mov [num], ecx   ; deleting this line I get  11111111111111111...

    pop ecx  ; to pop the loop counter
    loop doubl
exit:
    mov eax, 1
    int 0x80    
section .bss
num resw 2

Es sieht so aus, als ob der Fehler in dem Teil liegt, der die Zahl verdoppelt, oder in dem Teil, der sie in der Variablen 'num' speichert, aber ich verstehe nicht, warum es passiert und wie man es löst.

Kann mir übrigens jemand erklären, wann ich die eckigen Klammern genau verwenden soll? Gibt es eine Regel oder so? Das Tutorial nennt es "effektive Adresse" und es sieht so aus, als müsste ich die Klammern verwenden, um den Inhalt einer Variablen zu verschieben (oder damit etwas zu tun), anstatt ihn an die Adresse der Variablen zu senden. Trotzdem bin ich ziemlich verwirrt. Ich sehe es verwendet in:

mov ebx, count
inc word [ebx]
mov esi, value
dec byte [esi]

Aber ist es nicht offensichtlich, dass man den Inhalt des Registers erhöhen möchte (da es keine Adresse hat (oder?)?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage