2017-04-08 8 views
0

저는 어셈블러를 배우기 때문에 디버거, 특히 표시된 부분의 코드를 이해하는 데 도움이 필요합니다.8086 어셈블러 디버거 이해

mov  ax, a 
mov  bx, 4 

나는 어떻게 작동하는지 위의 지침 알고 있지만 디버거에서 나는 "2EA10301"와 "BB0400"가.

무엇을 의미합니까?
첫 번째 명령은 변수 a를 데이터 세그먼트에서 ax 레지스터로 이동하지만 디버거에는 cs:[0103]이 있습니다.

이러한 대괄호와 숫자는 무엇을 의미합니까? 어떤 도움

enter image description here

감사합니다.

+0

먼저 "** 2 ** EA10301"이고 16 진수입니다. – Carcigenicate

답변

5

2EA10301BB0400 숫자는 강조 표시된 두 명령어에 대한 opcodes입니다.

2ECode Segment (CS) prefix이고 CS 세그먼트 대신 기본 DS 하나와 메모리에 액세스하도록 CPU에 지시한다.
A1MOV AX, moffs16의 연산 코드이며 0301은 의 즉시 0103h이며 읽을 주소입니다.
따라서 2EA10301mov ax, cs:[103h]입니다.
대괄호는 memory access through one the addressing mode을 나타내는 데 선호되는 방법이지만 일부 어셈블러는 대괄호없이 혼동하는 구문을 지원합니다.
이 구문은 서로 다른 어셈블러에서 모호하고 덜 표준화되어 있으므로 권장하지 않습니다.

어셈블하는 동안 어셈블러는 방출 된 각 바이트에 대해 위치 카운터를 증가시킵니다 (각 "섹션"/ 세그먼트에는 고유 한 카운터가 있습니다. 즉 카운터는 각 "섹션"의 시작 부분에서 재설정됩니다).
이것은 각 변수에 액세스하기 위해 오프셋에 액세스하고 명령을 조작하는 데 사용되는 오프셋을 제공하며, 변수 이름은 사람을위한 것이며, CPU는 주소, 숫자에서만 읽을 수 있습니다.

이 오프셋은 나중에 파일이로드되면 나중에 메모리와 주소가됩니다.
어셈블러, 링커 및 로더가 협력하여 there are various tricks at play을 최종 명령이 메모리에 올바르게 형성되고 오프셋이 올바른 주소로 변환되는지 확인합니다.
귀하의 예에서 그들의 노력은 값 103h, 즉 메모리에 a의 주소로 최고조에 달합니다.
다시 말하지만, 여러분의 예제에서, 파일이 COM이라면 (오프셋은 실행 흐름에 변수를 두지 않음), COM 파일의 독특한 구조로 인해 여전히 103h입니다.
하지만 일반적으로 다른 숫자 일 수 있습니다.

BBBXMOV r16, imm16입니다. 기본 형식은 B8이고 하위 3 비트는 사용할 레지스터를 나타내며 BX은 값 3 (이진수는 011b)이며 실제로 0B8h + 3 = 0BBh로 표시됩니다.
op 코드 뒤에도 little endian으로 4를 인코딩하는 WORD 즉치 0400이 다시 나타납니다.


는 이제 조립이 문법 설탕의 형태를 구현할 어셈블리 소스가 항상 완벽하게 정보 아니라고 실현하는 위치에 있습니다.
axa의 어드레스에 의해 지정된 일정 조립시 알려진 즉시 값, 이동되는 기술적 구문에 mov bx, 4 동일하거나 명령 mov ax, a, 대신 움직여 콘텐츠로 해석a이고, 값이 ax 인 메모리에 있고 읽을 수있는 값은 a이 변수로 알려져 있기 때문입니다.

이 현상은 x86에서 제한적이며 CISC이며 일반적으로 필요한 명령어가 부족한 경우 pseudo-instructions으로 보완되는 RISC 세계에서 더 널리 퍼집니다.

2

글쎄, 우선, 어셈블러는 x86 어셈블리입니다. 어셈블러는 명령을 기계 코드로 변환합니다.

프로그램을 분해 할 때, 아마도 90을 NOP 명령이나 B8과 같이 16 진수 값을 사용하여 무언가를 AX로 옮깁니다.

대괄호는 레지스터가 가리키는 메모리 주소를 복사합니다. 측면에있는 16 진수를 주소라고합니다.