잘 익혀지지 않는 것 정리
어셈블리, 잘 익혀지지 않는 것 정리#
-
문자열 프리미티브 명령
- 보호 모드 프로그램에서, ESI는 자동적으로 DS가 가리키는 세그먼트에서의 오프셋이 되고, EDI는 자동적으로 ES가 가리키는 세그먼트 내의 오프셋이 된다. DS와 ES는 항상 같은 값으로 설정되고, 이를 변경할 수 없다(반면에 실제 주소 모드에서의 ES와 DS는 종종 ASM 프로그래머에 의해서 변경된다)
-
offset과 lea 차이
- offset은 해당 세그먼트 내에서의 오프셋 값을 lea는 effective address(유효주소, 선형주소?? 암튼 그거-_-;;;;;)
- 참고 : http://www.emu8086.com/assembly_language_tutorial_assembler_reference/asm_tutorial_03.html
-
주소지정 방식
-
즉시 주소 지정 방식
-
오퍼랜드 자리에 상수를 사용(명령어에 맞는 크기의 오퍼랜드를 사용해야함)
- mov 'a, %ch // GAS
- mov ch, 'a' // MASM
- mov 0x1234, ax // GAS
- mov ax, 1234h // MASM
-
-
직접 메모리 주소 지정 방식
-
소스 혹은 목적 오퍼랜드에 메모리 주소를 지정하는 32비트 상수를 집어 넣는 것
- 예를 들면 K라는 변수가 8088번지를 가리키고 있을 때 mov al, K 라고 하면 K(8088번지에 있는)가 가지고 있는 데이터 값을 al으로 이동 시킨다.
- movb byteVar, %ch // GAS
- mov ch, byteVar // MASM
- movw wordVar, ax // GAS
- mov ax, wordVar // MASM
-
-
레지스터 간접 주소 지정 방식
-
오퍼랜드의 값(레지스터의 값)이 사용하고자 하는 메모리의 주소
- 레지스터에는 주소가 들어가 있고, 이 주소가 가리키는 곳에 있는 데이터 값을 가지고 오던지 이쪽으로 값을 쓰던지 하는 방식이다.
- mov al, [eax] // MASM
- movb (%eax), %al // GAS
-
-
인덱스 주소 지정 방식
-
32비트 레지스터의 값에 변수의 주소(변위)를 더하여 "유효주소"(최종적으로 나온 주소)를 계산한다.
- 예를 들면 VarName은 1100번지에 있고 EBX에는 8이 있으면 mov al, varName[ebx]은 1108번지(EBX + varName)에 있는 한 바이트를 AL 레지스터로 읽어 들이라는 명령
- mov al, VarName[eax] // MASM
- movb varName(%eax), al // GAS
-
-
스케일 인덱스 주소 지정 방식
-
인덱스 주조 지정 방식과 같으며 2가지 차이점을 보인다
- 레지스터 2개를 합쳐서 변위에 더할 수 있다
- 인덱스 레지스터에 1, 2, 4, 8을 곱할 수 있다.
-
mov eax, varName[ebx + esi * 4] // MASM
- 차이점이 발생하는 곳은 esi * 4
-
-
-
명령어
-
mov dword ptr[ebp - 4], 1
-
1을 ebp-4 위치에 넣으라는 것!
- ebp-4만 하게 되면 mov는 옮기려는 데이터의 크기를 알 수 없으므로 앞에 데이터형을 명시해줘야 한다
-
-
rep stos dword ptr[edi]
- ecx가 0이 될 때까지 eax에 있는 내용을 edi에 dword 크기 만큼 복사(복사할때 마다 edi는 일정하게 증가)
-
shl edx, 1
- 2진수의 곱하기 2 (쉬프트)
-
- 함수 호출시 스택 구조
History
Last edited on 09/10/2008 15:22 by noish
Comments (0)