어셈블리어에서의 분기문
CMP dst, src (dst가 기준)
CMP 명령어를 이용해서 두 값을 비교한다. 비교를 한 결과물은 Flag Register에 저장된다.
JMP [label] 시리즈
CMP 명령의 결괏값에 따라 다양한 JMP 시리즈를 이용해서 특정 지점(label)으로 흐름을 넘긴다.
- JMP : 무조건 jump
- JE : JumpEquals 같으면 jump
- JNE : JumpNotEquals 다르면 jump
- JG : JumpGreater 크면 jump
등등
실습 진행
임의의 두 숫자를 지정해서 두 숫자가 같으면 덧셈, 다르면 뺄셈을 진행하는 코드이다.
rax, rbx에 각각 20이라는 숫자를 저장하고 비교했다.
두 숫자는 동일하기 때문에 je에 의해 LABEL_EQUAL로 점프하게 된다.
그 후에 add 명령을 통해 두 숫자를 더해주고 프린트 명령을 통해 출력한다.
정상적으로 덧셈 결괏값 40이 출력된 것을 확인할 수 있다.
이번에는 두 숫자가 다를 경우이다.
두 숫자가 다르기 때문에 je에서 흐름이 LABEL_EQUAL로 넘어가지 않고 바로 밑에 sub 명령이 실행된다.
sub에 의해 두 숫자를 뺄셈 해주고 jmp 명령을 통해 흐름이 LABEL_EQUAL_END로 넘어간다.
LABEL_EQUAL_END에 의해 add 명령은 실행되지 않으며 바로 프린트 명령이 실행되고 rax에 저장된
뺄셈 연산 결과를 출력한다.
임의의 숫자가 짝수면 1, 홀수면 0을 출력하는 코드이다.
div라는 나누기 연산을 사용해서 임의의 숫자(ax)를 2(bl)로 나누어 준다.
연산 결과는 al에 몫이 저장되고 ah에 나머지가 저장된다.
나머지와 0을 비교해서 둘이 같다면 짝수라는 소리이고 LABEL_EQUAL로 이동해서
mov al, 1을 실행한다. 그리고 al을 출력한다.
만약 나머지 값이 0과 같이 않다면 홀수라는 소리이고 mov al, 0가 실행되고 LABEL_EQUAL_END로 이동해서
그대로 al을 출력한다.
'프로그래밍 언어 공부 > 어셈블리어' 카테고리의 다른 글
배열과 주소 (0) | 2022.05.16 |
---|---|
반복문 (0) | 2022.05.16 |
메모리에 저장되는 순서 / 엔디언(Endian)이란 (0) | 2022.05.12 |
변수 선언 구조, 메모리 <-> 레지스터 데이터 저장 (0) | 2022.05.12 |
간단한 레지스터 기초 / SASM을 활용해 레지스터 사용해보기 (0) | 2022.05.11 |