/*
written by kaspy (kaspyx@gmail.com)
*/
문득 어셈블리 언어를 보다보면 자주쓰지 않는 만큼 해깔릴수 있는것들이 많은것 같아서 정리해보았다. 특히 주소 연산 mov [100], 10 같은것들
많이 사용되지 않는 16bit 어셈블리어지만 레지스터 크기나 명령어 이름만 조금 바꾼 형태로 익힌다면 32bit도 그리 어렵지는 않을것이다.
(ex. 16bit 레지스터 ax -> 32bit는 eax)
이어서 진행~
문자열 출력
예제)
- mov ah, 9
- int 21h
- ;ax의 상위 레지스터 ax에 9를 저장하고 int 21h명령어를 실행시키면 dx에 주소에 저장된 값의 문자가
- ;'$' 가 나올 때 까지 출력됩니다.
ES 세그먼트 오프셋을 이용한 MOV
예제)
- mov es, ax
- mov ax, [0000]
- ; mov ax, es[0]
- ; ax에 있는 ffff의 값을 es 레지스터에 저장합니다.
- ; 그리고 mov ax, es[0] 명령어를 수행하는데 es에는 ffff 가 들어가있습니다.
- ; mov ax, es[0] 를 하면 실제 주소는 es의 주소값 ffff:0000 이 실제 값입니다.
- ; ffff:0000 에 저장되어있는 값을 ax에 저장합니다.
POP 명령어
예제)
- pop ax
- ; ax 레지스터에 현재 스택포인터(sp) 값을 저장합니다.
RET 명령어
예제)
- ret
- ;ret 명령어는 sp가 가리키는 값을 ip 에 넣어주고 sp를 증가 시킵니다.
SUB 명령어
예제)
- mov ax, 0000
- sub ax, 0001
- ; ax에 0을 넣어주고 1을 빼줍니다.
- ; 그러면 ax는 실제로 1111 1111 1111 1111 이며 맨 앞에 비트가 1이므로 ng
- ; 그리고 짝수이므로 pe 그리고 내림수가 나왔기 때문에 cy 로 플래그가 켜졌습니다.
ADC, SBB 명령어
예제)
- mov bx, 2
- adc ax, bx
- sbb ax, bx
- ;ax = 0xffff
- ;bx에 2를 저장하고 ax에 bx를 더합니다.
- ;ax는 한계치를 넘었고 carry bit가 있기 때문에 ffff + 2는 2가 됩니다. 마찬가지로
- ;sbb ax, bx 는 버림수와 같이 계산하고 ffff가 됩니다.
MUL 명령어
예제)
- mov ax, 2003
- mov cx, 11
- mul cx
- ;ax 레지스터에 2003을 넣고 cx 레지스터에는 11을 넣은다음에 mul cx를 하면
- ;ax = ax * cx 값이 들어가게 됩니다.
- ;그런데 ax가 표현할수 있는 한계치를 초과하여 오버 플로우 플래그 nv에서 ov로 바뀌었습니다.
IMUL 명령어
예제)
- mov ax, ffff
- mov cx, 5
- imul cx
- ;ax에 16진수 ffff를 저장하고 cx에 5를 저장해서
- ;부호있는 정수형 곱셈 ax <- ax * cx를 해줍니다.
- ;이때 ax는 음수이며 맨앞의 1비트를 제외하고 5를 곱하기 때문에
- ;ovflow와 carryflag는 켜지지 않습니다.
DIV 명령어
예제)
- mov cl, 11
- div cl
- ;ax에서 cl로 나누어 주고 ah에는 몫을 al에는 나머지를 저장합니다.
* 관련 링크 참조
http://kaspyx.tistory.com/entry/16bit-Assembly-예제-정리-1
'IT > Intel 16bit Assembly' 카테고리의 다른 글
x86 16bit 어셈블리(Assembly) 예제 정리 - 4 (2) | 2015.04.10 |
---|---|
x86 16bit 어셈블리(Assembly) 예제 정리 - 3 (0) | 2015.04.09 |
x86 16bit 어셈블리(Assembly) 예제 정리 - 1 (0) | 2015.04.08 |