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?)?