본문 바로가기

자료구조, 알고리즘/x64 assembly

(5)
쌩 어셈블리로 두수 더하기 회장님의 권유로 해본 동아리발표에서 마지막에 짤막하게 extern를 통해 C언어 함수를 사용하여 코드를 작성하는 것과 syscall에만 의존하여 코드를 작성하는 것을 비교하기 위해 넣어봤던 코드입니다 사실 해당 코드도 다 설명하고 싶었는데 그때 당시 너무 바쁜 관계로 준비가 너무 부실해서 그땐 해당 코드 설명은 스킵했습니다.... 발표하고 너무...현타가 하.. 인턴 + 교양팀플 + 학과 과제 및 수업 + 포너블팀 과제 + 포너블팀 발표 + 동아리발표... + 드림핵(?) 정신나간 일정에서 돌아와서 이제라도 정리해보려고 합니다 코드만 단순히 보았을때 두개의 양수에 대한 합을 출력해주는 코드입니다 단순 비교를 위한 코드였기도 하고 구현에만 치중하다보니 코드의양 또한 너무 늘어난 것 같습니다 그래도 백준문제..
백준 1157 단어 공부 문자열(대소문자 알파벳)을 입력하고 가장 많이 사용된 알파벳을 대문자로 출력해주는 코드를 작성하면 됩니다 이때 A, a를 따로 구분 짓지 않고 동일하게 봅니다 여기서 만약 가장 많이 사용된 횟수가 동일한 알파벳이 존재한다면 ?를 출력하면 됩니다 예제 입력에 따른 출력을 보면 다음과 같습니다 우선 코드를 보기 전에 결론부터 말하면.... .....이게 조금 그런 게 제 환경에서 질문 올라오는 반례들도 다 돌려봐도 올바르게 나왔는데 런타임 에러가 나왔습니다 정확히는 모르지만 처음 런타임 에러가 나온건 .data영역에 문자열을 입력받아서 그렇지 않을까 싶어 .bss영역으로도 옮겨보고 이것저것 해봤는데 결국 C언어로 다른 분들이 문제 푼 코드를 보고 아... 스택에 넣으면 되겠구나 싶어서 바꿨는데!! 런타임 에..
백준 2675 문자열 반복 수행할 case N를 입력하고 각각이 case에서는 입력한 문자열의 각 문자들을 입력한 정수만큼 반복하여 출력시켜주면 됩니다 어셈블리로 삼중으로 반복문을 사용해보니까 코드를 헷갈리는 경우가 있었는데 주석의 중요성을 다시금 느끼는 것 같습니다 global main extern scanf extern printf section .text main: push rbp mov rbp, rsp sub rsp, 0x30 xor rax, rax mov [rbp-0x8], rax; N mov [rbp-0x10], rax; input mov [rbp-0x18], rax; for i mov [rbp-0x20], rax mov rdi, input_N lea rsi, [rbp-0x8] call scanf; intput N lo..
백준 25577번 숫자의 개수 문제를 짧게 설명하면 100보다 크고 100보다 작은 자연수 A, B, C입력하고 이를 곱하여 나온 결과에 0 ~ 9가 포함되어있는 횟수를 각각이 출력하는 프로그램을 작성하는 것입니다 global main extern scanf extern printf section .text digit_check: push rbp mov rbp, rsp sub rsp, 0x10 xor rax, rax mov [rbp-0x8], rax ; for loop mov [rbp-0x10], rax mov [rbp-0x10], rdi ; argv_1 check_loop: mov rax, [rbp-0x8] mov rcx, [rbp-0x10] cmp rcx, rax je end_func inc qword[rbp-0x8] jmp ch..
백준 2741 N 찍기 자연수 N을 입력받고 N까지의 수를 1부터 차례대로 출력하는 코드를 작성하면 됩니다 어.. 뭐 기초라 뭐 말할 도 없지만 64bit 어셈블리에서는 스택을 16byte로 정렬해주어야 하는데(SSE instruction 때문) 입력하는 변수 그리고 루프 돌며 출력할 변수로 스택 또한 0x10(16byte)만 사용하면 되기 때문에 문제없이 작성하였습니다 코드의 주요한 것들만 보면 rbp-0x10을 1로 초기화해주고 rbp-0x8에 자연수 N을 입력받게 합니다 그리고 rbp-0x10을 rbp-0x8과 비교하여 rbp-0x10이 rbp-0x8보다 크게되면 _exit에서 코드를 종료하게 하며 같지 않게 되면 rbp-0x10의 값을 출력하게 됩니다