diff --git a/2015/01/main.asm b/2015/01/main.asm index 0ae834c..2b5ecbd 100644 --- a/2015/01/main.asm +++ b/2015/01/main.asm @@ -8,37 +8,60 @@ global _walkFloors _walkFloors: enter 0,0 push ebx + push edi + + ; [ ebp + 8 ] = int currentFloor + ; [ ebp + 12 ] = int* totalInstructionCounter + ; [ ebp + 16 ] = int* firstEnteredBasement + ; [ ebp + 20 ] = char* instructions + ; [ ebp + 24 ] = size_t instructionCount mov eax, [ ebp + 8 ] ; eax = currentFloor - mov edx, [ ebp + 12 ] ; edx = char* instructions - mov ecx, [ ebp + 16 ] ; ecx = size_t instructionCount - - jcxz .end ; skip to end if there are no instructions - - inc ecx ; increment instruction count by 1 - ; because loop instruction uses prefix decrement + mov edx, [ ebp + 20 ] ; edx = instructions + xor ecx, ecx ; ecx = 0 .instructionLoop: + cmp ecx, [ ebp + 24 ] ; check if we went past instructionCount + jge .end ; if so, we are done here + inc ecx ; otherwise, increment instruction counter and continue + mov bl, [ edx ] ; bl = instructions[edx] inc edx ; edx++ - cmp bl, '(' ; left parenthesis... - je .moveUpFloor ; moves up a floor - + cmp bl, '(' ; left parenthesis... + je .moveUpFloor ; moves up a floor cmp bl, ')' ; right parenthesis... je .moveDownFloor ; moves down a floor - - jmp .end ; unknown character skips to the end + jmp .end ; unknown character skips to the end .moveUpFloor: inc eax - loop .instructionLoop + jmp .instructionLoop .moveDownFloor: dec eax - loop .instructionLoop + cmp eax, -1 ; check if we entered the basement + je .onEnteredBasement + jmp .instructionLoop + + .onEnteredBasement: + mov ebx, [ ebp + 16 ] ; ebx = &firstEnteredBasement + cmp dword [ ebx ], -1 ; check if firstEnteredBasement has not been set yet + jne .instructionLoop ; if it was already set, go to next instruction + + mov edi, [ ebp + 12 ] ; edi = &totalInstructionCounter + mov edi, [ edi ] ; edi = totalInstructionCounter + add edi, ecx ; add current instruction counter to the total + mov dword [ ebx ], edi ; set firstEnteredBasement to the total + jmp .instructionLoop .end: + mov edi, [ ebp + 12 ] ; edi = &totalInstructionCounter + mov ebx, [ edi ] ; ebx = totalInstructionCounter + add ebx, ecx ; add current instruction counter to the total + mov dword [ edi ], ebx ; set totalInstructionCounter to the new total + + pop edi pop ebx leave ret diff --git a/2015/01/main.c b/2015/01/main.c index 613fbd8..db521d4 100644 --- a/2015/01/main.c +++ b/2015/01/main.c @@ -2,7 +2,7 @@ #define BUFFER_SIZE 256 -int walkFloors(int currentFloor, char* instructions, size_t instructionCount); +int walkFloors(int currentFloor, int* totalInstructionCounter, int* firstEnteredBasement, char* instructions, size_t instructionCount); int main() { FILE* file; @@ -13,6 +13,8 @@ int main() { } int floor = 0; + int totalInstructionCounter = 0; + int firstEnteredBasement = -1; char buffer[BUFFER_SIZE]; while (!feof(file)) { @@ -24,10 +26,11 @@ int main() { return 1; } - floor = walkFloors(floor, buffer, readBytes); + floor = walkFloors(floor, &totalInstructionCounter, &firstEnteredBasement, buffer, readBytes); } fclose(file); - printf("Final floor: %d", floor); + printf("Final floor: %d\n", floor); + printf("First entered basement: %d\n", firstEnteredBasement); return 0; }