ESI 및 EDI 레지스터의 목적은 무엇입니까?
어셈블러에서 EDI 및 ESI 레지스터의 실제 목적과 사용은 무엇입니까?
나는 그들이 하나의 문자열 연산에 사용된다는 것을 알고 있습니다.
누군가가 예를 들어 줄 수 있습니까?
DI / SI (또는 1985 년에 ASM을 배우지 않은 경우 확장 된 대응) 로만 수행 할 수있는 작업이 몇 가지 있습니다 . 이 중
REP STOSB
REP MOVSB
REP SCASB
각각 반복, 저장, 로딩 및 스캐닝을위한 동작이다. 당신이하는 일은 SI 또는 DI를 하나 또는 두 피연산자를 가리 키도록 설정하고 CX에 카운트를 넣은 다음 찢어 버리는 것입니다. 이것은 한 번에 많은 바이트에서 작동하는 작업이며 CPU를 자동으로 넣습니다. 루프를 명시 적으로 코딩하지 않기 때문에 수동 코딩 루프보다 효율적으로 작업을 수행합니다.
궁금한 점이있는 경우 : 작업 설정 방법에 따라 반복 된 저장은 값 0을 큰 연속 메모리 블록에 펀칭하는 것과 같은 간단한 것일 수 있습니다. MOVSB는 하나의 버퍼 (모든 바이트)에서 다른 버퍼로 데이터를 복사하는 데 사용됩니다. SCASB는 일부 검색 기준과 일치하는 바이트를 찾는 데 사용됩니다 (동일성 만 검색하는지 또는 무엇을 찾을 수 있는지 확실하지 않습니다 :)
그것이 그 정규직의 대부분입니다.
SI
= 소스 인덱스
DI
= 대상 인덱스
다른 사람들이 지적했듯이 문자열 지침과 함께 특별한 용도로 사용됩니다. 리얼 모드 프로그래밍의 경우, ES
세그먼트 레지스터와 함께 사용되어야 DI
하고 DS
와 SI
같이
movsb es:di, ds:si
SI 및 DI는 범용 인덱스 레지스터로도 사용할 수 있습니다. 예를 들어, C
소스 코드
srcp [srcidx++] = argv [j];
컴파일
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
여기에 ebp+12
contains argv
, ebx
is j
및 edi
has가 srcidx
있습니다. 세 번째 명령어는 edi
4로 곱한 값을 사용 ebp
하고 0x54 (의 위치 srcp
) 만큼 오프셋을 추가합니다 . 주소 주위의 괄호는 간접을 나타냅니다.
나는 그것을보고 위치를 기억하지만, 수는 없지만 이 확인한다 대부분의 그것의, 그리고 이 (슬라이드 17) 기타 :
AX
= 누산기
DX
= 더블 워드 누산기
CX
= 카운터
BX
= 기본 레지스터
그것들은 범용 레지스터처럼 보이지만, (예기치 않습니까?) 그들 중 하나를 사용하지만 암묵적으로 많은 명령이 있습니다.
ESI가 가리키는 메모리에서 EDI가 가리키는 메모리로 데이터를 효율적으로 복사하는 MOVSB 및 MOVSW와 같은 Opcode. 그러므로,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
다른 답변에서 언급 한 문자열 작업 (MOVS / INS / STOS / CMPS / SCASB / W / D / Q 등) 외에도 암시 적으로 사용하는 "현대적인"x86 어셈블리 명령이 더 필요하다고 덧붙였습니다. 최소 EDI / RDI :
SSE2 MASKMOVDQU
(및 예정된 AVX VMASKMOVDQU
) 명령어는 XMM 레지스터에서 EDI / RDI가 가리키는 메모리에 바이트를 선택적으로 기록합니다.
In addition to the registers being used for mass operations, they are useful for their property of being preserved through a function call (call-preserved) in 32-bit calling convention. The ESI, EDI, EBX, EBP, ESP are call-preserved whereas EAX, ECX and EDX are not call-preserved. Call-preserved registers are respected by C library function and their values persist through the C library function calls.
Jeff Duntemann in his assembly language book has an example assembly code for printing the command line arguments. The code uses esi and edi to store counters as they will be unchanged by the C library function printf. For other registers like eax, ecx, edx, there is no guarantee of them not being used by the C library functions.
https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
See section 12.8 How C sees Command-Line Arguments.
Note that 64-bit calling conventions are different from 32-bit calling conventions, and I am not sure if these registers are call-preserved or not.
참고URL : https://stackoverflow.com/questions/1856320/purpose-of-esi-edi-registers
'program story' 카테고리의 다른 글
목록의 가능한 모든 순열을 생성하는 알고리즘? (0) | 2020.07.25 |
---|---|
Pandas의 부울 색인 생성을위한 논리 연산자 (0) | 2020.07.25 |
"정적"과 "정적 인라인"기능의 차이점은 무엇입니까? (0) | 2020.07.25 |
.NET의 XmlDocument 출력에서 빈 xmlns 속성을 방지하는 방법은 무엇입니까? (0) | 2020.07.25 |
C #은 Java의 charAt ()에 해당합니까? (0) | 2020.07.25 |