2017-02-09 1 views
0

나는 2 시간의 인터넷 검색을 보냈지 만 아무 소용이 없었습니다. - 초보자를위한 가이드가 많지 않았고, 지금 당장 취하고있는 과정은 어떤 것을 설명하는 데 아주 능숙하지 않습니다.

어쨌든; 나는 SSE와 함께 일하려고 애 썼고 명령어를 사용하여 두 개의 double을 비교해 보았습니다. 나는 정수가 아닌 상수는 방법 하드 코드를 이해하는 데 많은 시간을 보냈다 (의는 example를 호출하자, 그것은

example: 
    .long 3794832442 
    .long 1044740494 

로 선언); 하지만 그 작업을 마친 후에는 "피연산자 유형 불일치"가 작동하지 않습니다. 나는 C-to-assembly 변환기로 돌아 왔고 comisd $example, %xmm0 대신 comisd example(%rip), %xmm0을 사용했는데 작동하는 것으로 나타났습니다. 이제 이해가 안됩니다. 어떻게 작동하며 어떻게 다릅니 까?

+2

'$'는 즉각적으로 작동하지 않습니다. comisd example, % xmm0'이 효과가있었습니다. – Jester

+0

이론적으로'example equ ((1044740494 << 32) +3794832442)'는'$ example'에 대해서는 올바른 것이지만'imm64' 인수를 취하는'comisd' 명령은 없으며'xmm/m64' 만 유효합니다. 정의가 정확하다 (메모리에 저장된 값과 심볼'example'은 주소를 가리키는 레이블이다). 명령어의 사용법을 고쳐야한다. – Ped7g

답변

1

$example은 단순히 변수의 절대 주소입니다. 메모리 액세스를 의미하지는 않습니다.

comisd은 즉각적인 피연산자를 지원하지 않으므로 "피연산자 형식이 일치하지 않습니다."가 표시됩니다. comisd example, %xmm0 ($ 제외)은 메모리 참조이므로 작동했을 것입니다.

example(%rip)은 절대 주소를 사용하는 대신 현재 명령어 포인터의 오프셋을 사용하기 때문에 코드 위치 독립적 인 x86-64에 도입 된 PC 상대 주소 지정 모드를 사용하고 있습니다.


조나단 라인 하트의 답변에 따라.