title: Displaying a number in x86-64 assembly with only Linux system calls
body: <p><a href="https://stackoverflow.com/questions/37634431/displaying-a-number-assembly-code-not-working-linux-x64-nasm">Previous version of this question</a> (that question originally had a different problem, even though the code there is now the same as the code in this question)</p>
  
  <hr>
  
  <p>I am trying to make code to display a number on console in Linux 64 bit NASM, <strong>without</strong> the use of c/c++ functions (pure assembly). The code compiles and links fine but it will not give output...</p>
  
  <p>It displays just newline for some time and then displays '7' forever. I am new to Assembly so I don't know what is wrong. Please help... Here is the code:</p>
  
  <pre><code>section .data
      num:        dq      102 ;my default number to get the reverse of (for now)
      nl:         db      0x0a
      nlsize:     equ     $-nl
      ten:        dq      10
  
  section .bss
      rem:        resq        1
      remsize:    equ     $-rem
  
  section .text
      global _start
  
  _start:
  
      cmp qword [num], 0
          jng _exit       ;jump to _exit if num is not greater than 0
      mov rax, [num]      ;move the number to rax
      mov rbx, [num]      ;move the number to rbx as well so that i have original number in register to subtract and get the remainder
      mov rcx, [ten]      ;move 10 to rcx to be the divisor
      div rcx             ;divide number in rax by 10
      mov [num], rax      ;get the quotient to get the remaining number for quotient
      mul rcx             ;multiply number in rax by 10
      sub rbx, rax        ;subtract rbx - rax and store the value in rax (right?)
      mov [rem], rbx      ;get the remainder from rax. this must be done right after div (WHY??????????)
      call _disprem       ;call _disprem to display the remainder... call returns the flow back to the caller right?
      jmp _start          ;get to the loop again
  
  _exit:
      mov rax, 60
      mov rdi, 0
      syscall
  
  _newl:
      mov rax, 1
      mov rdi, 1
      mov rsi, nl
      mov rdx, nlsize
      syscall
      ret
  
  _disprem:
      mov rax, 1
      mov rdi, 1
      add qword [rem], 0x0000000000000030 ;since the rem variable is quadword (64 bit)
      mov rsi, rem    ;for getting ascii value (48 is ascii 0 in decimal) to convert the rem to character
      mov rdx, remsize
      syscall
      sub qword[rem], 0x0000000000000030 ;get me my original number back plz thanks
      call _newl
      ret
  </code></pre>