본문 바로가기

x86

(5)
[SIMD 프로그래밍] MMX 명령어 / unpack의 개념 / 레지스터 이동 명령어, unpack 명령어 MMX MMX는 인텔이 설계한 SIMD(Single Instruction Multiple Data) 명령어 집합으로 여러개의 정수에 대한 병렬 연산을 제공한다. MM0부터 MM7까지의 8개의 64비트 레지스터로 연산을 처리한다. MM 레지스터 총 64비트로 64 비트 정수 하나를 저장하거나, 16, 8, 4, 2, 1 바이트 크기와 같은 더 작은 크기의 정수를 여러개 저장할 수 있다. 여러개의 정수를 하나의 레지스터에 저장하는 형태를 'Packed' 라 한다. 하나의 MMX의 명령어는 두개의 32비트 정수, 네개의 16비트 정수, 여덟개의 8비트 정수를 처리한다. 이동 명령어 MOVD, MOVQ 각각 Doubleword (4바이트), Quadword (8바이트)를 의미한다. MOVD의 경우 메모리에서 m..
[X86 어셈블리] FPU 프로그래밍 / 구의 부피 계산하기 / fmul, fmulp, fdiv, fdivp 구의 부피 공식 반지름이 r일 때 구의 부피 V는 V = (4/3) × π × r³ 위의 간단한 공식을 8087 FPU 프로그래밍으로 구현해보자. 코드 ax 레지스터에 반지름 값을 넣고 스택에 push한다. 이 값을 인자로 하여 get_sphere_volume 프로시져가 구의 부피를 계산한다. TITLE Sphere Volume .DOSSEG .8086 .8087 .MODEL TINY .DATA volume DD ? int_four DW 4 int_three DW 3 .CODE .STARTUP mov ax, 3 ;r push ax call get_sphere_volume add sp, 2 mov ah, 4Ch xor al, al int 21h get_sphere_volume PROC push bp mov..
[X86 어셈블리] FPU 프로그래밍 / 8087 / 주요 명령어 정리 X87과 인텔 8087 X87은 부동소수점 연산에 관련된 X86 아키텍처 명령어 집합이다. 지금은 CPU가 자체적으로 부동소수점 명령어를 처리하지만 먼 과거에는 보조 프로세서(Co-Processor)가 처리했다. 이러한 보조 프로세서 중 하나가 인텔 8087이다. 8087의 레지스터 st0부터 st7까지 총 8개가 있으며 각각 80비트이다. st0을 최상위로 하는 스택의 구조로 사용된다. 예를 들어 두 개의 피연산자를 더하는 FADD 명령어는 피연산자가 명시되어있지 않은 경우 st0과 st1의 값을 더하여 st0에 저장한다. 명령어 데이터 전송 명령어 명령어 뜻 풀이 동작 FILD Integer Load 정수를 st에 push 한다 FIST Integer store 정수를 메모리에 복사한다 FISTP I..
[X86 어셈블리] strncpy 구현하기 / movsb 명령어 / 문자열 MOVSB, MOVSW, MOVSD 차례대로 Byte, Word, Doubleword 크기만큼 ds:si 레지스터가 가리키는 메모리 주소에서 es:di 레지스터가 가리키는 메모리 주소로 값을 복사한다. ds:si에서 ds 대신 다른 세그먼트 레지스터를 사용할 수 있지만 es:di에서 es 레지스터 대신 다른 세그먼트 레지스터를 쓸 수는 없다. 복사 후 si와 di가 증감한다. cld(clear direction)시 증가하고, std(set direction)시 감소한다. STRNCPY 구현하기 movsb를 사용하여 n개의 문자를 복사하는 기능을 구현할 수 있다. 아래는 매크로로 구현된 strncpy이다. TITLE STRNCPY .DOSSEG .8086 .MODEL TINY .DATA srcstr DB ..
[X86 어셈블리] strncmp 구현하기 / cmpsb, cmpsw, repe 명령어 문자열 비교 명령어 CMPSB, CMPSW es:di와 ds:si를 비교한다. std 또는 cld로 비교 방향을 결정해줄 수 있다. std(=set direction)시 si와 di를 감소시키며 비교한다. cld(=clear direction)시 si와 di를 증가시키며 비교한다. cmpsb si, di 1씩 증감 byte 단위로 비교 cmpsw si, di 2씩 증감 word 단위로 비교 반복 명령어 REP, REPE, REPZ, REPNE, REPNZ cx 레지스터에 반복 횟수를 저장하여 사용한다. 각 명령어의 의미는 'as long as'를 넣어서 해석하면 된다. 예를 들어 REPE는 'REPeat (as long as) Equal'로 생각한다. Equal, Zero, Not Equal, Not Z..