1                                  ; loopint_64.asm  code loopint.c for nasm 
     2                                  ; /* loopint_64.c a very simple loop that will be coded for nasm */
     3                                  ; #include <stdio.h>
     4                                  ; int main()
     5                                  ; {
     6                                  ;   long int dd1[100]; // 100 could be 3 gigabytes
     7                                  ;   long int i;        // must be long for more than 2 gigabytes
     8                                  ;   dd1[0]=5; /* be sure loop stays 1..98 */
     9                                  ;   dd1[99]=9;
    10                                  ;   for(i=1; i<99; i++) dd1[i]=7;
    11                                  ;   printf("dd1[0]=%ld, dd1[1]=%ld, dd1[98]=%ld, dd1[99]=%ld\n",
    12                                  ;           dd1[0], dd1[1], dd1[98],dd1[99]);
    13                                  ;   return 0;
    14                                  ;}
    15                                  ; execution output is dd1[0]=5, dd1[1]=7, dd1[98]=7, dd1[99]=9
    16                                   
    17                                  	section	.bss
    18 00000000 <res 00000320>          dd1:	resq	100			; reserve 100 long int
    19 00000320 <res 00000008>          i:	resq	1			; actually unused, kept in register
    20                                  
    21                                          section .data			; Data section, initialized variables
    22 00000000 6464315B305D3D256C-     fmt:    db "dd1[0]=%ld, dd1[1]=%ld, dd1[98]=%ld, dd1[99]=%ld",10,0
    23 00000009 642C206464315B315D-
    24 00000012 3D256C642C20646431-
    25 0000001B 5B39385D3D256C642C-
    26 00000024 206464315B39395D3D-
    27 0000002D 256C640A00         
    28                                  	
    29                                          extern	printf			; the C function, to be called
    30                                  
    31                                  	section .text
    32                                  	global	main
    33 00000000 55                      main:	push	rbp			; set up stack
    34                                  
    35 00000001 48C70425[00000000]-     	mov	qword [dd1],5	   	; dd1[0]=5;  memory to memory
    36 00000009 05000000           
    37 0000000D 48C70425[18030000]-     	mov	qword [dd1+99*8],9 	; dd1[99]=9; indexed 99 qword
    38 00000015 09000000           
    39                                  
    40 00000019 BF08000000              	mov 	rdi, 1*8		; i=1; index, will move by 8 bytes
    41 0000001E 48C787[00000000]07-     loop1:	mov 	qword [dd1+rdi],7	; dd1[i]=7;
    42 00000026 000000             
    43 00000029 4883C708                	add	rdi, 8			; i++;  8 bytes 
    44 0000002D 4881FF18030000          	cmp	rdi, 8*99		; i<99
    45 00000034 75E8                    	jne	loop1			; loop until incremented i=99
    46                                  	
    47 00000036 48BF-                   	mov	rdi, fmt		; pass address of format
    48 00000038 [0000000000000000] 
    49 00000040 488B3425[00000000]      	mov	rsi, qword [dd1]	; dd1[0]   first list parameter
    50 00000048 488B1425[08000000]      	mov	rdx, qword [dd1+1*8]	; dd1[1]   second list parameter
    51 00000050 488B0C25[10030000]      	mov	rcx, qword [dd1+98*8]	; dd1[98]  third list parameter
    52 00000058 4C8B0425[18030000]      	mov	r8,  qword [dd1+99*8]	; dd1[99]  fourth list parameter
    53 00000060 B800000000              	mov	rax, 0			; no xmm used
    54 00000065 E8(00000000)                    call    printf			; Call C function
    55                                  
    56 0000006A 5D                      	pop	rbp			; restore stack
    57 0000006B B800000000              	mov	rax,0			; normal, no error, return value
    58 00000070 C3                      	ret				; return 0;