본문 바로가기

IT/Intel 16bit Assembly

x86 16bit 어셈블리(Assembly) 예제 정리 - 3

/* 
written by kaspy (kaspyx@gmail.com)
*/ 


문득 어셈블리 언어를 보다보면 자주쓰지 않는 만큼 해깔릴수 있는것들이 많은것 같아서 정리해보았다. 특히 주소 연산 mov [100], 10 같은것들
많이 사용되지 않는 16bit 어셈블리어지만 레지스터 크기나 명령어 이름만 조금 바꾼 형태로 익힌다면 32bit도 그리 어렵지는 않을것이다.
(ex. 16bit 레지스터 ax -> 32bit는 eax)

이어서 진행~~


NEG 명령어

예제)

  1. neg cx
  2.  
  3. ;cx를 보수형태로 바꾸어 줍니다.
  4. ;19 -> 0000 0000 0001 1001 ->
  5. ;     1111 1111 1110 0110 -> ffe7


CBW 명령어

예제)

  1. mov al, f1
  2. cbw
  3. mov al,3
  4. cbw
  5.  
  6. ;cbw는 al레지스터를 ax 로 확장하는 명령입니당.



CWD 명령어

예제)

  1. mov ax, 1a
  2. cwd
  3.  
  4. ;ax 레지스터를 더블워드 크기로 바꿉니다.
  5. ;dx레지스터와 합쳐서 크기를 확장합니다.



CMP 명령어

예제)

  1. mov al, 38
  2. cmp al, 38
  3. mov al, 00
  4. cmp al, 01
  5.  
  6. ; al에 38을 저장하고 al과 38을 비교하면 두수의 차이는 0이므로 제로플래그가 켜집니다.
  7. ; 반대로 al에 0을 저장하고 1과 비교하면 차이가 -1이어서 사인플래그가 켜졌고 결과치가 0이 아니므로
  8. ; 제로플래그는 NZ로 바뀌었습니다.

XCHG 명령어

예제)

  1. mov bx, 0103
  2. xchg bx, ax
  3.  
  4. ;두 레지스터의 값을 바꿉니다.


PUSH 명령어

예제)

  1. push ax
  2.  
  3. ;스택 포인터 sp를 감소시키고 감소된 sp의주소가 가리키는 값에 ax의 값을 저장시킵니다.


관련 링크 참조

http://kaspyx.tistory.com/entry/16bit-Assembly-예제-정리-1

http://kaspyx.tistory.com/entry/16bit-Assembly-예제-정리-2

http://kaspyx.tistory.com/entry/16bit-Assembly-예제-정리-4