// File: navrajsaini[P]PL_Compiler_design_project/Assembler.cpp
// Function: Assembler::firstPass()
void Assembler::firstPass()
{
   // Start at address 0 (not 1 as I had previously thought)
   currentAddress = 0;
   string nextop;
   (*insource) >> nextop;
   // Loop until we find the ENDPROG operation.
   for (;;) {
      // Record the current address in the label table.
      if (nextop == "DEFADDR") {
	 int index;
	 (*insource) >> index;
	 labelTable[index] = currentAddress;
	 (*insource) >> nextop;
      }
      // Record the associated value in the label table.
      else if (nextop == "DEFARG") {
	 int index, value;
	 (*insource) >> index >> value;
	 labelTable[index] = value;
	 (*insource) >> nextop;
      }
      // Stop when we find ENDPROG.
      else if (nextop == "ENDPROG")
	 return;
      else if (nextop == "ARROW" || nextop == "ASSIGN" || nextop == "BAR" ||
	       nextop == "CONSTANT" || nextop == "FI" || nextop == "READ" ||
	       nextop == "WRITE") {
	 // Skip one machine words.
	 (*insource) >> nextop;
	 (*insource) >> nextop;
	 currentAddress += 2;
      }
      else if (nextop == "CALL" || nextop == "INDEX" || nextop == "PROC" ||
	       nextop == "PROG" || nextop == "VARIABLE") {
	 // Skip two machine words.
	 (*insource) >> nextop;
	 (*insource) >> nextop;
	 (*insource) >> nextop;
	 currentAddress += 3;
      }
      else {
	 // just get the next machine word.
	 (*insource) >> nextop;
	 currentAddress++;
      }
   }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x50(%rbp)
movl $0x0, 0x7d0(%rax)
leaq -0x28(%rbp), %rdi
movq %rdi, -0x48(%rbp)
callq 0x22a0
movq -0x50(%rbp), %rax
movq -0x48(%rbp), %rsi
movq 0x7d8(%rax), %rdi
callq 0x2250
jmp 0x1bc41
jmp 0x1bc43
leaq 0x3bbc(%rip), %rsi      # 0x1f806
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x51(%rbp)
jmp 0x1bc58
movb -0x51(%rbp), %al
testb $0x1, %al
jne 0x1bc61
jmp 0x1bcb9
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x38(%rbp), %rsi
callq 0x2120
jmp 0x1bc77
movq -0x50(%rbp), %rax
movl 0x7d0(%rax), %edx
movslq -0x38(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bc9a
jmp 0x1bf8e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x2130
jmp 0x1bf93
leaq 0x3b3f(%rip), %rsi      # 0x1f7ff
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x52(%rbp)
jmp 0x1bcce
movb -0x52(%rbp), %al
testb $0x1, %al
jne 0x1bcd7
jmp 0x1bd25
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x3c(%rbp), %rsi
callq 0x2120
movq %rax, -0x60(%rbp)
jmp 0x1bcf1
movq -0x60(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x2120
jmp 0x1bd00
movq -0x50(%rbp), %rax
movl -0x40(%rbp), %edx
movslq -0x3c(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bd20
jmp 0x1bf8c
leaq 0x3acb(%rip), %rsi      # 0x1f7f7
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x61(%rbp)
jmp 0x1bd3a
movb -0x61(%rbp), %al
testb $0x1, %al
jne 0x1bd43
jmp 0x1bd52
leaq -0x28(%rbp), %rdi
callq 0x2130
addq $0x70, %rsp
popq %rbp
retq
leaq 0x3c2c(%rip), %rsi      # 0x1f985
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x62(%rbp)
jmp 0x1bd67
movb -0x62(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1bd74
leaq 0x3bc1(%rip), %rsi      # 0x1f93c
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x63(%rbp)
jmp 0x1bd89
movb -0x63(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1bd96
leaq 0x3bee(%rip), %rsi      # 0x1f98b
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x64(%rbp)
jmp 0x1bdab
movb -0x64(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1bdb4
leaq 0x3c2e(%rip), %rsi      # 0x1f9e9
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x65(%rbp)
jmp 0x1bdc9
movb -0x65(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1bdd2
leaq 0x3b97(%rip), %rsi      # 0x1f970
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x66(%rbp)
jmp 0x1bde7
movb -0x66(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1bdf0
leaq 0x3b24(%rip), %rsi      # 0x1f91b
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x67(%rbp)
jmp 0x1be05
movb -0x67(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1be0e
leaq 0x3b17(%rip), %rsi      # 0x1f92c
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x68(%rbp)
jmp 0x1be23
movb -0x68(%rbp), %al
testb $0x1, %al
jne 0x1be2c
jmp 0x1be70
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1be42
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1be58
movq -0x50(%rbp), %rax
movl 0x7d0(%rax), %ecx
addl $0x2, %ecx
movl %ecx, 0x7d0(%rax)
jmp 0x1bf88
leaq 0x3af1(%rip), %rsi      # 0x1f968
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x69(%rbp)
jmp 0x1be85
movb -0x69(%rbp), %al
testb $0x1, %al
jne 0x1bf06
jmp 0x1be8e
leaq 0x3b96(%rip), %rsi      # 0x1fa2b
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x6a(%rbp)
jmp 0x1bea3
movb -0x6a(%rbp), %al
testb $0x1, %al
jne 0x1bf06
jmp 0x1beac
leaq 0x3a5d(%rip), %rsi      # 0x1f910
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x6b(%rbp)
jmp 0x1bec1
movb -0x6b(%rbp), %al
testb $0x1, %al
jne 0x1bf06
jmp 0x1beca
leaq 0x3929(%rip), %rsi      # 0x1f7fa
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x6c(%rbp)
jmp 0x1bedf
movb -0x6c(%rbp), %al
testb $0x1, %al
jne 0x1bf06
jmp 0x1bee8
leaq 0x3b10(%rip), %rsi      # 0x1f9ff
leaq -0x28(%rbp), %rdi
callq 0x10ea0
movb %al, -0x6d(%rbp)
jmp 0x1befd
movb -0x6d(%rbp), %al
testb $0x1, %al
jne 0x1bf06
jmp 0x1bf5d
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bf1c
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bf32
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bf48
movq -0x50(%rbp), %rax
movl 0x7d0(%rax), %ecx
addl $0x3, %ecx
movl %ecx, 0x7d0(%rax)
jmp 0x1bf86
movq -0x50(%rbp), %rax
movq 0x7d8(%rax), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2250
jmp 0x1bf73
movq -0x50(%rbp), %rax
movl 0x7d0(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x7d0(%rax)
jmp 0x1bf88
jmp 0x1bf8a
jmp 0x1bf8c
jmp 0x1bf8e
jmp 0x1bc43
movq -0x30(%rbp), %rdi
callq 0x2340
nopl (%rax)