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 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 dd1: resq 100 ; reserve 100 long int 19 00000320 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;