2EA10301
및 BB0400
숫자는 강조 표시된 두 명령어에 대한 opcodes입니다.
2E
는 Code Segment (CS) prefix이고 CS
세그먼트 대신 기본 DS
하나와 메모리에 액세스하도록 CPU에 지시한다.
A1
은 MOV AX, moffs16
의 연산 코드이며 0301
은 의 즉시 0103h이며 읽을 주소입니다.
따라서 2EA10301
은 mov ax, cs:[103h]
입니다.
대괄호는 memory access through one the addressing mode을 나타내는 데 선호되는 방법이지만 일부 어셈블러는 대괄호없이 혼동하는 구문을 지원합니다.
이 구문은 서로 다른 어셈블러에서 모호하고 덜 표준화되어 있으므로 권장하지 않습니다.
어셈블하는 동안 어셈블러는 방출 된 각 바이트에 대해 위치 카운터를 증가시킵니다 (각 "섹션"/ 세그먼트에는 고유 한 카운터가 있습니다. 즉 카운터는 각 "섹션"의 시작 부분에서 재설정됩니다).
이것은 각 변수에 액세스하기 위해 오프셋에 액세스하고 명령을 조작하는 데 사용되는 오프셋을 제공하며, 변수 이름은 사람을위한 것이며, CPU는 주소, 숫자에서만 읽을 수 있습니다.
이 오프셋은 나중에 파일이로드되면 나중에 메모리와 주소가됩니다.
어셈블러, 링커 및 로더가 협력하여 there are various tricks at play을 최종 명령이 메모리에 올바르게 형성되고 오프셋이 올바른 주소로 변환되는지 확인합니다.
귀하의 예에서 그들의 노력은 값 103h, 즉 메모리에 a
의 주소로 최고조에 달합니다.
다시 말하지만, 여러분의 예제에서, 파일이 COM이라면 (오프셋은 실행 흐름에 변수를 두지 않음), COM 파일의 독특한 구조로 인해 여전히 103h입니다.
하지만 일반적으로 다른 숫자 일 수 있습니다.
BB
은 BX
인 MOV r16, imm16
입니다. 기본 형식은 B8
이고 하위 3 비트는 사용할 레지스터를 나타내며 BX
은 값 3 (이진수는 011b)이며 실제로 0B8h + 3 = 0BBh로 표시됩니다.
op 코드 뒤에도 little endian으로 4를 인코딩하는 WORD 즉치 0400
이 다시 나타납니다.
는 이제 조립이 문법 설탕의 형태를 구현할 어셈블리 소스가 항상 완벽하게 정보 아니라고 실현하는 위치에 있습니다.
ax
에 a
의 어드레스에 의해 지정된 일정 조립시 알려진 즉시 값, 이동되는 기술적 구문에 mov bx, 4
동일하거나 명령 mov ax, a
, 대신 움직여 콘텐츠로 해석이 a
이고, 값이 ax
인 메모리에 있고 읽을 수있는 값은 a
이 변수로 알려져 있기 때문입니다.
이 현상은 x86에서 제한적이며 CISC이며 일반적으로 필요한 명령어가 부족한 경우 pseudo-instructions으로 보완되는 RISC 세계에서 더 널리 퍼집니다.
먼저 "** 2 ** EA10301"이고 16 진수입니다. – Carcigenicate