2012-09-08 6 views
2

지금 gdb에서 몇 가지 코드를 실행 중입니다.이 두 명령어가 실제로하는 일을 전혀 알지 못합니다. 누구든지 나를 도울 수 있다면 정말 고마워.x86 명령어 의미

add -0x2c(%ebp, %ebx, 4), %eax 
cmp %eax, -0x28(%ebp, %ebx, 4) 
+4

우선, 나는 AT & T 구문을 무시했다. : set disassembly-flavor intel – nneonneo

+0

자세한 내용은 [AT & T syntax tag wiki] (https://stackoverflow.com/tags/att/info)를 참조하기 바란다. 구문에 대한 세부 정보 및 더 많은 문서에 대한 링크 –

답변

5

x86 어셈블리는 보통 AT & T 구문 대신 Intel 구문으로 작성할 때 이해하기가 훨씬 쉽습니다.

인텔 구문에서 그것이 될 것이다 :

첫번째 명령 ( add)
add eax,[ebp+4*ebx-0x2C] 
cmp [ebp+4*ebx-0x28],eax 

eax의 값을 상기 메모리 어드레스 [ebp+4*ebx-0x2C]에 저장된 단어의 값을 더한 eax의 합계를 저장한다.

제 2 명령 (cmp)는 메모리 어드레스 [ebp+4*ebx-0x28]에 저장된 단어의 값으로부터 eax의 값을 감산하여 [ebp+4*ebx-0x28]eax를 비교하고, 그에 따라 플래그 (OF, SF, ZF, AF, PF, CF)을 설정 결과를 어디에도 저장하지 않습니다. cmp은 정확히 sub과 동일하지만 sub의 결과는 cmp에 저장되지 않습니다.

비교 유형은 일반적으로 조건부 점프 형태로 생성됩니다. x86 어셈블리에는 많은 조건부 점프가 있으며 분기 여부는 플래그의 값에 따라 다릅니다.

+0

죄송합니다. <지난 주 내로이 작업을 시작 했으므로 구문의 변경 방법을 알지 못했습니다. 이것은 많은 도움이됩니다. 플래그의 값을 정확히 확인하려면 어떻게해야합니까? – Requiem

+0

[Intel and AT & T syntaxes] (http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm) 'cmp'이후 조건부 점프는 조건이 충족되면 코드의 다른 곳으로 점프합니다. 그렇지 않으면 실행은 다음 명령어 (점프 없음)에서 계속됩니다. 가능한 다른 방법 (플래그를 키로 가지는 해시 테이블)도 있지만 조건부 점프는 모든 경우를 해결합니다. 인텔과 AT & T 구문에서 피연산자의 순서는 인텔의 'dest, src'에서 반대로 AT & T에서는 'src, dest'입니다. 이것은'cmp'에도 영향을 미친다. [Intel x86 jump quick ref.] (http://www.unixwiz.net/techtips/x86-jumps.html)를 참조하십시오. – nrz

1

이것은 AT & T 어셈블리 구문입니다. 그 주소 모드를보고 조금 이상하지만, 의사, 그들은 의미 :

eax = *(ebp + ebx*4 - 0x2c) 

compare eax to *(ebp + ebx*4 - 0x28) 

여기 complete explanation있는 링크입니다.