사칙연산
사칙연산에 앞서 어셈블리어는 아닌 운영체제에서 제공하는 입출력 api에 대해 간단히 알고 넘어가자.
GET_DEC = 숫자를 입력 받겠다.
PRINT_DEC = 숫자를 출력하겠다.
NEWLINE = 개행
사용 법은 밑에 사진과 같다.
GET_DEC 1, al 은 1 byte 만큼 input을 받아서 al에 저장하겠다는 의미이며, GET_DEC 1, num은 1 byte 만큼 input에서 받아서 num 변수에 저장하겠다는 의미이다. 여기서 data를 사용하지 않고 bss를 사용한 것은 데이터를 입력 받을 것이기 때문에 초기화를 하지 않아도 되기 때문이다.
더하기
더하기는 add 라는 명령어로 사용된다. add a, b 형식으로 이루어져있다.
여기서 주의해야할 점은 a는 메모리 or 레지스터 만 가능하며 b는 메모리 or 레지스터 or 값이 가능하다.
단 a와 b 모두 메모리일 경우는 불가능하다.
빼기
빼기는 sub 명렁어로 add와 정확히 동일하기 때문에 그냥 넘어가기로 한다.
곱하기
곱하기 연산은 덧셈이나 빼기처럼 간단히 이루어지지 않는다. 명령어로는 mul reg 로 이루어져 있다.
5 * 8 = 40으로 40이 제대로 출력된다. 곱셈 연산은 쉽게 되지 않는다. 특정한 규칙으로 이루어져 있다. 이는 나누기도 동일하다.
나누기
나누기 연산은 div reg로 이루어져 있다.
100 / 3 의 몫인 33은 al에 저장되어있고 그 후 ah에 나머지가 저장되어 있는데 PRINT_DEC로 ah를 출력할 수 없으므로 al에 값을 복사한 후 al을 출력한 것이다.
이것들을 외울 필요는 없지만 이런 문법이 있구나만 알고 있으면 된다.
Shift 연산
쉬프트 연산은 매우 간단하다 비트를 원하는 만큼 왼쪽, 오른쪽으로 미루는것을 의미한다. 단 최상위 비트(마이너스를 나타냄)은 움직이지 않는다는 것을 명심하자.
결과를 보면 12345678에서 8비트를 왼쪽으로 미뤘더니 34567800으로 되었다. 그리고 다시 오른쪽으로 8비트를 미뤘는데 345678로 되어있는것을 확인할 수 있다. 왜 그럴까??
바로 12345678에서 8 비트를 미루는 순간 12는 분실된다. 그리고 다시 오른쪽으로 미뤘을 때 분실된 값이 복원되지 않기 때문이다.
그럼 쉬프트 연산을 왜할까? 그 이유는 한칸을 왼쪽으로 미룰 때 마다 원래 값에서 2배가 커지기 때문이다. 즉, 곱셈 나눗셈을 위에처럼 어렵게 하지 않아도 된다.
또는 서버를 구현할 때 object ID를 만들어 줄 때, 또는 내가 가지고 있는 아이템의 여부 등을 확인할 수 있는 매우 중요한 역할이다.
논리 연산
xor을 같은 값으로 2번하면 원래 자신으로 돌아오고 xor을 자기 자신이랑 할경우 그 값은 항상 0이된다. 이 점에 대해 꼭 알고가자.
'C++ > 기초' 카테고리의 다른 글
[C++] 데이터 가지고 놀기 - 1 (정수, 불리언, 부동소수점, 문자열) (1) | 2023.11.22 |
---|---|
[Assemble] SASM - 5 (1) | 2023.11.21 |
[Assemble] SASM - 4 (0) | 2023.11.21 |
[Assemble] SASM - 2 (0) | 2023.11.21 |
[Assemble] SASM - 1 (2) | 2023.11.20 |