[Assembly] 산술 연산

2024. 9. 27. 18:01·CS/Computer Architecture
728x90
반응형

inc

inc operand1
inc  eax

eax에 +1을 해주는 코드(eax++)

  • operand1 +1
  • operand1 : 레지스터 or 메모리
  • CF를 설정하지 않음

 

Example

inc al : al에 1을 더한 후 다시 al에 저장함

 

* al에 0xff가 저장되어있다고 가정

inc al : al에 1을 더한 후, 다시 al에 저장하면 al에는 0이 저장되고, 자리 올림이 발생했지만 CF가 설정되지 않음

> CF와 OF의 차이를 이해하면 OF도 설정되지 않는다는 것을 알 수 있다 (부호 반전이 없기 때문에)

 

 

dec

dec operand1
dec eax

eax에 -1을 해주는 코드 (eax--)

  • operand1 -1
  • operand1 : 레지스터 or 메모리
  • CF를 설정하지 않음

 

Example

dec al : al에 1을 뺀 후 다시 저장함

 

* al에 0x00이 저장되어있다고 가정

dec al : al에 1을 뺀 후, 다시 al에 저장하면 al은 0xff가 저장되고, 자리 내림이 발생했지만 CF가 설정되지 않음

> OF는 설정된다 (양수에서 음수로 바뀌었기 때문에)

 

더보기

[inc와 dec]

CF가 중요하게 작동하는 대부분의 프로그램에서는 잘 사용안하고 add al,1 / sub al,1 이런 식으로 사용된다.

 

 

add

add operand1 operand2
add eax 1

eax 레지스터에 1을 더하는 코드 (eax += 1)

  • operand1 = operand1 + operand2
  • operand1과 operand2의 값을 더한 후 operand1에 다시 저장
  • operand1 : 레지스터 or 메모리
  • operand2 : 레지스터 or 메모리 or 상수
  • 동시에 메모리가 올 수는 없음 - 메모리 + 메모리는 불가능
  • 크기가 다른 레지스터끼리의 연산은 불가능

 

Example

add al, bl : al = al + bl

add al, BYTE PTR[0x400000] : 0x400000 주소에 있는 값을 al에 더해줌 

 

 

adc

adc operand1 operand2
adc eax 1

eax 레지스터에 1을 더하고, CF를 더한다 코드 (eax = eax + 1 + CF)

* CF = 0 이라면 add와 같음

  • operand1 = operand1 + operand2 + CF
  • operand1과 operand2의 값과 CF에 설정된 값을 더한 후 operand1에 다시 저장
  • operand1 : 레지스터 or 메모리
  • operand2 : 레지스터 or 메모리 or 상수
  • add와 똑같은 조건을 가지고 있음

 

Example

adc al, bl : al = al + bl + CF

 

*한번에 처리할 수 있는 단위가 8비트라고 가정 

AX에 0x12ff / BX에 0x0001이 저장되어있다고 가정하고 AX + BX를 계산하고자 한다.

해당 연산을 수행하는 것은

add al, bl
adc ah, bh

로 가능하다

하위 바이트에서 al + bl을 실행하면, al에는 00이 저장되고 CF가 설정된다

상위 바이트에서 ah + bh을 실행하면, 하위바이트에서 올림된 1을 더해 0x13이 설정된다

해당 과정을 통해 결국 0x1300이 된다

ADC 연산과정

ADC가 의외로 한번씩 보이는 것 같다..

 

 

sub

sub operand1 operand2
sub eax 1

eax 레지스터에 1을 빼주는 코드 (eax -= 1)

  • operand1 = operand1 - operand2
  • operand1에서 operand2 값을 뺀 후 operand1에 저장함
  • operand1 : 레지스터 or 메모리
  • operand2 : 레지스터 or 메모리 or 상수
  • 동시에 메모리가 올 수 없음
  • 크키가 다른 레지스터끼리의 연산은 불가능

 

Example

sub al, bl : al = al - bl

sub al, BYTE PTR[0X400000] = al에서 0x400000메모리에 있는 값을 빼고, al에 다시 저장함

 

 

sbb 

Arm에서는 sbc라고 표현한다.

sbb operand1 operand2
sbb eax 1

eax 레지스터에 1과 CF를 빼주는 코드 (eax = eax -1 -CF)

* CF = 0 이라면 sub와 같음

 

  • operand1 = operand1 - operand2 - CF
  • operand1에 operand2의 값과 CF에 설정된 값을 뺀 후 operand1에 다시 저장
  • operand1 : 레지스터 or 메모리
  • operand2 : 레지스터 or 메모리 or 상수
  • sub와 똑같은 조건을 가지고 있음

 

Example

sbb al, bl = al - bl - CF

 

* 한번에 처리할 수 있는 단위가 8비트라고 가정

AX에 0x1234 / BX에 0x007f가 저장되어있다고 가정하고 AX - BX를 계산하고자 한다.

해당 연산을 수행하는 것은 

sub al, bl
sbb ah, bh

로 가능하다

하위 바이트에서 al - bl을 실행하면, al은 0x34 - 0x7f이므로 0x3d가 저장되고 자리 빌림이 발생하여 CF=1이 된다

상위 바이트에서 ah - bh을 실행하면, 이전에 자리 빌림이 발생했기에 0x11 - 0x00과 같아 0x11이 된다

해당 과정을 통해 결국 0x113d가 된다

SBB 연산 과정

 

 

mul

mul operand1
mul ebx

지정된 위치에 eax * ebx의 결과를 저장하는 코드 (eax = eax * ebx ...)

 

  • 부호없는 정수의 곱셈을 실행함
  • operand1 * operand1과 같은 크기의 rax 내 레지스터의 결과를 특정 위치에 저장함
  • operand1  : 메모리 or 레지스터
  • rax의 값이 항상 설정되어있어야한다.

mul의 저장 및 연산 방법은 특이하다.

8bit인 operand1과 al을 곱하면 최대 16비트이므로 ax에 저장한다

16bit인 operand1과 ax를 곱하면 최대 32비트이므로 dx:ax에 저장한다 (앞의 16비트는 dx에 저장한다는 의미)

32bit인 operand1과 eax를 곱하면 최대 64비트이므로 edx:eax에 저장한다

64bit인 operand1과 rax를 곱하면 최대 128비트이므로 rdx:rax에 저장한다

 

Example

mul bl : ax = al * bl

mul bx : dx:ax = ax * bx

mul ebx : edx:eax = eax * ebx

mul rbx : rdx:rax = rax * rbx

 

 

imul

imul operand1 operand2 operand3
imul eax    
imul eax ebx  
imul eax ebx 2

eax에 eax를 곱해서 edx:eax에 저장한다

eax와 ebx를 곱해서 eax에 저장한다

ebx 와 2를 곱해서 eax에 저장한다

  • 부호있는 정수 (signed)의 곱셈을 수행함
  • operand1 : 레지스터
  • operand2 : 레지스터 or 메모리
  • operand3 : 상수

 

Example

imul ebx : edx:eax = eax * ebx

imul ebx, ecx : ebx = ebx * ecx

imul ebx, ecx * 2 : ebx = ecx * 2

 

imul vs mul

al에 0xff, bl에 0xff가 저장되어있다고 가정하자

mul bl : 0xff * 0xff = 0xfe01

imul bl : -0x1 * -0x1 = 0x1

 

 

div

div operand1
div ebx

eax  = eax / ebx 이고, edx에 나머지를 저장함

  • 부호없는 정수의 나눗셈을 실행함
  • operand1 : register
  • mul과 비슷하게 연산함

8bit인 operand1로 al을 나눈 결과를 al, 나머지를 ah에 저장한다

16bit인 operand1로 ax를 나눈 결과를 ax, 나머지를 dx에 저장한다

32bit인 operand1로 eax를 나눈 결과를 eax, 나머지를 edx에 저장한다

64bit인 operand1로 rax를 나눈 결과를 rax, 나머지를 rdx에 저장한다

 

Example

div bl : al = al / bl > 나머지 ah

div bx : ax = ax / bx > 나머지 dx

div ebx : eax = eax / ebx > 나머지 edx

div rbx : rax = rax / rbx > 나머지 rdx

 

 

 

reference

- https://modoocode.com/category/X86-64%20%EB%AA%85%EB%A0%B9%EC%96%B4%20%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4

 

X86-64 명령어 레퍼런스

2020-09-09 조회수 : 13277 x86-64 명령어 레퍼런스 읽는 법 궁금한 것은 직접 찾아보세요!

modoocode.com

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'CS > Computer Architecture' 카테고리의 다른 글

함수 호출 규약 (x86, x64)  (0) 2025.02.10
[Assembly] 데이터 이동  (0) 2024.09.20
Static Link vs Dynamic Link  (0) 2024.09.05
함수의 프롤로그 & 에필로그  (0) 2024.08.22
Register  (1) 2024.08.16
'CS/Computer Architecture' 카테고리의 다른 글
  • 함수 호출 규약 (x86, x64)
  • [Assembly] 데이터 이동
  • Static Link vs Dynamic Link
  • 함수의 프롤로그 & 에필로그
min_zu
min_zu
  • min_zu
    민주제도
    min_zu
  • 전체
    오늘
    어제
    • ._. (176)
      • AI (2)
        • DeepLearning (2)
        • CS231n (0)
      • Web (2)
        • ReactJS (0)
      • CS (83)
        • OS (7)
        • Data Structure (23)
        • Computer Architecture (8)
        • Computer Network (20)
        • Algorithm (25)
      • Linux (3)
        • KaliLinux (0)
        • Docker (1)
      • Hacking (83)
        • Write Up (25)
        • Pwnable (13)
        • Reversing (2)
        • Cryptography (12)
        • Web Hacking (4)
        • Window (6)
        • Network (7)
        • Web3 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DataStructure
    Tree
    Search
    Linux
    Sort
    OS
    Graph
    AI
    UTM
    DeepLearning
    ComputerArchitecture
    WinAFL
    Mac
    Web
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
min_zu
[Assembly] 산술 연산
상단으로

티스토리툴바