Imprimindo um número inteiro com x86 Linux sys_write (NASM) x86

Eu sou novo neste fórum. Eu tenho um pouco de experiência com idiomas de alto nível (muito pouco). Há quase um mês, pensei que seria uma boa ideia ver como a montagem funcionava. Depois de escolher o nasm (IA-32) no linux, comecei a aprender com um tutorial.

Agora, depois de finalizá-lo, tentei escrever um programa simples em que o computador imprimisse uma lista de 100 números (1 2 4 8 16 ...), mas não consegui acertar. Eu recebo esta saída:

1PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(continues)...

O programa é este:

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

Parece que o erro está na parte que dobra o número ou no que o armazena na variável 'num', mas não entendo por que isso acontece e como resolvê-lo.

A propósito, alguém pode me explicar quando usar exatamente os colchetes? Existe uma regra ou algo assim? O tutorial chama de "endereço efetivo" e parece que eu tenho que usar os colchetes quando quero mover (ou fazer alguma coisa com) o conteúdo de uma variável em vez de fazê-lo no endereço da variável. No entanto, estou bastante confuso sobre isso. Eu o vejo usado em:

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

Mas não é óbvio que se deseja incrementar o conteúdo do registro (já que ele não possui um endereço (ou não?)?

questionAnswers(1)

yourAnswerToTheQuestion