x86 어셈블리 예제

문자열 명령은 rep 접두사(repe 및 repne 참조)로 수정하여 ecx 시간을 실행(ecx가 자동으로 감소됨)되도록 할 수 있습니다. 예를 들어 rep movsb %esi, %edi는 의미: 예를 들어 배열에 대해 이야기하는 경우 BX는 배열의 시작 부분에 대한 주소를 포함하고 DI는 배열에 인덱스를 포함합니다. 비트 이동 및 회전 명령은 시프트할 값에 대해 32비트 레지스터를 사용하며, 시프트 개수에 대해 고정된 8비트 레지스터 cl을 사용합니다. 예를 들어 shll %cl, %ebx는 ebx = ebx << cl;를 의미합니다. 비교 지침은 범용 레지스터를 변경하지 않고 eflags에 영향을 미칩니다. 예를 들어 cmpl %eax, %ebx는 이름 없는 임시 장소에서 빼서 두 레지스터의 값을 비교하고 결과에 따라 플래그를 설정하므로 eax ebx가 서명되지 않은 모드 또는 서명된 모드에서 ebx인지 여부를 알 수 있습니다. 마찬가지로, testl %eax, %ebx는 임시 장소에서 eax 및 ebx를 계산하고 그에 따라 플래그를 설정합니다. 대부분의 경우 비교 후의 명령은 조건부 점프입니다(나중에 다룹니다). x86 어셈블리 언어에는 원래 x86 플랫폼 설명서에 사용된 인텔 구문과 AT&T 구문이라는 두 가지 주요 구문 지점이 있습니다. [1] 인텔 구문은 MS-DOS와 윈도우 세계에서 지배적이며, 유닉스는 AT&T 벨 연구소에서 만들어졌기 때문에 유닉스 세계에서 AT&T 구문이 지배적이다. [2] 다음은 인텔 구문과 AT&T 구문 간의 주요 차이점에 대한 요약입니다.

예를 들어 32비트 레지스터에 0xDEADBEEF 값이 포함되어 있고 이 레지스터가 주소 10에서 시작하여 메모리에 저장되어야 하는 경우 바이트 값 0xEF는 RAM 주소 10, 주소 11, 주소 12로 0xAD, 마지막으로 주소 13으로 0xDE로 이동합니다. 메모리에서 값을 읽을 때 동일한 규칙이 적용됩니다. 각 x86 어셈블리 명령은 종종 하나 이상의 피연산자와 결합되어 opcode라는 하나 이상의 바이트로 변환되는 기억력으로 표현됩니다. 예를 들어 NOP 명령은 0x90으로 변환되고 HLT 명령은 0xF4로 변환됩니다. 문서화된 기억없이 가능한 opcodes가 있는데, 이는 다른 프로세서가 다르게 해석할 수 있으므로 이를 사용하는 프로그램이 일관되게 행동하거나 일부 프로세서에서 예외를 생성합니다. 이러한 opcodes는 종종 코드를 작고, 빠르고, 더 우아하게 만들거나 저자의 기량을 과시하는 방법으로 코드 작성 대회에서 열립니다. 많은 지침에서 암시적으로 읽거나 쓰는 eflags라는 32 비트 레지스터가 있습니다. 즉, 해당 값은 명령 실행에서 역할을 하지만 레지스터는 어셈블리 코드에 언급 되지 않습니다. 가장 기본적인 x86 산술 명령은 두 개의 32비트 레지스터에서 작동합니다. 첫 번째 심연은 소스 역할을 하며 두 번째 심연은 소스와 대상 역할을 합니다. 예를 들어, addl %ecx, %eax – C 표기형에서, 이것은 의미합니다: eax = eax + ecx;, eax및 ecx는 uint32_t 형식입니다.

많은 지침은 이 중요한 스키마에 맞습니다: 예를 들어: “문자열” 명령의 클래스는 esi 및 edi 레지스터를 메모리 주소로 사용하고 명령 후 자동으로 증분/감소합니다. 예를 들어, movsb %esi, %edi는 *edi = *esi를 의미합니다. esi++; edi++; (1바이트 복사). (실제로 방향 플래그가 0이면 esi 및 edi 증분; 그렇지 않으면 DF가 1인 경우 감소합니다.) 다른 문자열 지침의 예로는 cmpsb, scasb, 스토브가 있습니다.

Share on FacebookPin on PinterestTweet about this on TwitterShare on TumblrShare on Google+Digg this