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가 의외로 한번씩 보이는 것 같다..
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가 된다
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
'CS > Computer Architecture' 카테고리의 다른 글
[Assembly] 데이터 이동 (0) | 2024.09.20 |
---|---|
Static Link vs Dynamic Link (0) | 2024.09.05 |
함수의 프롤로그 & 에필로그 (0) | 2024.08.22 |
Register (0) | 2024.08.16 |
[Assembly] Intel vs AT&T (2) | 2024.08.14 |