80x86 어셈블리 언어 기본 사항

오늘 발췌해 보겠습니다.
원본 텍스트는 WeChat 공개 계정: Computer and Network Security에서 가져왔습니다 .

어셈블리 언어는 전자 컴퓨터, 마이크로프로세서, 마이크로컨트롤러 또는 기호 언어라고도 하는 기타 프로그래밍 가능한 장치에 사용되는 저급 언어입니다. 어셈블리 언어에서 니모닉(Mnemonic)은 기계 명령어의 opcode를 대체하는 데 사용되며 주소 기호(Symbols) 또는 레이블(Label)은 명령어 또는 피연산자의 주소를 대체하는 데 사용됩니다. 다른 장치에서 어셈블리 언어는 다른 기계어 명령어 세트에 해당하며 어셈블리 프로세스를 통해 기계어 명령어로 변환됩니다 . 일반적으로 특정 어셈블리 언어와 특정 기계어 명령어 세트 간에는 일대일 대응 관계가 있으며 서로 다른 플랫폼 간에 직접 이식할 수 없습니다.

많은 어셈블러는 프로그램 개발, 어셈블리 제어 및 디버깅 지원을 위한 추가 지원 메커니즘을 제공합니다. 일부 어셈블리 언어 프로그래밍 도구는 종종 매크로를 제공하며 매크로 어셈블러라고도 합니다.

어셈블리 언어는 대부분의 다른 프로그래밍 언어만큼 프로그래밍에 널리 사용되지 않습니다. 오늘날의 실제 응용 프로그램에서는 일반적으로 낮은 수준의 하드웨어 작동 및 수요가 많은 프로그램 최적화 경우에 사용됩니다. 드라이버, 임베디드 운영 체제 및 실시간 프로그램에는 어셈블리 언어가 필요합니다.

0x01 개발 이력

어셈블리 언어를 생산할 때 먼저 기계어에 대해 이야기해야 합니다.

기계어는 기계 명령어의 모음입니다. 기계 명령은 기계가 올바르게 실행할 수 있는 명령입니다. 전자 컴퓨터의 기계 명령어는 이진수의 목록입니다. 컴퓨터는 그것을 일련의 높고 낮은 수준으로 변환하여 컴퓨터의 전자 장치가 작동하도록 구동됩니다.

위에서 언급한 컴퓨터는 기계 명령을 실행하고 작업을 수행할 수 있는 기계를 말합니다. 이것이 초기 컴퓨터의 개념입니다. 우리가 일반적으로 사용하는 PC에는 위에서 언급한 컴퓨터의 기능을 완성하는 칩이 있습니다. 이 칩은 우리가 흔히 CPU(중앙 처리 장치)라고 부르는 것입니다. 각각의 마이크로프로세서는 하드웨어 설계와 내부 구조가 다르기 때문에 작동하려면 서로 다른 레벨 펄스로 제어해야 합니다. 따라서 각 마이크로 프로세서에는 고유한 기계 명령어 집합, 즉 기계어가 있습니다.

초기 프로그래밍은 기계어를 사용했습니다. 프로그래머는 종이테이프나 카드에 0과 1의 숫자로 구성된 프로그램 코드를 펀칭하고 1펀치, 0번펀치를 하지 않고 종이테이프기나 카드기를 통해 프로그램을 컴퓨터에 입력하여 계산한다. 이러한 기계어는 순수한 0과 1로 구성되어 매우 복잡하고 읽기 및 수정이 불편하고 오류가 발생하기 쉽습니다. 프로그래머들은 식별하고 기억하기 어려운 기계어 사용의 문제점을 재빨리 발견하고 산업 전체의 발전에 걸림돌이 되면서 어셈블리 언어가 탄생했습니다.

사진과 글은 관련이 없습니다
어셈블리 언어의 본문은 어셈블리 명령입니다. 조립 지침과 기계 지침의 차이점은 지침이 표시되는 방식에 있습니다. 조립 지침은 기억하기 쉬운 기계 지침에 대한 서면 형식입니다.

1000100111011000	机器指令
mov ax,bx			汇编指令

그 이후로 프로그래머는 어셈블리 명령어를 사용하여 소스 프로그램을 작성했습니다. 그러나 컴퓨터는 기계 명령어만 읽을 수 있는데 어떻게 컴퓨터가 프로그래머가 작성한 프로그램을 어셈블리 명령어로 실행할 수 있습니까? 이때 어셈블리 명령어를 기계어 명령어로 변환할 수 있는 번역 프로그램이 필요하며, 이러한 프로그램을 컴파일러라고 합니다. 프로그래머는 소스 프로그램을 어셈블리 언어로 작성한 다음 어셈블리 컴파일러를 사용하여 기계어로 컴파일하고 최종적으로 컴퓨터에서 실행합니다.

0x02 언어 기능

어셈블리 언어는 프로세서를 직접 지향하는 프로그래밍 언어입니다. 프로세서는 명령어의 제어하에 작동하며 프로세서가 인식할 수 있는 각 명령어를 기계 명령어 라고 합니다 . 각 유형의 프로세서에는 명령어 집합이라고 하는 자체 명령어 집합이 있습니다. 프로세서가 명령을 실행할 때 다른 명령에 따라 다른 조치를 취하고 다른 기능을 완료하므로 자체 내부 작동 상태를 변경할 수 있을 뿐만 아니라 다른 주변 회로의 작동 상태를 제어할 수 있습니다.

어셈블리어의 또 다른 특징은 동작 하는 객체가 특정 데이터가 아니라 레지스터나 메모리라는 점이다. 즉 레지스터와 메모리를 직접적으로 다루기 때문에 어셈블리어 실행 속도가 다른 언어에 비해 빠르지만 프로그래밍을 더 복잡한. 예를 들어 위의 예에서는 고급 언어처럼 데이터를 직접 사용할 수 없지만 먼저 해당 레지스터 AX 및 BX에서 데이터를 꺼냅니다. 이것은 또한 고급 언어에서 작업의 이 부분을 처리하는 것이 컴파일 시스템에 의해 수행되는 반면 어셈블리 언어에서는 프로그래머가 직접 수행하기 때문에 프로그래밍의 복잡성을 증가시켜 프로그래밍의 복잡성을 증가시킵니다.

또한 어셈블리 언어 명령은 일종의 기계 명령의 상징적 표현이며 CPU 유형에 따라 기계 명령 시스템이 다르므로 어셈블리 언어가 다릅니다 . 따라서 어셈블리 언어 프로그램은 기계와 밀접한 관련이 있습니다. 따라서 같은 시리즈의 CPU와 모델이 다른 CPU 간에 어셈블리어 프로그램의 어느 정도 이식성 외에 다른 종류의 CPU(미니컴퓨터, 마이크로컴퓨터 등) 사이의 어셈블리어 프로그램은 이식할 수 없다. 어셈블리 언어 프로그램은 고급 언어 프로그램보다 덜 다양하고 이식성이 있습니다.

0x03 언어 구성

데이터 전송

명령어의 이 부분에는 일반 데이터 전송 명령어 MOV, 조건부 전송 명령어 CMOVcc, 스택 연산 명령어 PUSH/PUSHA/PUSHAD/POP/POPA/POPAD, 교환 명령어 XCHG/XLAT/BSWAP, 주소 또는 세그먼트 설명자 선택기가 포함됩니다. 전송 명령 LEA/LDS /LES/LFS/LGS/LSS 등 CMOVcc는 특정 명령어가 아니라 EFLAGS 레지스터의 특정 비트 상태에 따라 지정된 전송 작업을 수행할지 여부를 결정하는 데 사용되는 많은 명령어를 포함하는 명령어 클러스터입니다.

정수 및 논리 연산

명령어의 이 부분은 더하기 명령어 ADD/ADC, 빼기 명령어 SUB/SBB, 더하기 하나의 명령어 INC, 빼기 하나의 명령어 DEC, 비교 연산 명령어 CMP, 곱하기 명령어 MUL/IMUL 및 나누기를 포함한 산술 및 논리 연산을 수행하는 데 사용됩니다. 명령어 DIV/IDIV, 부호 확장 명령어 CBW/CWDE/CDQE, 소수 조정 명령어 DAA/DAS/AAA/AAS, 논리 연산 명령어 NOT/AND/OR/XOR/TEST 등

교대 지시

명령어의 이 부분은 레지스터 또는 메모리 피연산자를 지정된 횟수만큼 이동하는 데 사용됩니다. 논리 왼쪽 시프트 명령 SHL, 논리 오른쪽 시프트 명령 SHR, 산술 왼쪽 시프트 명령 SAL, 산술 오른쪽 시프트 명령 SAR, 원형 왼쪽 시프트 명령 ROL, 원형 오른쪽 시프트 명령 ROR 등을 포함합니다.

비트 조작 지침

일부 명령에는 비트 테스트 명령 BT, 비트 테스트 및 설정 명령 BTS, 비트 테스트 및 재설정 명령 BTR, 비트 테스트 및 부정 명령 BTC, 비트 순방향 스캔 명령 BSF, 비트 역방향 스캔 명령 BSR 등이 있습니다.

조건 설정 지시

이것은 특정 명령어가 아니라 EFLAGS 레지스터의 일부 비트 상태를 기반으로 8비트 레지스터 또는 메모리 피연산자를 설정하는 데 사용되는 약 30개의 명령어를 포함하는 명령어 클러스터입니다. SETE/SETNE/SETGE 등.

제어 전송 명령

이 부분에는 무조건 전송 명령 JMP, 조건 전송 명령 Jcc/JCXZ, 루프 명령 LOOP/LOOPE/LOOPNE, 프로시저 호출 명령 CALL, 하위 프로시저 반환 명령 RET, 인터럽트 명령 INTn, INT3, INTO, IRET 등이 포함됩니다. Jcc는 EFLAGS 레지스터의 일부 비트 상태에 따라 전송할지 여부를 결정하는 많은 명령을 포함하는 명령 클러스터입니다. INT n은 소프트 인터럽트 명령이고 n은 인터럽트를 나타내는 0에서 255 사이의 숫자일 수 있습니다. 벡터 번호입니다.

예를 들어, INT 13 인터럽트는 디스크 읽기 및 쓰기에 사용됩니다.

문자열 조작

명령어의 이 부분은 문자열 전송 명령어 MOVS, 문자열 비교 명령어 CMPS, 문자열 스캔 명령어 SCANS, 문자열 로드 명령어 LODS 및 문자열 저장 명령어 STOS를 포함한 데이터 문자열을 작동하는 데 사용됩니다. 이러한 명령어는 선택적으로 사용할 수 있습니다. REP/REPE/REPZ/ 접두사 REPNE 및 REPNZ는 연속적으로 작동합니다.

입출력 명령

명령의 이 부분은 포트 입력 명령 IN/INS 및 포트 출력 명령 OUT/OUTS를 포함하여 주변 장치와 데이터를 교환하는 데 사용됩니다.

고급 언어 지원

이 부분은 스택 프레임을 생성하기 위한 ENTER 명령어와 스택 프레임을 해제하기 위한 LEAVE 명령어를 포함하여 고급 언어의 컴파일러에게 편의를 제공합니다.

제어 및 권한 지침

이 부분에는 NOP 명령 NOP, 중지 명령 HLT, 대기 명령 WAIT/MWAIT, 이스케이프 명령 ESC, 버스 블록 명령 LOCK, 메모리 범위 검사 명령 BOUND, 전역 설명자 테이블 작업 명령 LGDT/SGDT, 인터럽트 설명자 테이블 작업 명령 LIDT/SIDT가 포함됩니다. , 로컬 디스크립터 테이블 연산 명령 LLDT/SLDT, 디스크립터 세그먼트 제한값 로드 명령 LSR, 디스크립터 액세스 권한 읽기 명령 LAR, 태스크 레지스터 연산 명령 LTR/STR, 요청 권한 레벨 조정 명령 ARPL, 태스크 전환 플래그 지우기 명령 CLTS, 제어 레지스터 및 디버그 레지스터 데이터 전송 명령 MOV, 캐시 제어 명령 INVD/WBINVD/INVLPG, 모델 종속 레지스터 읽기 및 쓰기 명령 RDMSR/WRMSR, 프로세서 정보 수집 명령 CPUID, 타임스탬프 읽기 명령 RDTSC 외.

부동 소수점 및 멀티미디어 명령

명령어의 이 부분은 부동 소수점 데이터의 작동을 가속화하고 멀티미디어 데이터 처리를 가속화하기 위한 SIMD 및 확장 SSEx(단일 명령어 다중 데이터) 명령어를 사용하는 데 사용됩니다. 이 부분은 명령어 데이터의 용량이 커서 한 번에 나열할 수 없으므로 직접 INTEL 매뉴얼을 참조하시기 바랍니다.

가상 머신 확장

지침의 이 부분에는 INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON 등이 포함됩니다.

추천

출처blog.csdn.net/weixin_43466027/article/details/117430012