엄청 늦었지만, 일단 올려봅니다.
== 주요 용어들 ==
half word : 2 byte
word : 4 byte
double word : 8 byte
quad word : 16 byte
packed byte : 레지스터 64 bit 내에 8byte 가 들어가는 것
packed word : 64bit 내 4개 word 가 들어가는 것
packed double word : 2개 doubleword
quadword : 1개 quadword
XMM register : SSE 확장을 위한 8개 128bit register. XMM0~XMM7 임
단정도 부동 소수점 연산(single precision floating point) : 32비트 크기로 4등분. 1bit 는 부호, 8bit : 지수. 23비트 : 가수
SSE2 : 배정도 부동 소수점 연산 (double precision floating point) 명령들은 대부분 SSE2 Instruction 들임.
IEEE standard 754 : 부동소수점 수치를 컴퓨터에서 나타내기 위한 일반적인 포맷을 지정함
단정도 : 32비트 이용.
1 bit : 부호
8 bit : 지수
23 bit : 가수
배정도 : 64비트 이용
1 bit : 부호
11 bit : 지수
52 bit : 가수
Floating Point 표현 : 가수부 x 기수 ^ 지수부
=== 출처 ===
http://ko.wikipedia.org/wiki/IA-32
http://gpgstudy.com/gpg2/gpg2s2-1draft.html
http://www.eetkorea.com/ART_8800435789_839585_1e86e090200610.HTM
== ANDPD ~ BTS ==
SSE Instructions : Single Precision 관련
SSE2 Instructions : Double Precision 관련
ANDPD xmm1, xmm2/m128 operand1 과 operand2 의 AND 연산 (Double Precision)
ANDPS xmm1, xmm2/m128 operand1 과 operand2 의 AND 연산 (Single Precision)
#include <windows.h>
#include <stdio.h>
void main() {
double v1[] = {3.14159265,3.14159265};
double v2[] = {2.22222222,1.11111111};
double v3 = 0.00;
__asm {
; xmm1 = 400921FB53C8D4F1400921FB53C8D4F1
movq xmm1, [v1]
movhpd xmm1, [v1+8]
; xmm3 = 3FF1C71C717AC1924001C71C717AC192
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = xmm1 & xmm3
; xmm1 = 000101185148C090400101185148C090
ANDPD xmm1, xmm3
emms
movq xmm1, [v1]
movhpd xmm1, [v1+8]
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; 결과는 ANDPD 와 같음
ANDPS xmm1, xmm3
emms
}
}
AND 연산은 비트연산이여서 그런지 두 결과가 같음.
ANDNPD - Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values
ANDNPS - Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values
#include <windows.h>
#include <stdio.h>
void main() {
double v1[] = {3.14159265,3.14159265};
double v2[] = {2.22222222,1.11111111};
double v3 = 0.00;
__asm {
; xmm1 = 400921FB53C8D4F1400921FB53C8D4F1
movq xmm1, [v1]
movhpd xmm1, [v1+8]
; xmm3 = 3FF1C71C717AC1924001C71C717AC192
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = ~(~xmm1 & xmm3) + 1
; xmm1 = 3FF0C604203201020000C60420320102
ANDNPD xmm1, xmm3
movq xmm1, [v1]
movhpd xmm1, [v1+8]
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = 3FF0C604203201020000C60420320102
ANDNPS xmm1, xmm3
emms
}
}
ARPL - Adjust RPL Field of Segment Selector. 세그먼트 셀렉터에 대한 RPL 필드 조정
ARPL r/m16, reg16
r/m16 의 RPL 을 reg16 의 RPL 보다 작지 않게 조정함.
BOUND - Check Array Index Against Bounds. 범위에 대하여 배열 인덱스 검사
BOUND r16, m16&16
BOUND r32, m32&32
if m32_1 <= r32 <= m32_2: pass
else: throw BoundaryException
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x00,0x11}; // 배열 범위를 보관하는 메모리 : 0~17 (0x00 ~ 0x11)
__asm {
mov eax, 1
BOUND eax, [v1] ; 에러 없음
mov eax, 4
BOUND eax, [v1] ; 에러 없음
mov eax, 5
BOUND eax, [v1] ; 에러 없음
mov eax, 0x10
BOUND eax, [v1] ; 에러 없음
mov eax, 0x11
BOUND eax, [v1] ; 에러 없음
mov eax, 0x12
BOUND eax, [v1] ; Array bounds exceeded.
}
}
void main() {
int v1[] = {0x01,0x11}; // 배열 범위를 보관하는 메모리 : 0~17 (0x00 ~ 0x11)
__asm {
mov eax, 0
BOUND eax, [v1] ; Array bounds exceeded.
}
}
=== BSF - Bit Scan Forward. 순방향 비트 스캔 ===
BSF reg16,r/m16 ; o16 0F BC /r [386]
BSF reg32,r/m32 ; o32 0F BC /r [386]
BSR reg16,r/m16 ; o16 0F BD /r [386]
BSR reg32,r/m32 ; o32 0F BD /r [386]
LSB : 최하위 비트(Least-significant bit). LSB는 가장 오른쪽 비트.
MSB : 최상위 비트 (Most-significant bit). MSB는 가장 왼쪽에 쓰여지는 비트
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x2FFE};
// M L
// 0010 1111 1111 1110
__asm {
mov eax, [v1] ; eax = 0x2FFE
BSF ecx, eax ; ecx = 0x01
BSR ecx, eax ; ecx = 0x0D
}
}
=== BSWAP - Byte Swap. 바이트 단위 바꾸기 ===
[0-7] <-> [24-31]
[8-15] <-> [16-23]
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x11223344};
__asm {
mov eax, [v1] ; eax = 11223344
BSWAP eax ; eax = 44332211
}
}
=== BT, BTC, BTR, BTS ===
BTR : operand 의 bit 를 reset
BTS : bit set
BTC : ~bit set
BT : operand 변화 없음
첫번째 operand 에 대해 두번째 operand(idx)의 1 bit 검사 뒤 carray flag 에 저장함.
#include <windows.h>
#include <stdio.h>
void main() {
// 0100 0100
int v1[] = {0x44};
__asm {
mov eax, [v1]
mov ecx, 2
BT eax, ecx ; CY = 1
mov ecx, 3
BT eax, ecx ; CY = 0
mov eax, [v1]
mov ecx, 2
BTS eax, ecx ; CY = 1. eax 변화 없음
mov ecx, 3
BTS eax, ecx ; CY = 0. eax = 0x4C (0100 1100)
mov eax, [v1]
mov ecx, 2
BTR eax, ecx ; CY = 1. eax = 0x40 (0100 0000)
mov ecx, 3
BTR eax, ecx ; CY = 0. eax 변화 없음 (해당 비트가 이미 0임)
mov eax, [v1]
mov ecx, 2
BTC eax, ecx ; CY = 1. eax = 0x40 (0100 0000)
mov ecx, 3
BTC eax, ecx ; CY = 0. eax = 0x48 (0100 1000)
}
}
=== 출처 ===
http://www.sandpile.org/ia32/opc_2.htm
http://nasm.sourceforge.net/doc/html/nasmdocb.html
http://aeroguy.snu.ac.kr/lab/research_nrl_streamming_kor.htm
http://korea.maxim-ic.com/glossary/index.cfm/Ac/V/ID/1011/Tm/MSB
http://korea.maxim-ic.com/glossary/index.cfm/Ac/V/ID/590/Tm/LSB
== 주요 용어들 ==
half word : 2 byte
word : 4 byte
double word : 8 byte
quad word : 16 byte
packed byte : 레지스터 64 bit 내에 8byte 가 들어가는 것
packed word : 64bit 내 4개 word 가 들어가는 것
packed double word : 2개 doubleword
quadword : 1개 quadword
XMM register : SSE 확장을 위한 8개 128bit register. XMM0~XMM7 임
단정도 부동 소수점 연산(single precision floating point) : 32비트 크기로 4등분. 1bit 는 부호, 8bit : 지수. 23비트 : 가수
SSE2 : 배정도 부동 소수점 연산 (double precision floating point) 명령들은 대부분 SSE2 Instruction 들임.
IEEE standard 754 : 부동소수점 수치를 컴퓨터에서 나타내기 위한 일반적인 포맷을 지정함
단정도 : 32비트 이용.
1 bit : 부호
8 bit : 지수
23 bit : 가수
배정도 : 64비트 이용
1 bit : 부호
11 bit : 지수
52 bit : 가수
Floating Point 표현 : 가수부 x 기수 ^ 지수부
=== 출처 ===
http://ko.wikipedia.org/wiki/IA-32
http://gpgstudy.com/gpg2/gpg2s2-1draft.html
http://www.eetkorea.com/ART_8800435789_839585_1e86e090200610.HTM
== ANDPD ~ BTS ==
SSE Instructions : Single Precision 관련
SSE2 Instructions : Double Precision 관련
ANDPD xmm1, xmm2/m128 operand1 과 operand2 의 AND 연산 (Double Precision)
ANDPS xmm1, xmm2/m128 operand1 과 operand2 의 AND 연산 (Single Precision)
#include <windows.h>
#include <stdio.h>
void main() {
double v1[] = {3.14159265,3.14159265};
double v2[] = {2.22222222,1.11111111};
double v3 = 0.00;
__asm {
; xmm1 = 400921FB53C8D4F1400921FB53C8D4F1
movq xmm1, [v1]
movhpd xmm1, [v1+8]
; xmm3 = 3FF1C71C717AC1924001C71C717AC192
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = xmm1 & xmm3
; xmm1 = 000101185148C090400101185148C090
ANDPD xmm1, xmm3
emms
movq xmm1, [v1]
movhpd xmm1, [v1+8]
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; 결과는 ANDPD 와 같음
ANDPS xmm1, xmm3
emms
}
}
AND 연산은 비트연산이여서 그런지 두 결과가 같음.
ANDNPD - Bitwise Logical AND NOT of Packed Double-Precision Floating-Point Values
ANDNPS - Bitwise Logical AND NOT of Packed Single-Precision Floating-Point Values
#include <windows.h>
#include <stdio.h>
void main() {
double v1[] = {3.14159265,3.14159265};
double v2[] = {2.22222222,1.11111111};
double v3 = 0.00;
__asm {
; xmm1 = 400921FB53C8D4F1400921FB53C8D4F1
movq xmm1, [v1]
movhpd xmm1, [v1+8]
; xmm3 = 3FF1C71C717AC1924001C71C717AC192
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = ~(~xmm1 & xmm3) + 1
; xmm1 = 3FF0C604203201020000C60420320102
ANDNPD xmm1, xmm3
movq xmm1, [v1]
movhpd xmm1, [v1+8]
movq xmm3, [v2]
movhpd xmm3, [v2+8]
; xmm1 = 3FF0C604203201020000C60420320102
ANDNPS xmm1, xmm3
emms
}
}
ARPL - Adjust RPL Field of Segment Selector. 세그먼트 셀렉터에 대한 RPL 필드 조정
ARPL r/m16, reg16
r/m16 의 RPL 을 reg16 의 RPL 보다 작지 않게 조정함.
BOUND - Check Array Index Against Bounds. 범위에 대하여 배열 인덱스 검사
BOUND r16, m16&16
BOUND r32, m32&32
if m32_1 <= r32 <= m32_2: pass
else: throw BoundaryException
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x00,0x11}; // 배열 범위를 보관하는 메모리 : 0~17 (0x00 ~ 0x11)
__asm {
mov eax, 1
BOUND eax, [v1] ; 에러 없음
mov eax, 4
BOUND eax, [v1] ; 에러 없음
mov eax, 5
BOUND eax, [v1] ; 에러 없음
mov eax, 0x10
BOUND eax, [v1] ; 에러 없음
mov eax, 0x11
BOUND eax, [v1] ; 에러 없음
mov eax, 0x12
BOUND eax, [v1] ; Array bounds exceeded.
}
}
void main() {
int v1[] = {0x01,0x11}; // 배열 범위를 보관하는 메모리 : 0~17 (0x00 ~ 0x11)
__asm {
mov eax, 0
BOUND eax, [v1] ; Array bounds exceeded.
}
}
=== BSF - Bit Scan Forward. 순방향 비트 스캔 ===
BSF reg16,r/m16 ; o16 0F BC /r [386]
BSF reg32,r/m32 ; o32 0F BC /r [386]
BSR reg16,r/m16 ; o16 0F BD /r [386]
BSR reg32,r/m32 ; o32 0F BD /r [386]
LSB : 최하위 비트(Least-significant bit). LSB는 가장 오른쪽 비트.
MSB : 최상위 비트 (Most-significant bit). MSB는 가장 왼쪽에 쓰여지는 비트
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x2FFE};
// M L
// 0010 1111 1111 1110
__asm {
mov eax, [v1] ; eax = 0x2FFE
BSF ecx, eax ; ecx = 0x01
BSR ecx, eax ; ecx = 0x0D
}
}
=== BSWAP - Byte Swap. 바이트 단위 바꾸기 ===
[0-7] <-> [24-31]
[8-15] <-> [16-23]
#include <windows.h>
#include <stdio.h>
void main() {
int v1[] = {0x11223344};
__asm {
mov eax, [v1] ; eax = 11223344
BSWAP eax ; eax = 44332211
}
}
=== BT, BTC, BTR, BTS ===
BTR : operand 의 bit 를 reset
BTS : bit set
BTC : ~bit set
BT : operand 변화 없음
첫번째 operand 에 대해 두번째 operand(idx)의 1 bit 검사 뒤 carray flag 에 저장함.
#include <windows.h>
#include <stdio.h>
void main() {
// 0100 0100
int v1[] = {0x44};
__asm {
mov eax, [v1]
mov ecx, 2
BT eax, ecx ; CY = 1
mov ecx, 3
BT eax, ecx ; CY = 0
mov eax, [v1]
mov ecx, 2
BTS eax, ecx ; CY = 1. eax 변화 없음
mov ecx, 3
BTS eax, ecx ; CY = 0. eax = 0x4C (0100 1100)
mov eax, [v1]
mov ecx, 2
BTR eax, ecx ; CY = 1. eax = 0x40 (0100 0000)
mov ecx, 3
BTR eax, ecx ; CY = 0. eax 변화 없음 (해당 비트가 이미 0임)
mov eax, [v1]
mov ecx, 2
BTC eax, ecx ; CY = 1. eax = 0x40 (0100 0000)
mov ecx, 3
BTC eax, ecx ; CY = 0. eax = 0x48 (0100 1000)
}
}
=== 출처 ===
http://www.sandpile.org/ia32/opc_2.htm
http://nasm.sourceforge.net/doc/html/nasmdocb.html
http://aeroguy.snu.ac.kr/lab/research_nrl_streamming_kor.htm
http://korea.maxim-ic.com/glossary/index.cfm/Ac/V/ID/1011/Tm/MSB
http://korea.maxim-ic.com/glossary/index.cfm/Ac/V/ID/590/Tm/LSB
댓글 0
.