늦었지만 지난주 Instruction ANDPD ~ BTS

강석천 2007.03.10 19:06 조회 수 : 4053 추천:142

엄청 늦었지만, 일단 올려봅니다.

== 주요 용어들 ==
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
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2200
45 first.S에서 초기에 Ox9A000로 이동하는 이유 송형주 2007.03.13 2595
44 저번주 스터디 내용 좀 정리해 주세요. [3] 정필섭 2007.03.12 4521
43 제가 참고한 자료들입니다. [3] file 김종화 2007.03.12 4808
42 PPC 제본한거 남은거 있나요? [1] 원민수 2007.03.12 4605
41 지난시간에 약간 모호했던 부분중... 선준규 2007.03.11 2643
40 lilo 21.4.4 source 파일입니다. file 송형주 2007.03.11 2567
39 3월 10일 LKSAS 세번째 모임 수고 하셨습니다. 강형석 2007.03.11 2856
38 메일링 리스트 만들었습니다. 유상민 2007.03.11 2654
37 lilo 분석 링크 유상민 2007.03.11 3329
36 AAA ~ AND 까지 입니다. 박경태 2007.03.10 8491
35 아~ RGB 케이블 찾았습니다. 강형석 2007.03.10 2506
» 늦었지만 지난주 Instruction ANDPD ~ BTS 강석천 2007.03.10 4053
33 volume 1. LIDT ~ LODS 입니다. 늦어서 죄송합니다;; 선준규 2007.03.10 2786
32 Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64225
31 제가 ppc 책 없었는데 책 파신분요. 유태경 2007.03.10 4710
30 분담 5(PREFETCHh ~ RCL/RCR/ROL/ROR) 입니다. 늦어서 죄송합니다 file 지현구 2007.03.10 6260
29 저한테 저번주에 할당되어 있던 Instruction올립니다. 남용우 2007.03.09 3767
28 vol2의 분담3과 vol1 명령어입니다. 이종우 2007.03.09 3810
27 명령어 정리 - 늦어서 죄송.. 송형주 2007.03.09 14528
26 Instruction 정리. 남현우 2007.03.09 4745
XE Login