/* 
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

신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


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

이어서 진행~


문자열 출력

예제)

  1. mov ah, 9
  2. int 21h
  3.  
  4. ;ax의 상위 레지스터 ax에 9를 저장하고 int 21h명령어를 실행시키면 dx에 주소에 저장된 값의 문자가 
  5. ;'$' 가 나올 때 까지 출력됩니다.


ES 세그먼트 오프셋을 이용한 MOV

예제)

  1. mov es, ax
  2. mov ax, [0000]
  3. ; mov ax, es[0]
  4.  
  5. ; ax에 있는 ffff의 값을 es 레지스터에 저장합니다. 
  6. ; 그리고 mov ax, es[0] 명령어를 수행하는데 es에는 ffff 가 들어가있습니다.
  7. ; mov ax, es[0] 를 하면 실제 주소는 es의 주소값 ffff:0000 이 실제 값입니다. 
  8. ; ffff:0000 에 저장되어있는 값을 ax에 저장합니다.


POP 명령어

예제)

  1. pop ax
  2. ; ax 레지스터에 현재 스택포인터(sp) 값을 저장합니다.


RET 명령어

예제)

  1. ret
  2.  
  3. ;ret 명령어는 sp가 가리키는 값을 ip 에 넣어주고 sp를 증가 시킵니다.


SUB 명령어

예제)

  1. mov ax, 0000
  2. sub ax, 0001
  3.  
  4. ; ax에 0을 넣어주고 1을 빼줍니다.
  5. ; 그러면 ax는 실제로 1111 1111 1111 1111 이며 맨 앞에 비트가 1이므로 ng
  6. ; 그리고 짝수이므로 pe 그리고 내림수가 나왔기 때문에 cy 로 플래그가 켜졌습니다.



ADC, SBB 명령어

예제)

  1. mov bx, 2
  2. adc ax, bx  
  3. sbb ax, bx
  4.  
  5. ;ax = 0xffff
  6. ;bx에 2를 저장하고 ax에 bx를 더합니다.
  7. ;ax는 한계치를 넘었고 carry bit가 있기 때문에 ffff + 2는 2가 됩니다. 마찬가지로
  8. ;sbb ax, bx 는 버림수와 같이 계산하고 ffff가 됩니다.


MUL 명령어

예제)

  1. mov ax, 2003
  2. mov cx, 11
  3. mul cx
  4.  
  5. ;ax 레지스터에 2003을 넣고 cx 레지스터에는 11을 넣은다음에 mul cx를 하면
  6. ;ax = ax * cx 값이 들어가게 됩니다.
  7. ;그런데 ax가 표현할수 있는 한계치를 초과하여 오버 플로우 플래그 nv에서 ov로 바뀌었습니다.


IMUL 명령어

예제)

  1. mov ax, ffff
  2. mov cx, 5
  3. imul cx
  4.  
  5. ;ax에 16진수 ffff를 저장하고 cx에 5를 저장해서
  6. ;부호있는 정수형 곱셈 ax <- ax * cx를 해줍니다.
  7. ;이때 ax는 음수이며 맨앞의 1비트를 제외하고 5를 곱하기 때문에
  8. ;ovflow와 carryflag는 켜지지 않습니다.


DIV 명령어

예제)

  1. mov cl, 11
  2. div cl
  3.  
  4. ;ax에서 cl로 나누어 주고 ah에는 몫을 al에는 나머지를 저장합니다.

* 관련 링크 참조

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

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

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

신고
Posted by 캐스피
/* 
written by kaspy (kaspyx@gmail.com)
*/ 


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

우선은 간단한 명령어부터~

MOV 레지스터, 숫자

예제)

  1. ; ax 레지스터에 지정된 숫자를 넣어줍니다.
  2. mov ax, 3


MOV 레지스터, [주소]

예제)

  1. mov ax, [0103]
  2. ;mov ax, x(변수)
  3.  
  4. ;ax 레지스터에 지정된 숫자를 넣어줍니다. 
  5. ;여기서는 0103 번지의 값을 ax에 넣으라는 소린데 이는 소스코드에서 x의 주소입니다.


MOV [주소], 숫자

예제)

  1. mov word ptr [0103]2013
  2.  
  3. ;0103 주소에 저장되어 있는 값에 word 만큼의 크기로 2013 이라는 값을 저장합니다.
  4. ;(20 상위 주소에 13은 하위 주소에)


MOV 레지스터, 숫자+배열 인덱스

예제)

  1. mov dl, [bx+0105]
  2. ; mov dl, y[bx]
  3.  
  4. ; bx레지스터의 값 + 105 주소의 값을 dx레지스터 하위 1바이트 레지스터에 저장합니다.
  5. ; 이와 같이 bx레지스터는 인덱스에 사용됩니다.



MOV 레지스터, 레지스터

예제)

  1. mov ds, ax
  2.  
  3. ;데이터 세그먼트(ds)나 엑스트라 세그먼트(ex)도 값을 바꿀 수 있습니다.


INC [주소]

예제)

  1. inc byte ptr [bx]
  2.  
  3. ;bx에 저장된 값의 주소의 값을 1 증가시킵니다. (모르는 주소)


* 관련 링크 참조

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

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

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

신고
Posted by 캐스피


티스토리 툴바