Assembly - 논리 연산, 비교, 분기 명령어

이쑤신개자두·2023년 6월 17일
0

어셈블리어

목록 보기
2/6

논리연산 명령어

  • and, or, xor, not 등의 논리연산이 있음.
  • 논리연산은 비트 단위로 이루어짐 => 2진수로 변환에서 0이나 1 따져야함!!!

1. and A, B

  • A와 B의 비트가 모두 1이면 1, 아니면 0
  • 비트 단위로 분석한 후 A의 값이 바뀜
[Register]
eax = 0xffff0000
ebx = 0xcafebabe
[Code]
and eax, ebx
[Result]
eax = 0xcafe0000

2. or A, B

  • A와 B의 비트중 하나라도 1이면 1, 아니면 0
  • 비트 단위로 분석한 후 A의 값이 바뀜
[Register]
eax = 0xffff0000
ebx = 0xcafebabe
[Code]
or eax, ebx
[Result]
eax = 0xffffbabe

3. xor A, B

  • A와 B의 비트가 서로 다르면 1, 같으면 0
  • 비트 단위로 분석한 후 A의 값이 바뀜
  • !!! xor 연산을 동일한값으로 두번 실행하면, 원래 값으로 돌아감 !!!
[Register]
eax = 0xffffffff
ebx = 0xcafebabe
[Code]
xor eax, ebx
[Result]
eax = 0x35014541

4. not A

A의 비트 전부 반전(1의 보수 기법)

[Register]
eax = 0xffffffff
[Code]
not eax
[Result]
eax = 0x00000000

비교 명령어

  • 값은 저장하지 않는다 플래그 설정용!
  • 비교 명령어는 두 피연산자(오퍼랜드)의 값을 비교하고, 플래그를 설정한다!
  • ZF, CF, SF, OF 등 설정..

1. cmp A, B

  • A와 B를 비교. 두 피연산자를 빼서 대소를 비교함
  • 이때 연산의 결과는 A에 저장되지 않는다.

ex. 서로 같은 두수를 빼면 결과가 0이되어 ZF플래그가 설정되는데, 이후에 CPU는 이 플래그를 보고 두 값이 같았다는걸 알수있음

[Code]
1: mov rax, 0xA
2: mov rbx, 0xA
3: cmp rax, rbx ; ZF=1

2. test A,B

  • 두 연산자에 AND 비트연산을 취함
  • 이때 연산의 결과는 A에 저장되지 않음

ex. 아래와 같은 경우에는 0이된 rax를 AND연산을 수행하면 결과가 0이므로 ZF플래그가 설정된다. 이후에 CPU는 이 플래그를보고 rax가 0이였는지 판단 가능

[Code]
1: xor rax, rax
2: test rax, rax ; ZF=1

분기 명령어

rip 레지스터를 이동시켜 실행 흐름을 바꾼다.

rip : 명령어 포인터 레지스터로써 CPU가 어느 부분의 코드를 실행할지 가리킴, 8바이트 크기

1. jmp A

A로 rip를 이동시킴 (jmp 1이면 1번 코드로 다시 돌아가서 실행!)

1: xor rax, rax
2: jmp 1 ; jump to 1

2. je A

직전 코드에서 비교한 두 피연산자가 같으면 점프

[Code]
1: mov rax, 0xcafebabe
2: mov rbx, 0xcafebabe
3: cmp rax, rbx ; rax == rbx
4: je 1 ; jump to 1

3. jg A

직전에 비교한 두 연산자중 전자가 더 크면 점프

[Code]
1: mov rax, 0x31337
2: mov rbx, 0x13337
3: cmp rax, rbx ; rax > rbx
4: jg 1 ; jump to 1
profile
25.04.28 Restart ~ 1일 1포스트 & 1일 1커밋!

0개의 댓글