2014-04-21 11 views
0

다음 어셈블리 코드를 이해하는 데 문제가 있습니다. 이 장면의 배경에 숫자가있는 예를 나에게 줄 수 있다면 좋을 것입니다.어셈블리 sarl 및 idivl 해석

movl $0, %ecx 
movl $0, %eax 
addl $1, %eax 
movl %eax, %edx 
sarl $31, %edx 
idivl $7 
movl %edx, %eax 
movl (%esp, %eax, 4), %eax 
movl %eax, (%esp, %ecx, 4) 
내 결과가 아무 의미가 없기 때문에 나는 SARL 및 idivl를 잘못 해석 할 수있다 생각

..

도와 주셔서 감사합니다 많이! 지금은 3 시간 동안 그 코드 앞에 앉아 있었어요 ^^

나는 생각한다

ECX = 0

EAX = 0

EAX = 0 + 1 = 1

EDX = EAX = 1

지금 현재 시프트 EDX => EDX = 0

E dx : eax는 7로 나눕니 까?

왜 내가 edx = 0을 설정하고 sarl을 꺼낼 수 없습니까? 그게 같지 않니?

+0

알아 낸 내용을 추가하여 질문을 편집하십시오. 또한 디버거를 사용하여 원하는 번호로 단일 단계를 수행 할 수 있습니다. – Jester

+2

'idivl $ 7'? 이것도 조립합니까? – harold

답변

2

edx = 0으로 설정하고 sarl으로 설정하면 안됩니다. 그게 같지 않니?

idiv은 서명 된 부분이 아닙니다. 이 두 가지 지침을 시뮬레이션하는 CDQ 명령은 무엇을 :입니다

movl %eax, %edx 
sarl $31, %edx 

,

는 " SAR는 피연산자 인 경우 빈 비트 피연산자가 양수이면 비어있는 비트 위치를 지우고 설정하여 소스 피연산자의 부호를 보존 부정."

EDX 레지스터의 각 비트 위치에 EAX 레지스터의 더블 워드의 (31 비트)

는 "CDQ 명령 복사 기호. CDQ 명령은 쿼드 워드 배당을 생성하는데 사용될 수있다 더블 워드 분할 전에 더블 워드. " cdq, 그래서 movl + sarlcdq과 정확하게 일치하지 않는 동안 sarl는, 상태 플래그의 일부를 갱신하도록 는

참고. 코드가 단순히 cdq을 사용하지 않는 이유는 분명하지 않습니다.