assemblyx86nasm32-bit

Difference between "mov eax, [num]" and "mov eax, num"


I am a beginner and writing assembly program to print numbers from 1 to 9 using this code:

section .text    
   global _start                    
_start:                     
   mov ecx,10    
   mov eax, '1'     
l1:    
   mov [num], eax    
   mov eax, 4    
   mov ebx, 1    
   push ecx     
   mov ecx, num            
   mov edx, 1            
   int 0x80     
   mov eax, [num]    
   sub eax, '0'    
   inc eax    
   add eax, '0'    
   pop ecx    
   loop l1      
   mov eax,1             ;system call number (sys_exit)    
   int 0x80              ;call kernel    
section .bss    
num resb 1

Here we have following three statements:

  1. mov [num], eax
  2. mov ecx , num
  3. mov eax, [num]

I want to know why we should use mov ecx,num rather than mov ecx,[num]


Solution

  • If you are familiar with C/C++, here is an explanation.

    mov ecx, num is equivalent to:

    int num;
    ecx = & num;
    

    while mov ecx, [num] is equivalent to :

    int num;
    ecx = num;
    

    Here, the reason for the line mov ecx, num is because you are calling the system function int 0x80, which requires that ecx contains the address of your numbers. So it should be like that.