2016-11-05 8 views
0

스택의 두 값을 비교하려는 코드에서 을 붙입니다. & AT스택의 두 값을 비교합니까?

86, 구문 T

cmpl -4(%ebp), 4(%ebp) 

Error: too many memory references for `cmp'

나는 승수와 EBP에 따라 두 값을 비교하는 것은 불가능하다고 생각합니다. 어떤 제안?

+3

x86에서는 'CMP'와 같은 간단한 명령어로 두 개의 메모리 피연산자를 사용할 수 없습니다. 그러므로'EAX'에 메모리 값 중 하나를 복사하고'MOV'하고 다른 하나는'EAX'와 비교하십시오. – zx485

+0

'''에 대한 너무 많은 메모리 참조를위한 처음 몇 개의 구글 히트는 모두 답변을 가지고 있습니다. 예 : http://stackoverflow.com/questions/2531682/gas-too-many-memory-reference. 대부분은 cmp가 아닌 mov에 관한 것이지만 MOVS와 CMPS가 모두 존재합니다. Ira의 대답은 CMP가 다른 것을 추가 할 수 있기 때문에 추가하려는 것과 다른 점이라는 것을 잘 알고 있습니다. –

답변

1

CMPSD 명령어를 사용하여 메모리의 두 값을 비교할 수 있습니다.

lea -4(%ebp), %esi 
    lea 4(%ebp), %edi 
    cmpsd 
: 각각 ESI에 대한 관심과 EDI의 메모리 위치의 주소를 배치 한 다음 CMPSD memory-to-memory string-compare instruction를 사용하여 그는 그렇게 할 수

cmpl -4(%ebp), 4(%ebp) 

:

영업 이익에 해당 뭔가를하고 싶어

(내 비 전문가의 AT & T 구문 남용을 용서하십시오.)

실제로 다른 사람과 다를 수 있습니다. 여기에 제공된 다른 답변 (레지스터에 값로드 및 비교)이 훨씬 더 실용적입니다. 그 밖의 것이 없다면, 그 해결책은 오직 하나의 기록 장치만을 태우고,이 핵은 두 가지를 태운다.

수업 : 어셈블러에는 거의 항상 고양이를 피하는 방법이 여러 가지가 있습니다.

+0

@PeterCordes : 편집 해 주셔서 감사합니다. –