2016-11-07 3 views
1

현재 어셈블리 언어를 배우고 있으며 현재 작업중인 프로젝트에서 c 파일을 asm 파일로 변환해야합니다. 나는 C 파일에서 for 루프를 구현하려고하는데 특정 변수에 카운터 변수를 저장할 수 있는지 궁금하다. 예를 들어, 카운터가 0에서 시작하면 다음과 같이 할 수 있습니까?특정 주소를 사용하여 x86에 변수를 저장할 수 있습니까?

mov dword [ebp-0x4], 0 
for_loop: 
cmp dword [ebp-0x4], ecx 
jge break 
... 
... 
inc dword [ebp-0x4] 
jmp for_loop 
+0

음, 그렇습니다. 변수를 메모리에 저장할 수 있습니다. 아마도 다른 용도로 사용되지 않는 주소를 사용하고 싶을 것입니다. '예약'과 '커밋'메모리 (또는 유닉스와 동등한 것)에 대한 질문도 있습니다. 하지만 여기서 중요한 질문은 레지스터를 사용하는 대신 메모리에 저장하려는 이유입니다. 보통 카운터는이 작업에 적합한 후보입니다. –

+1

어림짐작으로, 코드를 조합하면 아이디어가 완전히 잘못되었는지 알 수 있습니다. "어셈블 테스트"가 통과하면 디버거로 코드를 단계별로 실행 (보통)하여 질문을 해결합니다. 이 특정 질문에 대해서는 두 테스트 모두 쉽게 통과합니다. 최종 답변을 얻으려면 ISA 설명서 –

+1

을 확인하십시오. 쉽고 빠릅니다. 루프 몸체가 크거나 느리지 만 않으면 5 초의 대기 시간으로 인해 병목 현상이 발생하지 않는 한, 메모리의 루프 변수는 코드를 느리게 만듭니다. (예 : 이미 커다란/느린 루프에서 처음에는 반복 당 6 사이클보다 빠르게 실행되지 않습니다.) –

답변

0

코드가 올바른 것입니다. 그러나 특정 메모리 주소에 액세스하는 것은이 주소 위치에 따라 다릅니다. 이 주소가 프로그램 메모리 공간에 있으면 괜찮을 것이고, 다른 방법으로 세분화 오류가 발생할 것입니다.

x86, 인텔 64 명령어 및 피연산자에 대한 자세한 내용은 Intel® 64 and IA-32 Architectures Developer's Manual을 참조하십시오.

+0

알립니다. 고맙습니다! – Mike

1

CX 레지스터를 사용하여 루프 카운터를 저장할 수 있습니다.

+0

왜'cx'인가? 그는 그가 원하는 모든 레지스터를 사용할 수 있습니다 ('eip'을 제외하고, esp를 범용 레지스터로 사용하는 것은 매우 까다 롭습니다 (어셈블리를 배우는 사람에게는 불가능합니다) ... 또한'cs' 또는'ss'를 사용하면 프로그래머에게 어떤 도전이 ... 사실'cs '는 루프의 모든 단계를 다른 코드 세그먼트로 풀어 버리는 우스 꽝스러운 방법입니다. : D). – Ped7g

+1

음, CX는 루프 카운터로 알려져 있습니다. 그것은 기본적입니다.CX를 사용하는 것은 명명 규칙을 사용하는 것과 같지만 삶을 더 좋게 만듭니다. – FCin

0

을 먼저 합리적인 것으로 설정 한 경우 작동합니다 ([ebp-4]은 카운터 용으로 예약 됨).

그래서 하나 : 당신의 .data 또는 .bss 부문에서

1) 당신은 같은 것을 가지고
counter: dd ?을 당신은 lea ebp,[counter+4]을한다.

2) 또는 함수 시작시 push ebpmov ebp,esp처럼 스택 프레임 포인터 (C 컴파일 된 코드에서 일반적인 용도)로 ebp을 사용합니다.

그런 다음 로컬 ([ebp - something]) 변수의 공간을 예약해야합니다. 일반적으로 mov ebp,esp 다음에 sub esp,<size of local vars>이옵니다.

esp 조정이 없으면 다음 push <something>[ebp-4] 메모리를 덮어 씁니다.

때때로 성능상의 이유로 내부 루프에 사용되는 값을 레지스터에 유지하는 것이 좋습니다. 그러나 레지스터가 부족한 경우 카운터를 루프 만 사용하면 접근 방식이 유효합니다.